赞
踩
之前对大数据颇感兴趣,在学习了一个月的相关原理和应用后,感觉自己需要动手一个实战项目来巩固之前学到的东西,加之很早之前就接触过一些爬虫知识,因此利用手上现有的资源(一台笔记本电脑)来搭建一个关于房屋租赁的简单的基于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被封也可以通过输入验证码来解封,并不影响接下来一段时间的爬取。
待爬信息有:出租房屋所在省、市、区,起步价格,房屋面积,适宜居住的人数,出租标题信息,详细地址,如下图所示。
''' @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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。