Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Python爬虫实战】Scrapy 翻页攻略从入门到精通的完整教程

【Python爬虫实战】Scrapy 翻页攻略从入门到精通的完整教程

作者头像
易辰君
发布于 2024-12-25 02:22:25
发布于 2024-12-25 02:22:25
36700
代码可运行
举报
文章被收录于专栏:CSDNCSDN
运行总次数:0
代码可运行

前言

Scrapy 是一个强大的网页爬虫框架,广泛用于从网站中抓取数据。在使用 Scrapy 进行数据抓取时,翻页请求是常见的需求。本文将详细介绍 Scrapy 发起翻页请求的原理与实现方式,包括如何通过 Scrapy 框架进行翻页请求、如何自定义请求参数,以及如何处理多页面的数据提取。

一、翻页请求的基本思路

要提取所有页面的数据,最直接的方式就是通过翻页请求,访问每一页的 URL 并提取数据。通常在爬取网页时,页面内容会分为多个分页,每一页显示部分数据,用户可以点击 "下一页"(或 "后页")来加载下一部分内容。

(一)使用 requests 模块实现翻页

requests 模块中,进行翻页的操作大致是这样:

  1. 获取下一页的 URL 地址。通过分析网页,提取下一页的链接。
  2. 发起 HTTP 请求,例如调用 requests.get(url),访问下一页的数据。

这种方式简单直观,但它的缺点是每次翻页都需要手动解析并发起请求。

(二)Scrapy 实现翻页的思路

Scrapy 实现翻页请求的思路与 requests 模块类似,但它的实现更加高效和灵活。Scrapy 使用异步请求,可以并发发起多个请求,同时对请求进行调度与管理。其实现逻辑如下:

  1. 获取下一页的 URL 地址。通过解析当前页面,获取下一页的 URL 地址。
  2. 构造请求,将翻页请求传递给 Scrapy 引擎进行处理。

二、Scrapy 实现翻页请求的步骤

(一)实现翻页请求的基本方法

实现 Scrapy 翻页请求的基本步骤如下:

  1. 确定翻页 URL 地址:通过解析页面源代码,确定下一页的 URL 地址。通常,翻页 URL 会带有类似 ?page=2&start=25 的查询参数。
  2. 构造翻页请求:使用 scrapy.Request(url, callback) 来创建一个新的请求,将其传递给引擎。callback 用来指定处理响应的函数。
  3. 交给 Scrapy 引擎处理:使用 yield scrapy.Request(url, callback) 将翻页请求交给 Scrapy 引擎进行调度和执行。

(二)代码实现示例

以爬取某电影 网站Top100 为例,学习如何实现翻页请求。

假设我们已经获取了第一页的数据,接下来就需要实现翻页的逻辑。以下是实现翻页请求的代码示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import scrapy

class DoubanSpider(scrapy.Spider):
    name = "douban"
    start_urls = ['https://xxxxxx']

    def parse(self, response):
        # 提取当前页面的电影数据
        ol_list = response.xpath('//ol[@class="grid_view"]/li')
        for ol in ol_list:
            item = {}
            item['title'] = ol.xpath('.//div[@class="hd"]/a/span[1]/text()').extract_first()
            item['rating'] = ol.xpath('.//div[@class="bd"]/div/span[2]/text()').extract_first()
            item['quote'] = ol.xpath('.//div[@class="bd"]//p[@class="quote"]/span/text()').extract_first()
            yield item

        # 提取下一页的链接
        next_url = response.xpath("//a[text()='后页>']/@href").extract_first()
        if next_url:
            next_url = response.urljoin(next_url)  # 拼接完整的 URL
            yield scrapy.Request(next_url, callback=self.parse)

在这段代码中,parse 方法首先提取当前页面的电影数据,然后查找并拼接下一页的 URL 地址。如果下一页存在,就创建一个新的请求,通过 yield scrapy.Request(next_url, callback=self.parse) 递归地发起翻页请求。

(三)Scrapy 请求的常用参数

Scrapy 的 Request 对象有多个参数,可以帮助我们定制请求的行为,常用的参数有:

  • url:请求的 URL 地址。
  • callback:指定响应处理函数。
  • method:指定请求的方法,默认为 GET
  • headers:请求头,通常用来设置 User-Agent 或 Referer 等。
  • meta:传递数据给下一个回调函数,用于跨请求传递数据。
  • dont_filter:如果设置为 True,则 Scrapy 不会过滤重复的请求。

例如,我们可以通过 meta 来传递当前页面的数据,或者使用 dont_filter=True 来防止 Scrapy 过滤掉已请求的 URL。


三、处理翻页请求的优化方法

(一)重写 start_requests 方法

在上面的示例中,我们使用了 start_urls 来启动爬虫,但如果需要更复杂的翻页逻辑,例如分页的页码是动态生成的,或者 URL 中包含参数,我们可以重写 start_requests 方法,手动生成请求。

