爬虫工作量由小到大的思维转变---<第四十八章 Scrapy 的请求和follow问题>

前言:

有时,在爬取网页的时候,页面可能只能提取到对应的url,但是具体需要提取的信息需要到下一页(url)里面; 这时候,不要在中间件去requests请求去返回response; 用这个方法....

正文:

在Scrapy框架内,如果你想从一个页面提取URL,然后跳转到这个URL以提取数据,最佳做法是

使用Scrapy的请求和回调系统,而不是通过外部的requests库跳转

使用Scrapy的内建方法不仅能更好地利用Scrapy的异步处理能力,而且还能保持Scrapy中间件和项目设置(如Cookies处理、请求延迟、并发请求等)的一致性。

步骤:

从一级页面跳转到二级页面

假设你在一级页面解析方法中(如:parse方法),提取了一个或多个二级页面的URL。你可以使用response.follow方法生成对二级页面的请求,并指定一个回调方法来处理这些页面的响应。

import scrapyclass MySpider(scrapy.Spider):name = 'my_spider'start_urls = ['http://example.com']  # 一级页面URLdef parse(self, response):# 提取二级页面的URLnext_page_url = response.css('a.next_page::attr(href)').get()  # 假设二级页面URL是这样提取的if next_page_url is not None:# 使用response.follow跳转到二级页面yield response.follow(next_page_url, self.parse_second_page)def parse_second_page(self, response):# 在这里处理二级页面的响应pass

使用Scrapy请求(Request)和回调

如果你需要更多控制(比如添加特定的请求头、Cookies等),也可以直接使用scrapy.Request来创建请求。

yield scrapy.Request(url=next_page_url, callback=self.parse_second_page)

在这段代码中,url参数是你要请求的二级页面的URL,callback参数指定了一个方法(在这个例子中是self.parse_second_page方法),这个方法将会被调用来处理响应。

两者区别和优点:

在Scrapy框架中,response.followscrapy.Request都用于生成对其他页面的请求,但他们在使用上有些微妙的区别与优点。理解这些差异有助于在不同情况下做出更合适的选择。

scrapy.Request

scrapy.Request是Scrapy中生成请求的基本方法。它允许你创建一个请求到指定的URL。scrapy.Request提供了高度的灵活性,允许你指定请求方法(如GET或POST),添加请求头,发送表单数据,设置回调函数处理响应等。

用法示例:
import scrapyclass MySpider(scrapy.Spider):name = 'example_spider'def start_requests(self):urls = ['http://example.com/page1', 'http://example.com/page2']for url in urls:# 指定请求的回调方法为parse方法yield scrapy.Request(url=url, callback=self.parse)def parse(self, response):# 处理响应的逻辑pass

response.follow

response.follow是在Scrapy 1.4.0版本中引入的,相比于scrapy.Request,它提供了一些简化和额外的便利性。主要的便利之处在于不需要完整的URL,response.follow会自动补全相对URL。它也允许直接传递一个选择器或链接提取器(比如response.cssresponse.xpath的结果),而Scrapy会从中提取URL。此外,response.follow继承了当前响应的一些属性,例如编码、cookies等。

用法示例:
class MySpider(scrapy.Spider):name = 'example_spider'start_urls = ['http://example.com']def parse(self, response):# 使用选择器确定下一个URLnext_page = response.css('a::attr(href)').get()if next_page is not None:# 不需要提供完整的URLyield response.follow(next_page, callback=self.parse_other_page)def parse_other_page(self, response):# 处理其他页面的逻辑pass

或者从一组链接中生成多个请求:

for href in response.css('ul.items a::attr(href)'):yield response.follow(href, self.parse_item)

主要区别

  • URL处理scrapy.Request需要完整的URL,而response.follow可以接受相对URL,自动补全为绝对URL。
  • 便利性response.follow允许直接传递选择器或链接提取器的结果,而scrapy.Request则需要先提取URL。
  • 继承属性response.follow继承了当前响应的某些属性,如编码、cookies等,而用scrapy.Request时需要手动指定。

