使用Scrapy爬取链家二手房信息

项目地址:https://gitlab.com/louisvv/second-hand.housing.transaction

目录

必要条件:

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下<a>标签,将链接为第一层链接


第二级页面:

根据第一层链接跳转到第二级页面-小区基本信息页面

先爬取小区地址在detailDesc div下


接下来爬取小区基本信息,在xiaoquInfo div下


每条数据对应一个xiaoquInfoItem div,是一个list,先取第一个xiaoquInfoItem,找到对应xiaoquInfoLabel、xiaoquInfoContent span标签,爬取该条数据

注意:遍历xiaoquInfoItem list只能爬到第一条数据,这里我选择了一个笨但好用的办法,第一个xiaoquInfoItem正常爬取,其余的XPath直接在网页上复制XPath地址进行爬取


爬取了小区基本信息后,找到该小区在售二手房链接,在goodSell div下<a>标签,作为第二级链接


注意:小区在售二手房可能会有很多,所以会有多个分页

这里又使用了一个笨方法,爬取最多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一下哦~

还可以赞助我哦~感谢您的支持!!

赫墨拉

我是一个喜爱大数据的小菜鸡,这里是我分享我的成长和经历的博客

发表评论

电子邮件地址不会被公开。