例如,假设页面的翻页 URL 是通过 start=25 来表示页码,每 25 条数据一页,我们可以如下编写 start_requests 方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def start_requests(self):
    for i in range(10):  # 假设我们需要爬取 10 页
        url = f'https://xxxxxxx/top250?start={i * 25}&filter='
        yield scrapy.Request(url, callback=self.parse)

通过这种方式,我们可以自定义分页 URL,避免手动解析 HTML 中的翻页链接。

(二)使用 meta 参数在不同解析函数中传递数据

有时候,我们需要将一些数据从一个解析函数传递到另一个解析函数。Scrapy 提供了 meta 参数,可以用来在请求之间传递数据。

例如,在爬取电影详细信息时,我们可能需要从列表页抓取每个电影的基本信息,然后跳转到详情页。我们可以通过 meta 参数传递数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def parse(self, response):
    for ol in response.xpath('//ol[@class="grid_view"]/li'):
        item = {}
        item['title'] = ol.xpath('.//div[@class="hd"]/a/span[1]/text()').extract_first()
        item['rating'] = ol.xpath('.//div[@class="bd"]/div/span[2]/text()').extract_first()
        detail_url = ol.xpath('.//div[@class="hd"]/a/@href').extract_first()
        yield scrapy.Request(detail_url, callback=self.parse_detail, meta={'item': item})

def parse_detail(self, response):
    item = response.meta['item']
    # 进一步抓取详情页的内容
    item['director'] = response.xpath('//span[text()="导演:"]/following-sibling::text()').extract_first()
    yield item

在上面的代码中,parse 方法将每个电影的基本信息保存在 item 字典中,并将其传递到 parse_detail 函数中,进行进一步的数据提取。

四、其他注意事项

(一)处理请求头与代理

为了避免被网站封禁,我们通常需要设置请求头中的 User-Agent,以及使用代理 IP。Scrapy 可以通过修改 settings.py 文件中的配置来设置这些信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
ROBOTSTXT_OBEY = False  # 如果不需要遵守 robots.txt,可以设置为 False

(二)请求过滤与重复请求

Scrapy 会默认过滤已访问的 URL 地址,如果希望在某些情况下允许重复请求,可以通过 dont_filter=True 来禁用 URL 过滤。例如,翻页请求通常会重复访问相同的 URL,需要禁用过滤:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yield scrapy.Request(next_url, callback=self.parse, dont_filter=True)

五、总结