总结

  • 当你有一个完整的URL或需要更多控制请求(比如改变请求方法或添加特定的头部信息)时,使用scrapy.Request
  • 当你要处理相对URL或者希望从当前响应中继承属性时,使用response.follow更方便简洁。

选择使用哪个主要取决于具体场景和对便利性与灵活性的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/701877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux平台下互换ESC和Caps Lock按键

目录 1.调试手段2.设置2.1.查看当前键盘布局2.2.修改配置2.3.重启或logout生效 3.查看按键映射表 参考资料 当使用Linux作为办公平台,设置映射。 如果在windows平台下使用Linux虚拟机,使用windows宿主平台的按键映射。 windows互换ESC和Caps Lock按键 刚…

【Activiti7系列】Activi7简介和基于Spring Boot整合Activiti7(流程设计器)

本文将介绍Activiti7基础概念及基于Spring Boot整合Activiti7(流程设计器)的具体步骤。 作者:后端小肥肠 1. 前言 在企业级应用中,业务流程的管理和执行是至关重要的一环。Activiti7是一个强大的开源工作流引擎,它提供了灵活的流程定义、任务…

【uni-app】生命周期

页面运行过程中,各个阶段的回调函数就是“生命周期钩子函数”。 uni-app 完整支持 Vue 实例的生命周期,同时还新增 应用生命周期 及 页面生命周期。 (1)应用生命周期 函数名说明onLaunch当uni-app 初始化完成时触发&#xff08…

argparse读取参数

用法argparseExample.py简单示例参考 用法 argparse是内置于python中,所以即为直接在命令行中对程序传入参数并让程序运行的便捷工具。具体步骤如下所示 导包,为import argparse创建一个ArugmentParser对象,随后一切都在这个对象里面操作&am…

SpringBoot3+Vue3 基础知识(持续更新中~)

bean 把方法的返回结果注入到ioc中 1: 2: 3: 组合注解封装 实战篇: 解析token: 统一携带token: 驼峰命名与下划线命名转换: NotEmpty!!! mybatis: PageHelper设置后,会将pageNum,和pageSize自己拼接…

安全相关问题记录

一、预防XSS攻击 校验输入时进行格式校验过滤过滤<script>,<iframe>等特殊标签过滤onclick,onerror,onfocus等js事件属性编码转义对需要渲染的内容做编码转义限制限制输入长度cookie设置成 http only

Flink 的历史版本特性介绍(一)

如果你还不了解 Flink 是什么,可以查看我之前的介绍文章:Flink 介绍 如果你想跟着我一起学习 flink,欢迎查看订阅专栏:Flink 专栏 这篇文章列举了 Flink 每次发布的版本中的重要特性,从中可以看出 Flink 是如何一步一步发展到今天的。 Flink 的前身是 Stratosphere 项目…

Git笔记——4

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、操作标签 二、推送标签 三、多人协作一 完成准备工作 协作开发 将内容合并进master 四、多人协作二 协作开发 将内容合并进master 五、解决 git branch -a…

【深度学习笔记】3_11 模型选择、欠拟合和过拟合

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;做了部分个人理解标注&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 3.11 模型选择、欠拟合和过拟合 在前几节基于Fashion-MNIST数据集的实验中&#xff0c;我们评价了机器学习模型在训练数据集和测试数…

集合的并发修改异常问题

使用迭代器遍历集合时&#xff0c;同时在删除集合中的数据&#xff0c;程序就会出现并发修改异常的错误。 import java.util.ArrayList; import java.util.Iterator; import java.util.List;public class _Exception {public static void main(String[] args) {List<String…

Kubernetes基本部署概念

文章目录 命名空间&#xff08;Namespaecs&#xff09;查看命名空间查看带有命名空间对象下资源 文件存储持久卷&#xff08;pv&#xff0c;Persistent Volumes&#xff09;卷容量卷模式&#xff08;volumeMode&#xff09;访问模式&#xff08;accessModes&#xff09;回收策略…

