一种有想做个爬虫的想法,正好上个月有足够的时间和精力就学了下scrapy,一个python开源爬虫框架。好多事开始以为很难,但真正下定决心去做的时候,才发现非常简单,scrapy我从0基础到写出第一个可用的爬虫只用了两天时间,从官网实例到我的demo,真是遇到一堆问题,通过查docs查博客,一个个问题解决下来,发现已经渐渐熟知了这个框架,真是发现带着问题去学习才是快的学习方式。
  大学的时候有用python写过爬虫,但没用什么框架,用urllib把网页源码down下来后,写一堆正则表达式来提取其中的内容,真是快吐了。所以我一直觉得爬虫网页内容解析才是最麻烦的地方,scrapy提供xpath的方式提取网页内容,大大简化了爬虫的开发。另外,我们自己实现爬虫还要去管理所有的爬取动作,你爬取完这页,你还得去触发下一页,为了防止被ban,你还要构造header头,设置爬取规则…… scrapy简化了这一切,你只需要告诉它你要爬什么,要哪些数据,数据怎么保存即可。你只需要专注于爬取结果就好了,剩下的写middleware、pipline、item…… 简单的爬虫甚至不需要这些。
  我用scrapy实现了一个爬取链家二手房的爬虫,全部源码我已经放到github上了https://github.com/xindoo/ershoufang。我需要声明的是这只是个简答的demo,存在一些问题,接下来我先说明有哪些问题,再来看看核心代码。

问题一

链家网站也有反爬虫策略和robots限制,robots限制忽略(不然没法爬),另外频繁爬取会直接导致被ban,需要隔天才会解禁止。防止被ban的方法有多种,1.禁止cookie 2.设置header 3.加大爬取间隔 4.使用代理。我只用了前三种方法,具体可以在settings.py 和middlewares.py里看到。因为没有免费好用的代理,所以在爬虫实际使用中没用方法4,但我在middlewares.py里也留下了相关代码,可稍做参考,但需要注意那几个代理ip是不可用的。

问题二

我代码里只爬取了3000套二手房价格,北京市实际在售的二手房大概有两万套,不是我不想全爬,只是链家只展示100页(3000套)的内容,排序方式我也并不清楚。我尝试通过分区域来爬取以获得更多的数据,但爬虫更容易被ban,大概爬几页后就被禁了,目前看来只能通过使用代理的方式解决。

问题三

我的爬取起始页是http://bj.lianjia.com/ershoufang/pg1/,一直爬取到100页, 我在代码里注释掉的 start_urls包含了北京市所有的区,如果不被ban,理论上是可以拿到北京市所有的二手房信息的。爬取的数据有如下。

‘region’: 小区
‘url’: 房屋详情页链接
‘houseInfo’: 房屋信息 类似| 3室2厅 | 126.4平米 | 南 北 | 精装 | 有电梯
‘unitPrice’: 每平米单价(元)
‘totalPrice’: 房屋总结(万元)
‘attention’: 被关注数
‘visited’: 被经纪人带看次数
‘publishday’: 房屋发布多长时间

下面是爬虫核心代码,全部代码可以上我github获取。

