Scrapy翻页爬取实战:Spider与Pipeline去重详解
本文详解Scrapy框架实现翻页爬取的核心机制。通过Spider的parse方法生成新Request并控制dont_filter参数,结合Pipeline中的set对象实现Item去重,配合settings.py配置开启管道,即可高效完成多页数据抓取与清洗。
安装
Scrapy的安装过程十分简便,官方文档已提供详尽指南(http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/install.html),此处不再赘述。
在Scrapy框架中,Spider组件主要承担以下功能:
1. 定义初始爬取的URL地址。
2. 定义爬取行为,包括是否跟进链接。
3. 从网页中提取结构化数据。
所谓跟进链接,即自动抓取当前页面所有链接,并顺着这些链接延伸爬取。只需提供网站首页,理论上即可覆盖全站页面,实现从点到面的爬取功能。
若自行开发,需在算法层面决定使用深度优先还是广度优先策略,并处理URL限制条件等细节。Scrapy大大简化了开发流程,只需定义关键部分代码即可实现翻页效果。
1. Spider
核心思想是在parse方法中返回新的Requests请求,具体代码如下:
import scrapy
from hello_world.items import HelloWorldItem
class MirSpider(scrapy.Spider):
name = "MirSpider"
start_urls = ["http://mirtarbase.cuhk.edu.cn/php/search.php?opt=species&org=bta&sort=id&order=asc&page=1"]
def parse(self, response):
domain = 'http://mirtarbase.cuhk.edu.cn'
for row in response.xpath('//table/tr'):
item = HelloWorldItem()
res = []
for col in (row.xpath('td/text()')):
res.append(col.extract())
if res[0] != 'Bos taurus':
continue
item['species'] = res[0]
item['miRNA'] = res[2]
item['target'] = res[3]
item['total'] = res[4]
item['papers'] = res[5]
yield item
for url in response.xpath('//a/@href').extract():
if 'page' in url:
url = domain + url
yield scrapy.Request(url, callback = self.parse, dont_filter = False)
关键代码位于最后的for循环。在start_urls中仅提供一个初始URL,在parse方法中,除返回结构化数据item外,还返回新的requests请求。首先提取页面上所有URL,并对链接进行限制,通过Request方法返回需爬取的URL。注意dont_filter的设置:当设为False时,会调用Scrapy默认的URL去重机制,避免重复下载。
2. Item Pipeline
对于下载的item,若出现重复现象,可在pipelines.py中对item进行操作,实现去重。代码如下:
from itemadapter import ItemAdapter
class HelloWorldPipeline:
def __init__(self):
self.link_set = set()
def process_item(self, item, spider):
link = item['miRNA'] + item['target']
if link in self.link_set:
raise DropItem(item)
self.link_set.add(link)
return item
在process_item方法中,通过set对象实现去重。需注意,默认情况下pipelines未开启,编写代码后需在settings.py中配置并开启对应pipeline,配置内容如下:
ITEM_PIPELINES = {
'hello_world.pipelines.HelloWorldPipeline': 300,
}
对于标准的多页表格数据,采用上述代码可轻松实现翻页效果,操作非常便捷。
至此,关于Scrapy翻页爬取实现的介绍结束。如需了解更多Scrapy翻页爬取相关内容,请搜索本站过往文章或继续浏览后续文章,感谢大家的支持!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