2023年06月CCF-GESP编程能力等级认证C++编程四级真题解析

一、单选题(每题 2 分,共 30 分) 第1题 高级语言编写的程序需要经过以下( )操作,可以生成在计算机上运行的可执行代码。 A. 编辑 B. 保存 C. 调试 D. 编译 答案:D 第2题 排序算法是稳定的(Stable Sorting),就是指排序算法可以保证,在待排序数据中有两个相等记录…

AR汽车行业解决方案系列之2-远程汽修

在汽车行业中&#xff0c;AR技术的应用正悄然改变着整个产业链的运作方式&#xff0c;应用涵盖培训、汽修、汽车售后、PDI交付、质检以及汽车装配等&#xff0c;AR技术为多个环节都带来了前所未有的便利与效率提升。 安宝特AR将以系列推文的形式为读者逐一介绍在汽车行业中安宝…

【多线程】阻塞队列详解及实现(模拟实现生产者消费者模型)

阻塞队列 &#x1f334;生产者消费者模型&#x1f338;强耦合&#x1f338;松耦合&#xff08;解耦合&#xff09; &#x1f38d;Java标准库中的阻塞队列&#x1f333;阻塞队列的模拟实现⭕总结 阻塞队列是什么? 阻塞队列是⼀种特殊的队列. 也遵守 “先进先出” 的阻塞队列能是…

四信AI智能识别及计量监测设备,助力入河入海排污口规范化建设

随着城市化和工业化的快速发展&#xff0c;污水排放已成为主要的环境问题之一。2022年&#xff0c;国务院办公厅发布《关于加强入河入海排污口监督管理工作的实施意见》&#xff0c;提出“加强科技研发&#xff0c;开展各类遥感监测、水面航测、水下探测、管线排查等实用技术和…

游戏配置内存“瘦身”策略

背景 游戏配置数据绝对是游戏服务器进程的内存大头,有些游戏服务器单纯数据配置的容量就超过一个G。因此,这部分内存优化也就放在首要位置了。 优化策略 在《服务器进程如何降低内存》一文中,我们讲述了可以通过“优化游戏配置缓存”来降低游戏服务器进程的内存使用量。本…

知乎万赞:为什么我不建议你转行学python?_为什么不建议学python

写在前面 本文的目的很简单&#xff0c;一句话&#xff1a; 用最少的时间&#xff0c;最高效率&#xff0c;让你清楚&#xff1a;想要拿到python offer&#xff0c;你需要做什么&#xff1f;你该怎么做&#xff1f;如果你不具备这些条件&#xff0c;我不建议你转行学python&a…

Stable Diffusion 3重磅发布

刚不久&#xff0c;Stability AI发布了Stable Diffusion 3.0&#xff0c;这一版本采用了与备受瞩目的爆火Sora相同的DiT架构。通过这一更新&#xff0c;画面质量、文字渲染以及对复杂对象的理解能力都得到了显著提升。由于这些改进&#xff0c;先前的技术Midjourney和DALL-E 3在…

【并发】CAS原子操作

1. 定义 CAS是Compare And Swap的缩写&#xff0c;直译就是比较并交换。CAS是现代CPU广泛支持的一种对内存中的共享数据进行操作的一种特殊指令&#xff0c;这个指令会对内存中的共享数据做原子的读写操作。其作用是让CPU比较内存中某个值是否和预期的值相同&#xff0c;如果相…

性能压测关注的指标有哪些?

在进行全链路压测和性能测试时,需要关注多个关键性能指标(KPIs)来评估系统的性能表现,以下是一些常见的性能测试指标。 1. 吞吐量(Throughput) 系统在单位时间内能够处理的请求数量或事务数量,通常以每秒请求数(RPS/TPS)来衡量。 2. 响应时间(Response Time) 从…