# -*- coding: utf-8 -*-
import scrapy
import reclass ershoufangSpider(scrapy.Spider):name = "ershoufang"#下面是北京市所有区的起始url# start_urls = ["http://bj.lianjia.com/ershoufang/dongcheng/pg1", "http://bj.lianjia.com/ershoufang/xicheng/pg1", "http://bj.lianjia.com/ershoufang/chaoyang/pg1", "http://bj.lianjia.com/ershoufang/haidian/pg1", "http://bj.lianjia.com/ershoufang/fengtai/pg1", "http://bj.lianjia.com/ershoufang/shijingshan/pg1", "http://bj.lianjia.com/ershoufang/tongzhou/pg1", "http://bj.lianjia.com/ershoufang/changping/pg1", "http://bj.lianjia.com/ershoufang/daxing/pg1", "http://bj.lianjia.com/ershoufang/yizhuangkaifaqu/pg1", "http://bj.lianjia.com/ershoufang/shunyi/pg1", "http://bj.lianjia.com/ershoufang/fangshan/pg1", "http://bj.lianjia.com/ershoufang/mentougou/pg1", "http://bj.lianjia.com/ershoufang/pinggu/pg1", "http://bj.lianjia.com/ershoufang/huairou/pg1", "http://bj.lianjia.com/ershoufang/miyun/pg1", "http://bj.lianjia.com/ershoufang/yanqing/pg1", "http://bj.lianjia.com/ershoufang/yanjiao/pg1"]#实际爬取过程中我只用了默认的起始url,不容易被banstart_urls = ["http://bj.lianjia.com/ershoufang/pg1"]def parse(self, response):houses = response.xpath(".//ul[@class='sellListContent']/li")for house in houses:attention = ''visited = ''publishday = ''try:attention = house.xpath(".//div[@class='followInfo']/text()").re("\d+")[0]visited = house.xpath(".//div[@class='followInfo']/text()").re("\d+")[1]#因为发布日期中可能单位不是天,所以我做了简单的转化。if u'月' in house.xpath(".//div[@class='followInfo']/text()").extract()[0].split('/')[2]:number = house.xpath(".//div[@class='followInfo']/text()").re("\d+")[2]publishday = '' + int(number)*30elif u'年' in house.xpath(".//div[@class='followInfo']/text()").extract()[0].split('/')[2]:number = house.xpath(".//div[@class='followInfo']/text()").re("\d+")[2]publishday = '365'else:publishday = house.xpath(".//div[@class='followInfo']/text()").re("\d+")[2]except:print "These are some ecxeptions"else:passyield {'region': house.xpath(".//div[@class='houseInfo']/a/text()").extract(),'url':house.xpath(".//a[@class='img ']/@href").extract(),'houseInfo':house.xpath(".//div[@class='houseInfo']/text()").extract(),'unitPrice':house.xpath(".//div[@class='unitPrice']/span").re("\d+.\d+"),'totalPrice':house.xpath(".//div[@class='totalPrice']/span").re("\d+.\d+"),'attention': attention,'visited': visited,'publishday': publishday}page = response.xpath("//div[@class='page-box house-lst-page-box'][@page-data]").re("\d+")p = re.compile(r'[^\d]+')#这里是判断有没有下一页,毕竟不是所有区都是有第100页的,不能for循环到100if len(page)>1 and page[0] != page[1]:next_page = p.match(response.url).group()+str(int(page[1])+1)next_page = response.urljoin(next_page)yield scrapy.Request(next_page, callback=self.parse)

结语

说几个我拿数据看出来的结果。1.通过publishday我发现平均房屋留存时间变长。2.房屋均价上个月7万,这个月大概下降3-5k。 3.北京最便宜房屋单价1.6万/平方米,最贵14.9万/平方米(最贵和最便宜的一直都没卖出去)。 说明房市稍有降温。再次申明,这是从3000套房数据的统计结果,不是全量房屋统计结果,大家看看就好。
  上个月爬取过几天的数据,我决定以后每天定时爬一次,长期积累的数据肯定能分析出一些有趣的结论,我把所有爬取的数据放在ftp://xindoo.me/,方便大家获取。同时别忘记访问下我博客http://xindoo.me/。