Scrapy 提供了一种高效而灵活的方式来处理翻页请求。通过 scrapy.Request 对象,我们可以轻松地发送请求并处理响应。同时,Scrapy 还提供了强大的数据传递机制(如 meta 参数)和优化手段(如重写 start_requests 方法),使得分页抓取的实现更加灵活和高效。掌握这些技巧,对于编写高效、稳定的爬虫是非常有帮助的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python爬虫之scrapy构造并发送请求
在爬虫文件的parse方法中,提取详情页增加之前callback指定的parse_detail函数:
海仔
2020/09/28
1.5K0
Python爬虫之scrapy构造并发送请求
Python爬虫入门教程 35-100 知乎网全站用户爬虫 scrapy
全站爬虫有时候做起来其实比较容易,因为规则相对容易建立起来,只需要做好反爬就可以了,今天咱们爬取知乎。继续使用scrapy当然对于这个小需求来说,使用scrapy确实用了牛刀,不过毕竟本博客这个系列到这个阶段需要不断使用scrapy进行过度,so,我写了一会就写完了。
梦想橡皮擦
2019/03/06
8180
Python爬虫入门教程 35-100 知乎网全站用户爬虫 scrapy
Python爬虫入门教程 39-100 天津市科技计划项目成果库数据抓取 scrapy
今天本来没有打算抓取这个网站的,无意中看到某个微信群有人问了一嘴这个网站,想看一下有什么特别复杂的地方,一顿操作下来,发现这个网站除了卡慢,经常自己宕机以外,好像还真没有什么特殊的....
梦想橡皮擦
2019/03/08
5370
Python爬虫入门教程 39-100 天津市科技计划项目成果库数据抓取 scrapy
python scrapy爬虫练习(1) 爬取豆瓣电影top250信息
文章目录 一、分析网页 目标URL:https://movie.douban.com/top250?start=0&filter= 每一页有25条电影信息,总共10页。检查网页可以发现,每条电影的详细
叶庭云
2020/09/17
5.1K0
python  scrapy爬虫练习(1)   爬取豆瓣电影top250信息
Python爬虫之scrapy模拟登陆
scrapy中start_url是通过start_requests来进行处理的,其实现代码如下
海仔
2020/09/28
1.5K0
Python爬虫——Scrapy爬取名人名言
toscrape是一个名人名言的网站 一条名人名言的结构如下 <div class="quote" itemscope="" itemtype="http://schema.org/CreativeWork"> <span class="text" itemprop="text">“I have not failed. I've just found 10,000 ways that won't work.”</span> <span>by <small class="au
羊羽shine
2019/05/29
1K0
python爬虫 scrapy爬虫框架的基本使用
在编写爬虫的时候,如果我们使用 requests、aiohttp 等库,需要从头至尾把爬虫完整地实现一遍,比如说异常处理、爬取调度等,如果写的多了,的确会比较麻烦。利用现有的爬虫框架,可以提高编写爬虫的效率,而说到 Python 的爬虫框架,Scrapy 当之无愧是最流行最强大的爬虫框架了。
叶庭云
2020/09/17
1.6K0
从原理到实战,一份详实的 Scrapy 爬虫教程
本文将从原理到实战带领大家入门另一个强大的框架 Scrapy。如果对Scrapy感兴趣的话,不妨跟随本文动手做一遍!
CDA数据分析师
2021/08/05
11.2K0
从原理到实战,一份详实的 Scrapy 爬虫教程
爬虫 | Python学习之Scrapy-Redis实战京东图书
scrapy-Redis就是结合了分布式数据库redis,重写了scrapy一些比较关键的代码,将scrapy变成一个可以在多个主机上同时运行的分布式爬虫。
猴哥yuri
2019/07/30
4050
爬虫 | Scrapy实战腾讯招聘
这个文章的技术含量并不高,旨在练习scrapy框架的基本用法,熟悉框架下各个文件的作用。 先上一波爬取结果:
咸鱼学Python
2019/10/09
1.2K0
爬虫 | Scrapy实战腾讯招聘
【0基础学爬虫】爬虫基础之scrapy的使用
大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章,为实现从易到难全方位覆盖,特设【0基础学爬虫】专栏,帮助小白快速入门爬虫,本期为自动化工具 Selenium 的使用。
K哥爬虫
2024/07/01
1830
【0基础学爬虫】爬虫基础之scrapy的使用
Python scrapy框架爬取瓜子二
可以到https://www.lfd.uci.edu/~gohlke/pythonlibs/  下载 pywin32,lxml,Twisted,scrapy然后pip安装
py3study
2020/01/16
5930
Scrapy入门案例——腾讯招聘
爬取腾讯招聘的职位信息,并保存为json文件。 获得现有的3571条职位信息(职位名称、职位类别、人数、地点发布时间、详情页的链接),并获得详情页的内容。
100000860378
2018/09/13
6310
Scrapy入门案例——腾讯招聘
scrapy数据建模与请求
请注意,本文编写于 1724 天前,最后修改于 993 天前,其中某些信息可能已经过时。
曼亚灿
2023/05/17
4190
爬虫之scrapy框架
  何为框架,就相当于一个封装了很多功能的结构体,它帮我们把主要的结构给搭建好了,我们只需往骨架里添加内容就行。scrapy框架是一个为了爬取网站数据,提取数据的框架,我们熟知爬虫总共有四大部分,请求、响应、解析、存储,scrapy框架都已经搭建好了。scrapy是基于twisted框架开发而来,twisted是一个流行的事件驱动的python网络框架,scrapy使用了一种非阻塞的代码实现并发的,结构如下:
py3study
2020/01/17
1.3K0
python爬虫–scrapy(再探)
— 图片:xpath解析出图片src的属性值。单独的对图片地址发起请求获取图片二进制类型的数据。
全栈程序员站长
2021/04/21
6620
python爬虫–scrapy(再探)
使用scrapy爬取suning
# -*- coding: utf-8 -*- import scrapy from copy import deepcopy class SuSpider(scrapy.Spider):
py3study
2020/01/16
4990
Python爬虫之scrapy框架学习
scrapy安装步骤 pip install wheel 下载twisted : 地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted (选择对应的版本) 安装twisted : pip install aiohttp-3.8.1-cp38-cp38-win_amd64.whl pip install pywin32 pip install scrapy 测试终端输入: scrapy 创建工程 终端输入: scrapy startproject fi
shaoshaossm
2022/12/26
7160
Python爬虫——电影top榜
图片的实际是data-src,而不是src需要实际看一下请求数据返回的response值
羊羽shine
2019/05/29
5810
Scrapy1.4最新官方文档总结 2 Tutorial创建项目提取信息XPath简短介绍继续提取名人名言用爬虫提取信息保存数据提取下一页使用爬虫参数更多例子
这是官方文档的Tutorial(https://docs.scrapy.org/en/latest/intro/tutorial.html)。 推荐四个Python学习资源: Dive Into Py
SeanCheney
2018/04/24
1.4K0
Scrapy1.4最新官方文档总结 2 Tutorial创建项目提取信息XPath简短介绍继续提取名人名言用爬虫提取信息保存数据提取下一页使用爬虫参数更多例子
相关推荐
Python爬虫之scrapy构造并发送请求
更多 >
加入讨论
的问答专区 >
1合伙人擅长4个领域
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
    本文部分代码块支持一键运行,欢迎体验
    本文部分代码块支持一键运行,欢迎体验