这是菜鸟学Python的第111篇原创文章
阅读本文大概需要3分钟
去年楼市暴涨,今年楼市一天一个价格,也不知道什么时候会跌. 北上广一线城市高的离谱. 南京,成都,合肥算是二线城市,但是房价也很高.想买到一套物美价廉的房子,谈何容易啊!今天我就来先爬取南京20000多套二手房,来看一下南京的楼市.
前面爬虫我写了好多篇,一直都是自己造轮子,还没有用爬虫神器scrapy.今天我们就用scrapy来爬取一下南京楼市的数据.代码大概50几行,非常方便.
01
关于scrapy
scrapy就像是一个做好的模版,框架已经搭建好了,你只需要熟悉它的架构,往里面填东西就行了,非常方便.所以使用前要熟练了解这个框架,整体架构大致如下:
Scrapy运行的大概流程如下:
1).Engine先从调度器中拿出一个起始(URL)
2).Engine把URL封装成一个请求,扔给下载器去下载内容,并封装成应答包response
3).爬虫解析Response,内置了selector对象处理
4).解析出实体(Item),则传输给实体管道进行进一步的处理
5).接着爬取下一个url,循环上面的步骤
接着我们需要了解下面3个基本动作:
-
如何生成项目
-
如何运行爬取
-
如何输出结果
基本上就是下面的这几个命令运用:
-
一般我们爬虫都很喜欢用BeautifulSoup,BeautifulSoup虽然好用,但是有一个非常大的缺点,就是慢.(为啥是python写的库)
-
scrapy框架内置了selector对象来解析数据,selector采用的XPath选择器或者CSS选择器,速度要秒杀bs好几条街. 使用起来需要熟悉一下, 如果有前端经验的同学可以很快上手!
-
对于XPath其实是XPath 是一门在 XML 文档中查找信息的语言,在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档根节点
-
我个人比较喜欢CSS 选择器,因为容易懂
其实scrapy最爽的地方是内置了类似IPython那样的shell调试器,非常好用.好言归正传,我们赶紧开始爬数据吧,看看scrapy如何分分钟爬取二手房的数据
02
实战爬取南京二手房
我们是要爬取二手房的信息,这样的网站很多房天下,house365,链家等等。这里我选择比较简单的链家网站, 方便爬取.
哇有20937套二手房,我们希望了解下面几个重要参数:
-
房子的位置
-
房子有房间
-
房子的面积
-
房子的总价
-
房子的单价
看一下源码,好不好分析呢呢:
通过查看network里面的数据,发现还比较规整,如果用bs很好获取,这里我用css选择器解析.
1).安装
先用pip install scrapy,scrapy有py2和py3两个版本,这里我用py2版本.
2).创建项目
scrapy startproject nj_house
3).查看创建的项目工程
工程文件说明:
-
scrapy.cfg 记录项目的配置信息
-
items.py 存放爬取完数据的模板,用于结构化数据
-
pipelines 数据处理行为,比如结构化的数据,存放到数据库持久化等等
-
settings.py 配置文件,比如递归的层数、并发数,延迟下载等
-
spiders 真正干活的爬虫目录,对网页的数据清洗
4).编写爬虫
进入刚才创建的目录,然后敲scrapy genspider创建一个lj_house.py文件
cd nj_house/
scrapy genspider lj_house nj.lianjia.com/ershoufang/
5).查看生成好的模版代码
刚才创建的lj_house.py其实就是我们要解析网页的文件,跟以前爬虫的思路非常类似,首先解析第一个网页,然后获取其他网页的链接,接着挨个爬取解析.
看一下scrapy帮我生成好的代码:
6).编程解析网页文件
scrapy已经帮我写好的框架,这里的parse函数传进来的response就是我们第一个网页的代码,我们print response.text就能看到内容.(记着把setting.py里面的ROBOT协议尊守改为False,不如爬不了任何数据).
<span style="background-color:#472c47;">ROBOTSTXT_OBEY</span> <span style="color:#f92672;">= </span><span style="color:#66d9ef;font-style:italic;">False</span>
接着我们修改起始的网页链接,并且编写parse函数就可以了
我们存放数据的时候,用了一个HouseSpiderItem类,这个类是在item.py文件中生成的.
<span style="color:#66d9ef;font-style:italic;">class </span><span style="color:#a6e22e;">HouseSpiderItem</span>(scrapy.Item)<span style="color:#f92672;">:<br /> </span><span style="color:#75715e;"># define the fields for your item here like:<br /> # name = scrapy.Field()<br /> </span>house<span style="color:#f92672;">=</span>scrapy.Field()<br /> total_price<span style="color:#f92672;">=</span>scrapy.Field()<br /> unit_price<span style="color:#f92672;">=</span>scrapy.Field()<br /> house_room<span style="color:#f92672;">=</span>scrapy.Field()<br /> house_area<span style="color:#f92672;">=</span>scrapy.Field()
注意scrapy大量用yield生成器,yield算是python中一个比较难的概念,具体可以看我的历史文章(Python写个迷你聊天机器人|生成器的高级用法)里面有很详细的介绍
7).获取下一个网页链接
类似前面的方法,把页面拉到最下面,看一下底部的下一个网页的链接:
经过上面几步,大功告成,运行一下吧:
scrapy crawl nj_house
直接生成csv文件
scrapy crawl nj_house -o house.csv
一个区域大概2-3000多套,南京有11个区域,依次爬取就可以获得所有的二手房数据.
结论:
爬取南京二手房这个例子比较简单,适合小白上手练习scrapy.其实scrapy威力非常强大,后面我会用scrapy爬取更加大型和复杂的网站。这篇文章只是上篇,二手房的数据还没有分析呢,敬请期待下篇!大家若有什么问题,欢迎留言讨论. 需要源码请留言.
另外周末开通小密圈,寻找100位铁杆粉丝,目前人数出乎我的意料,很快已经超过100人. 超过100人小密圈就涨价了,小密圈有效期是2017/10/13-2018/10/13,其实越早加入越划算.
欢迎大家关注 菜鸟学Python",更多好玩有趣的Python原创教程,趣味算法,经验技巧,行业动态,尽在菜鸟学Python,一起来学python吧
Python语言如何入门
最全的零基础学Python的问题,你想知道的都在这里
Python入门原创文章,2016年度大盘点
用Python写个弹球的游戏
Python写个迷你聊天机器人|生成器的高级用法
用Python破解微软面试题|24点游戏
一道Google的算法题 |Python巧妙破解
长按二维码,关注【菜鸟学python】
来源 | 菜鸟学Python
作者 | xinxin
本文章为菜鸟学Python独家原创稿件,未经授权不得转载
本篇文章来源于: 菜鸟学Python
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 如何增加pycharm的python字体12/08
- ♥ 如何在python中清除屏幕08/17
- ♥ 如何在 python 中计算 50 阶乘?01/14
- ♥ 最好用的 Python 虚拟环境,没有之一07/25
- ♥ python中有算法吗11/22
- ♥ 如何在python中安装pip08/14
内容反馈