python爬虫爬取链家二手房信息相关推荐

  1. python爬虫代码房-python爬虫爬取链家二手房信息

    #coding=utf-8 import requests from fake_useragent import UserAgent from bs4 import BeautifulSoup imp ...

  2. python爬虫requests源码链家_python爬虫爬取链家二手房信息

    #coding=utf-8 import requests from fake_useragent import UserAgent from bs4 import BeautifulSoup imp ...

  3. python二手房使用教程_python爬虫爬取链家二手房信息

    #coding=utf-8 import requests from fake_useragent import UserAgent from bs4 import BeautifulSoup imp ...

  4. python爬虫--爬取链家租房信息

    python 爬虫-链家租房信息 爬虫,其实就是爬取web页面上的信息. 链家租房信息页面如下: https://gz.lianjia.com/zufang/ ## python库 Python库 1 ...

  5. python关于二手房的课程论文_基于python爬取链家二手房信息代码示例

    基本环境配置 python 3.6 pycharm requests parsel time 相关模块pip安装即可 确定目标网页数据 哦豁,这个价格..................看到都觉得脑阔 ...

  6. Python爬虫爬取链家网上的房源信息练习

    一 原链接:用Python爬虫爬取链家网上的房源信息_shayebuhui_a的博客-CSDN博客_python爬取链家 打开链家网页:https://sh.lianjia.com/zufang/  ...

  7. 掌财社:python怎么爬取链家二手房的数据?爬虫实战!

    我们知道爬虫的比较常见的应用都是应用在数据分析上,爬虫作为数据分析的前驱,它负责数据的收集.今天我们以python爬取链家二手房数据为例来进行一个python爬虫实战.(内附python爬虫源代码) ...

  8. python爬虫requests源码链家_python爬虫——爬取链家房价信息(未完待续)

    爬取链家房价信息(未完待续) items.py # -*- coding: utf-8 -*- # Define here the models for your scraped items # # ...

  9. python爬虫爬取链家网房价信息

    打开链家网页:https://sh.lianjia.com/zufang/  :用F12以页面中元素进行检查 <a target="_blank" href="/z ...

  10. python爬取链家二手房信息

    爬取过程分析: 1.链家网url:https://bj.lianjia.com/ershoufang/pg2/ 显示的二手房信息每个url递增一 2.访问时要加头信息,否则无法访问 3.用beauti ...

最新文章

  1. iOS之Block总结以及内存管理
  2. directx 9.27.1734 多语言完整版 下载
  3. 跑monkey需要安装什么_安装隔音吊顶需要注意什么 隔音吊顶材料推荐
  4. 移动端实现文字轮播_js实现移动端轮播图
  5. CMFCButton使用简介
  6. 假如有Thread1、Thread2、ThreaD3、Thread4四条线程分别统计C、D、E、F四个盘的大小,所有线程都统计完毕交给Thread5线程去做汇总,应当如何实现?
  7. ArcGIS API for Silverlight开发入门(2):一个基础地图实例
  8. php-mysql rpm_Linux下的mysql apache php rpm安装方法步骤(转载并补充细节)
  9. CSS——简写属性(在padding和margin这样的简写属性中,值赋值的顺序是top、right、bottom、left)...
  10. java(8) HashMap源码
  11. 在OpenCV里实现Prewitt算子
  12. 电子发票撤销 java_已确认的发票如何撤销
  13. Emacs帮你进行英文写作
  14. Java-Java基础—(6)面向对象高级
  15. 牛牛的DRB迷宫II(构造)
  16. QT自定义控件之车辆远近光灯
  17. rk3288 android 6.0固件,RK3288固件升级教程
  18. 量化交易5-backtrader编写均线策略
  19. 多方安全计算(MPC)发展脉络及应用实践
  20. 深入理解计算机系统CSAPP复习

热门文章

  1. 基于PHP的简易教务管理系统
  2. 微信android系统要求,系统设计要求
  3. 处理器后面的字母什么意思?看了全搞懂
  4. Ken Thompson 在餐巾纸上设计的 UTF-8
  5. java基础学习备忘录
  6. 最新注册谷歌账号详细步骤,解决“此电话号码无法验证”问题
  7. Linux 基于tar与openssl加密解密压缩包
  8. java吉他游戏_[Java]吉他谱浏览器 0.1
  9. Brute Force(暴力破解)
  10. 移植FreeRTOS时Undefined symbol vApplicationTickHook referred from tasks.o