当前位置:   article > 正文

自己动手搭建一个简单的基于Hadoop的离线分析系统之一——网络爬虫_爬虫 推荐系统 python hadoop

爬虫 推荐系统 python hadoop

自己动手搭建一个简单的基于Hadoop的离线分析系统之一——网络爬虫

之前对大数据颇感兴趣,在学习了一个月的相关原理和应用后,感觉自己需要动手一个实战项目来巩固之前学到的东西,加之很早之前就接触过一些爬虫知识,因此利用手上现有的资源(一台笔记本电脑)来搭建一个关于房屋租赁的简单的基于Hadoop的离线分析系统,其中包含了爬虫、HDFS、MapReduce、MySQL以及hive的简单应用。
由于手上硬件资源着实有限,该系统是实际应用系统的超级简化版,旨在对大数据的一部分相关知识综合起来做一个简单应用,请大神勿喷!

项目整体框架

一、基本环境

  为了避免后面出现各种环境问题,这里首先给出我的基本环境配置信息:
1. Windows
  a. Window10 64位操作系统
  b. Python3.7
  c. jdk1.7.0_80
  d. maven3.6.0
  e. VMware Workstation 14 Pro
  f. SecureCRT 8.0
2. Linux
  a. Centos7 64位
  b. Python3.6.5
  c. jdk1.7.0_80
  d. Hadoop2.6.5
  e. hive1.2.1
  f. MySQL5.7.24

二、待爬信息

  我选择的房屋租赁信息网站是小猪短租,该网站没有使用大量的JS渲染以及异步加载方式等反爬取手段,即使IP被封也可以通过输入验证码来解封,并不影响接下来一段时间的爬取。
  待爬信息有:出租房屋所在省、市、区,起步价格,房屋面积,适宜居住的人数,出租标题信息,详细地址,如下图所示。

三、爬虫代码(For Windows)

'''
@author: Ἥλιος
@CSDN:https://blog.csdn.net/qq_40793975/article/details/82734297
Platform:Windows Python3
'''
print(__doc__)

from bs4 import BeautifulSoup
import requests
import re
import time
import random
import sys
import getopt

url = 'http://sh.xiaozhu.com/'
proxies = {
   "http": "123.114.202.119:8118"}  # 代理IP
header = {
   
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0'
}   # 消息头
MunicList = ['sh', 'tj', 'cq', 'bj']    # 直辖市列表


def get_page_links(url=None, page_links=None, label=0):
    """
    爬取某个网页上的全部房屋租赁链接
    :param url: 网页链接
    :param page_links: 全部房屋租赁链接
    :param label: 标志位,该网页是第一页为1,否则为1
    :return: 状态码,0爬取成功,1IP被封导致爬取失败,2爬取成功且当前网页为最后一页
    """
    sec = (random.random() + 0) * 10
    time.sleep(sec)  # 请求延时

    wb_data = requests.get(url, headers=header)

    if wb_data.status_code == 202:  # 页面响应状态202,IP被封
        print("IP blocked")
        return 1

    soup = BeautifulSoup(wb_data.text, 'lxml')

    links = soup.select('.pic_list > li > a:nth-of-type(1)')

    for link in links:
        page_link = link.get('href')
        page_links.append(page_link)

    info = soup.select('a.font_st')
    if len(info) <= 1 and label == 0:  # 判断当前页是不是最后一页,不检查第一页
        print("Last page")
        return 2

    return 0


def detail2adress(str=None):
    """
    使用正则表达式提取详细地址(非直辖市)中的省或行政区、市或自治区、区或县
    :param str: 详细地址
    :return: 省或行政区、市或自治区、区或县组成的列表
    """
    result_default = [None, None, None]
    if str is None:
        return result_default
    result = re.search('(?P<province>[^省]+省|[^行政区]+行政区)(?P<city>[^市]+市|[^自治区]+自治区)(?P<county>[^县]+县|[^区]+区)', str)
    if result is None:
        return result_default
    return list(result.groups())


def detail2adress_Munic(str=None):
    """
    使用正则表达式提取详细地址(直辖市)中的省或行政区、市或自治区、区或县
    :param str: 详细地址
    :return: 省或行政区、市或自治区、区或县组成的列表
    """
    result_default = [None, None, None]
    if str is None:
        return result_default
    result = re.search('(?P<city>[^市]+市)(?P<county>[^区]+区)', str)
    if result is None:
        return result_default
    result = list(result.groups())
    result_default[0] = result[0]
    result_default[1:3] = result[:]
    return result_default


def get_rental_information(url=None, Munic=0):
    """
    根据链接爬取某个房屋租赁信息
    :param url: 待爬取房屋租赁信息的链接
    :param Munic: 标志位,1是直辖市,否则为0
    :return: 房屋租赁信息
    """
    sec = (random.random() + 0) * 10
    time.sleep(sec)  # 请求延时

    wb_data = requests.get(url, headers=header)
    if wb_data.status_code == 202:
        print("IP blocked")
        return 1
    soup = BeautifulSoup(wb_data
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/842953
推荐阅读
相关标签
  

闽ICP备14008679号