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

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

本文详解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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。