Scrapy翻页爬取实战:Spider与Pipeline去重详解

温以宁
温以宁
发布时间:2026-10-14 | 5人浏览过
原创

本文详解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翻页爬取相关内容,请搜索本站过往文章或继续浏览后续文章,感谢大家的支持!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表