爬取目标
在前文《scrapy入门-环境安装及demo运行》中,我们了解了如何利用Scrapy框架进行单一网页的数据抓取。然而,很多场景下,想要抓取的数据比较多,会分好几页展示。一种常见的形式是,网站有一个索引页,索引页中包含许多列表项,同时有分页系统。点击索引页中的列表项,跳转到列表项对应的详情页中。
本文中,我们将以自如租房网页的抓取为例,介绍如何实现翻页爬取1-50页的租房列表爬取和每个房源链接详情页内容数据的爬取。
CrawlSpider
Scrapy提供了一个CrawlSpider类,我们仅需通过设定简单的抓取规则,即可完成上述爬取需求,链接的抽取,新页面的访问均在CrawlSpider内部实现。本例就依赖CrawlSpider来实现。
和前文一样,我们先通过命令“scrapy startproject ziruSpider”来创建一个新项目。在生成爬虫时,我们的命令和之前有所区别,需要采用命令“scrapy genspider –t crawl ziruspider ziroom.com”,表示采用模板crawl进行爬虫模板的生成。如下图
可以看到,这次生成的ZiruspiderSpider类继承的是CrawlSpider类,同时parse方法也不见了,取而代之的是parse_item方法。这是因为CrawlSpider帮我们实现了parse方法,我们默认仅需实现CrawlSpider匹配rules规则抓取到的页面的解析函数parse_item。
常规工作
在修改爬虫主逻辑前,我们先完成几个常规工作,一个是修改起始抓取网址,设置start_urls = [' http://hz.ziroom.com/z/']。然后定义抓取结果的数据结构Item,本例中为简化起见,我们仅抓取房屋详情页中的“房屋名称”,即上图2中的“自如友家·大美公寓·4居室-05卧”。
解析逻辑
要实现本文的爬取目标,我们要解决两个难题。一是在起始网页中想办法找到每一个列表详情页的链接地址,进行访问,然后解析出详情页里的“房屋名称”。二是想办法跳转到下一页,在下一页中继续难题一的工作。
得益于CrawlSpider的帮助,我们只需要在rules里用一个XPATH表达式指明应该去哪个元素里抽取链接,CrawlSpider即会自动访问元素里href属性的链接并获取链接的网页,并调用你的parse_item方法进行解析。所以,上述难题即简化成了如何定位链接详情页对应的元素,和如何定位下一页链接对应的元素。
和前文的老办法一样,浏览器上通过F12,可以快速找到对应的元素,即可得到其对应的XPATH表达式。关于XPATH的正确性也可以提前在控制台进行验证,这里不再赘述。
解析逻辑的完成代码如下图,代码中有详细的注释
通过scrapy crawl ziruspider 即可执行脚本,爬取数据。我们还可以在运行命令中增加-o [filename]选项来支持将内容输出到文件。比如“scrapy crawl ziruspider -o ziru.csv” 将结果存储到文件baidu.csv
至此,我们就完成了翻页数据和链接页内容的爬取学习,后续将放出更多的Scrapy功能演示案例,请点赞关注我吧。