赞
踩
目录
必要条件:
1.Python 2.7 / Python 2.7以上
2. 安装Scarpy 、MySQLdb
3. Mysql数据库
项目说明:
本项目基于Python Scrapy爬虫框架对lianjia房产交易网站二手房小区、小区在售房屋数据进行爬取。
数据爬取为三级页面递归爬取,整个爬取流程如下:
1. 搜索小区名,在结果页面中找到小区名,小区名的超链接为第一层链接
2. 根据第一层链接,进入小区描述页面,爬取小区基本信息
3. 爬取基本信息后,在页面中寻找小区在售二手房链接地址,作为第二层链接
4. 根据第二层链接,进入小区在售二手房页面,对在售二手房信息进行爬取
5. 保存数据:将爬取的数据按照指定输出顺序、分隔符保存到CSV文件中
6. 数据导入:对爬取到的数据文件进行解析,将数据保存到Mysql数据库中
网页分析:
流程说完了,分析一下网页:
第一级页面:每个小区对应一个listContent,小区超链接在title div下标签,将链接为第一层链接
第二级页面:
根据第一层链接跳转到第二级页面-小区基本信息页面
先爬取小区地址在detailDesc div下
接下来爬取小区基本信息,在xiaoquInfo div下
每条数据对应一个xiaoquInfoItem div,是一个list,先取第一个xiaoquInfoItem,找到对应xiaoquInfoLabel、xiaoquInfoContentspan标签,爬取该条数据
注意:遍历xiaoquInfoItem list只能爬到第一条数据,这里我选择了一个笨但好用的办法,第一个xiaoquInfoItem正常爬取,其余的XPath直接在网页上复制XPath地址进行爬取
爬取了小区基本信息后,找到该小区在售二手房链接,在goodSell div下标签,作为第二级链接
注意:小区在售二手房可能会有很多,所以会有多个分页
这里又使用了一个笨方法,爬取最多5个分页,然后将这些分页url添加到第二级链接
# 点击链接,查看小区全部在售二手房
for href in response.xpath('//*[@id="goodSell"]/div/a/@href'):
for i in range(1, 6):
url = response.urljoin(href.extract())
url1=url+"pg"+format(i)
yield scrapy.Request(url1, meta={'item': item}, callback=self.parse_house)
第三级页面:
根据传入的第二级链接地址,跳转到第三级页面,对小区在售二手房数据进行爬取
页面所有房屋信息在sellListContext ul标签下,ul标签是爬取的起始点
每套房子的信息是在clear li标签下,爬取房屋信息对应的div数据
代码如下:
# 获取小区地址
item['region'] = house.xpath('.//div[@class="houseInfo"]/a/text()').extract()
# 获取房屋信息
item['houseinfo'] = house.xpath('.//div[@class="houseInfo"]/text()').extract()
# 获取层数
item['flood'] = house.xpath('.//div[@class="positionInfo"]/text()').extract()
# 获取房屋总价格
item['price'] = house.xpath('.//div[@class="totalPrice"]/span/text()').extract()
# 获取房屋每平米价格
item['unitprice'] = house.xpath('.//div[@class="unitPrice"]/span/text()').extract()
# 获取关注人数
item['follow'] = house.xpath('.//div[@class="followInfo"]/text()').extract()
# 获取图片链接
item['img'] = house.xpath('.//a[@class="img "]/@href').extract()
# 获取house code id
item['housecode'] = house.xpath('.//a[@class="img "]/@data-housecode').extract()
数据保存:
剩下的就是在spider函数中通过selector把所要的信息拿出来,保存到CSV文件中
数据文件内容如下:
说一下数据导出的格式(均可自定义)
分隔符: ^
字段: 房屋信息,房屋id(主键),图片地址,楼层,关注/带看,小区,单价,挂盘价,小区地址,小区均价,均价描述,建楼时间,楼型,物业费用, 物业,楼栋数,房屋总数,开发商
注意:这里使用了固定的导出顺序,对格式进行控制,方便对数据进行解析
导出顺序配置请查看settings.py、spider/csv_item_exporter.py文件
数据导入:
执行数据解析程序,将数据导入到Mysql,这里没有使用scrapy自带的pipeline
导入数据前,先创建对应的表,有两张表,小区信息表:xiaoqu_info 在售房屋表:house_info
xiaoqu_info表结构如下:
xiaoquUnitPriceDesc为主键,主键格式如下:小区-年分-月份参考价 例如:星海人家-2018-1月参考均价
date为爬取日期
其余字段不多赘述
house_info表结构如下:
id为主键,即housecode码,作为唯一标识
web字段为图片地址,unitprice为每平米单价,price为挂牌价,date为爬取日期
其余字段不多赘述
创建好表后,执行数据解析程序,对爬取的数据进行解析
流程如下:
1.对house_info的字段数据进行解析,将解析的数据放入元组,然后执行sql插入语句将元组数据插入house_info表
2.对xiaoqu_info的字段数据进行解析,将解析的数据放入元组,然后执行sql插入语句将元组数据插入xiaoqu_info表
具体的数据解析文件请看项目中data.py文件,注意:需要修改mysql数据库连接信息
导入后的xiaoqu_info样例数据如下:
导入后的house_info样例数据如下:
至此,数据导入完毕,怎么玩数据就看你的了
用法:
整个项目由脚本控制运行,定时执行
1.安装Scarpy
pip install Scrapy
2.安装MySQLdb
pip install MySQLdb
如果你是python 3.x,则安装PyMySQL
pip install PyMySQL
3.从Gitlab下载此项目
4.执行sql文件init.sql,初始化数据库,创建表
5.修改/lianjia/lianjia/data.py 数据解析程序,修改mysql配置
6.修改/lianjia/lianjia/house_spider.py 数据爬取程序
修改:start_urls 网页地址,不同地区前缀不同
修改:xiaoqu ,小区名
注:start_urls、xiaoqu可多个
7.修改执行脚本/lianjia/lianjia/lj.sh:(如需在windows上运行脚本,请自行查阅)
修改spider_dir目录,目录为此项目存放的地址
修改data_dir数据存放地址
#项目spider目录地址
spider_dir=/data/lianjia/lianjia/spiders/
#爬取数据存放目录地址
data_dir=/data/lianjia/lianjia/spiders/data
cd $spider_dir
rm -rf $data_dir/$(date +%Y-%m-%d).csv
#执行爬取数据程序,将数据文件保存到data_dir下,文件名为 年-月-日.csv
scrapy runspider /data/lianjia/lianjia/spiders/house_spider.py -o $data_dir/$(date +%Y-%m-%d).csv
#执行数据解析程序,传入参数为当日爬取数据文件地址 python /data/lianjia/lianjia/data.py $data_dir/$(date +%Y-%m-%d).csv
8.赋予脚本可执行权限:
chmod +x ./lj.sh
9.创建定时任务,根据实际情况修改
crontab -e
00 19 * * * sh /lj.sh
效果图:
补充:
1.直接爬取会被禁止,因为有robot.txt限制,修改配置文件ROBOTSTXT_OBEY = False,不遵循robot规则,即可爬取数据
2.链家网站有防爬虫,设置了REQUEST_HEADERS,USER_AGENTS代理等,模拟浏览器
3.可对爬取时间间隔进行调整,避免短时间高并发请求,地址被网站BAN
如果我的项目对您有帮助,请您一定要Star一下哦~
还可以赞助我哦~感谢您的支持!!
3+
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。