yield代码解释

目录

我们的post请求爬取百度翻译的代码

详细解释

解释一

解释二

再说一下callback

总结


发现了很多人对存在有yield的代码都不理解,那就来详细的解释一下

我们的post请求爬取百度翻译的代码

import scrapy
import jsonclass TestpostSpider(scrapy.Spider):name = "testpost"allowed_domains = ["fanyi.baidu.com"]# post请求如果没有参数,那抹这个请求将没有任何的意义# 所以 start_urls 也是没有用# 而且 parse 方法也没有用了# 所以直接注释掉# TODO# start_urls = ["https://fanyi.baidu.com/sug"]## def parse(self, response):#     print("==========================")# post请求就使用这个方法def start_requests(self):url = 'https://fanyi.baidu.com/sug'data = {'kw': 'final'}yield scrapy.FormRequest(url=url, formdata=data, callback=self.parse_second)def parse_second(self, response):content = response.textobj = json.loads(content)print(obj)

        这段代码是一个使用Scrapy框架实现的爬虫程序。代码中定义了一个名为TestpostSpider的Spider类,继承自Scrapy的Spider类。Spider类用于定义爬取和解析网页的逻辑。

        该爬虫程序的目标网站是百度翻译接口(fanyi.baidu.com)。在start_requests方法中,定义了一个POST请求,请求的URL是'https://fanyi.baidu.com/sug'。请求的数据data是一个字典,包含了一个参数kw和对应的值'final'。通过scrapy.FormRequest方法发送POST请求,并指定回调函数为parse_second

        在parse_second方法中,处理了响应,将响应内容转换为JSON格式,并打印出来。

        整个爬虫程序的作用是向百度翻译接口发送一个POST请求,请求参数为'final',并将返回的响应内容解析为JSON格式并打印出来。

详细解释

  1. import scrapyimport json:导入Scrapy框架和JSON库。

  2. class TestpostSpider(scrapy.Spider)::定义一个名为TestpostSpider的Spider类,该类继承自Scrapy的Spider类。

  3. name = "testpost":指定爬虫的名称为"testpost"。

  4. allowed_domains = ["fanyi.baidu.com"]:设置允许爬取的域名为"fanyi.baidu.com"。

  5. def start_requests(self)::定义一个方法用于生成初始请求。

    • url = 'https://fanyi.baidu.com/sug':设置目标URL为百度翻译的sug API。

    • data = {'kw': 'final'}:构造POST请求的表单数据,其中'kw'参数的值为'final'。

    • yield scrapy.FormRequest(url=url, formdata=data, callback=self.parse_second):使用scrapy.FormRequest生成POST请求,并指定回调函数为parse_secondyield关键字用于生成请求对象,使得Scrapy能够异步处理请求。

  6. def parse_second(self, response)::定义一个回调函数,用于处理POST请求的响应。

    • content = response.text:获取响应的文本内容。

    • obj = json.loads(content):将响应内容解析为JSON格式。注意,json.loads()方法中不需要指定encoding参数,因为Scrapy已经以Unicode格式解码了响应内容。

    • print(obj):打印解析后的JSON数据。

解释一

yield scrapy.FormRequest(url=url, formdata=data, callback=self.parse_second)

        这句代码是在start_requests方法中使用yield关键字创建了一个scrapy.FormRequest对象,并将其返回。scrapy.FormRequest表示一个POST请求,可以指定请求的URL、表单数据和回调函数。

  • url=url:指定请求的URL为url变量的值,即'https://fanyi.baidu.com/sug'。
  • formdata=data:指定请求的表单数据为data变量的值,即{'kw': 'final'}
  • callback=self.parse_second:指定请求完成后的回调函数为parse_second方法。当请求完成后,Scrapy会将响应传递给parse_second方法进行处理。

        通过使用yield关键字返回scrapy.FormRequest对象,该对象将被Scrapy的引擎接收并执行。这样,Scrapy将会发送POST请求到指定的URL,并在获取到响应后调用parse_second方法进行处理。

解释二

这句代码使用了scrapy.FormRequest来生成一个POST请求。

yield scrapy.FormRequest(url=url, formdata=data, callback=self.parse_second)
  1. url=url:指定请求的目标URL,即要发送POST请求的地址,这里是百度翻译的suggest API。

  2. formdata=data:设置POST请求的表单数据,这是一个字典,其中键值对表示表单中的字段和相应的值。在这个例子中,'kw': 'final'是表单中的一个字段和值。

  3. callback=self.parse_second:指定了请求成功后的回调函数,即在收到响应后要执行的函数。在这里,回调函数是parse_second,该函数会处理服务器返回的响应。

  4. yield:这是关键的异步操作部分。通过使用yield,Scrapy能够以异步的方式处理请求,而不会阻塞程序的执行。这使得程序能够同时发送多个请求并处理它们的响应,提高了效率。

        总体来说,这一行代码的作用是生成一个POST请求,发送到指定的URL,携带特定的表单数据,并在成功获取响应后调用parse_second函数进行处理。使用yield确保了异步操作,使得爬虫能够高效地处理多个请求。

再说一下callback

例子

import scrapyclass ExampleSpider(scrapy.Spider):name = "example"start_urls = ["http://quotes.toscrape.com/page/1/", "http://quotes.toscrape.com/page/2/"]def parse(self, response):for quote in response.css('div.quote'):text = quote.css('span.text::text').get()author = quote.css('span small::text').get()yield {'text': text,'author': author,}# 跟踪翻页链接next_page = response.css('li.next a::attr(href)').get()if next_page:yield scrapy.Request(url=next_page, callback=self.parse)

  callback=self.parse 的部分指定了在新请求完成后应该调用的回调函数,也就是处理新响应的方法。在这个例子中,回调函数是 parse 方法。

        在 Scrapy 中,parse 是默认的回调函数名称,用于处理初始请求的响应。当新请求被生成并完成后,Scrapy 将调用指定的回调函数来处理新的响应。这种设计使得爬虫能够以递归的方式处理多个页面,特别是在需要翻页时。

        在翻页的情况下,通过 yield scrapy.Request(url=next_page, callback=self.parse) 生成了一个新的请求对象,这个请求对象将发送到下一页的 URL。当这个请求完成后,它的响应会由 parse 方法处理,从而实现了对多个页面的异步爬取。

        你也可以定义其他的回调函数来处理不同的请求或响应,这取决于你的爬虫需求。例如,你可以为处理详情页的响应定义一个独立的回调函数,然后在生成请求时指定相应的回调函数。

总结

  yield 在 Python 中有两个主要的用途:作为生成器(generator)的一部分和在异步编程中用于生成异步操作的结果。在 Scrapy 中,yield 主要用于异步爬取的场景,其中最常见的用法是生成请求对象和处理响应。

在 Scrapy 中,yield 通常用于:

  1. 生成请求对象: 使用 yield 生成包含新请求的请求对象,使得 Scrapy 能够异步地发送和处理多个请求。这在处理翻页、跟踪链接等情况下非常常见。例如:

    yield scrapy.Request(url="http://example.com/page1", callback=self.parse_page)

  2. 处理响应: 使用 yield 生成爬取到的数据,允许 Scrapy 异步地处理和保存数据。这通常发生在回调函数中。例如:

    yield { 'title': response.css('h1::text').get(), 'content': response.css('div.article::text').get(), }

  3. 异步操作: yield 在异步编程中用于生成异步操作的结果,允许程序在等待异步操作完成的同时执行其他任务。

        总的来说,yield 在 Scrapy 中的使用是为了利用异步特性,允许爬虫同时执行多个任务而不阻塞,提高了爬虫的效率。它被用于生成请求、处理响应、以及在异步编程中生成异步操作的结果。

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

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

相关文章

Linux网络套接字之预备知识

(。・∀・)ノ゙嗨!你好这里是ky233的主页:这里是ky233的主页,欢迎光临~https://blog.csdn.net/ky233?typeblog 点个关注不迷路⌯▾⌯ 目录 一、预备知识 1.理解源IP地址和目的IP地址 …

表单进阶(4)-下拉菜单

select支持&#xff1a; 1.size显示几个 2.multiple同时选中多个 如果用select&#xff0c;option必须设置value值 option支持的属性&#xff1a; 1.value&#xff0c;提供给后端的值 2.selected&#xff0c;默认选中 <!DOCTYPE html> <html lang"en"> …

编程示例: 矩阵的多项式计算以javascript语言为例

编程示例: 矩阵的多项式计算以javascript语言为例 国防工业出版社的《矩阵理论》一书中第一章第8个习题 试计算2*A^8-3*A^5A^4A^2-4I A[[1,0,2],[0,-1,1],[0,1,0]] 代码如下 <html> <head> <title> 矩阵乘法 </title> <script srcset.js ><…

【解读】OWASP 大语言模型(LLM)安全测评基准V1.0

大语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;是指参数量巨大、能够处理海量数据的模型, 此类模型通常具有大规模的参数&#xff0c;使得它们能够处理更复杂的问题&#xff0c;并学习更广泛的知识。自2022 年以来&#xff0c;LLM技术在得到了广泛的应…

Selenium WebDriver API 中涉及的一些常用方法和类

Selenium WebDriver API 是 Selenium 提供的一组方法和类&#xff0c;用于控制浏览器和操作 Web 元素。这些 API 提供了丰富的功能&#xff0c;包括但不限于&#xff1a; 1. **查找元素**&#xff1a;通过不同的定位方式&#xff08;如ID、Class Name、XPath等&#xff09;在页…

C++学习随笔(1)——初识篇

前面一章我们简单介绍了一下C与C语言之间的关系&#xff0c;本章就让我们来正式入门学习一下C吧&#xff01; 目录 1.第一个C程序 2.头文件 &#xff08;1&#xff09;简介 &#xff08;2&#xff09;常见的头文件&#xff1a; 2. 命名空间 2.1 命名空间定义 2.2 命名空…

leetcode 热题 100_搜索二维矩阵

题解一&#xff1a; 二叉搜索树&#xff1a;从矩阵右上角观察&#xff0c;结构类似二叉搜索树&#xff0c;因此可以用类似的解法来做。具体做法是双指针从右上角开始&#xff0c;向左下角逐步搜索&#xff0c;如果当前值比目标值大&#xff0c;则向下移动&#xff0c;如果当前值…

了解 HTTPS 中间人攻击:保护你的网络安全

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

mybatis-plus整合spring boot极速入门

使用mybatis-plus整合spring boot&#xff0c;接下来我来操作一番。 一&#xff0c;创建spring boot工程 勾选下面的选项 紧接着&#xff0c;还有springboot和依赖我们需要选。 这样我们就创建好了我们的spring boot&#xff0c;项目。 简化目录结构&#xff1a; 我们发现&a…

Qt 实现诈金花的牌面值分析工具

诈金花是很多男人最爱的卡牌游戏 , 每当你拿到三张牌的时候, 生活重新充满了期待和鸟语花香. 那么我们如果判断手中的牌在所有可能出现的牌中占据的百分比位置呢. 这是最终效果: 这是更多的结果: 在此做些简单的说明: 炸弹(有些地方叫豹子) > 同花顺 > 同花 > 顺…

Day27:安全开发-PHP应用TP框架路由访问对象操作内置过滤绕过核心漏洞

目录 TP框架-开发-配置架构&路由&MVC模型 TP框架-安全-不安全写法&版本过滤绕过 思维导图 PHP知识点 功能&#xff1a;新闻列表&#xff0c;会员中心&#xff0c;资源下载&#xff0c;留言版&#xff0c;后台模块&#xff0c;模版引用&#xff0c;框架开发等 技…

安卓提示风险解决源码搭建教程

一&#xff0e;环境 1.安装Nginx 2.安装Tomcat8.5 3. 安装Mysql5.7 二&#xff0e;修改app已生成的文件下载地址 1.打开编辑config.properties 2.填写你的ip&#xff0c;端口不用修改 三&#xff0e;启动教程 启动命令&#xff1a;sh.start.sh 源码下载链接:https://p…

计算机网络 IP多播的概念

多播是让源主机一次发送的单个分组可以抵达用一个组地址表示的若干目的地址&#xff0c;即&#xff0c;一对多的通信。在互联网上进行的多播&#xff0c;称为IP多播。 与单播相比&#xff0c;在一对多的通信中&#xff0c;多播可以大大节约网络资源。 IP多播地址&#xff0c;…

ArrayDeque集合源码分析

ArrayDeque集合源码分析 文章目录 ArrayDeque集合源码分析一、字段分析二、构造函数分析方法、方法分析四、总结 实现了 Deque&#xff0c;说面该数据结构一定是个双端队列&#xff0c;我们知道 LinkedList 也是双端队列&#xff0c;并且是用双向链表 存储结构的。而 ArrayDequ…

【今日面经】24/3/9 广州Java某小厂电话面经

面经来源&#xff1a;https://www.nowcoder.com/?type818_1 目录 1、 和equals()有什么区别&#xff1f;2、String变量直接赋值和构造函数赋值比较相等吗&#xff1f;3、String一些方法&#xff1f;4、抽象类和接口有什么区别&#xff1f;5、Java容器有哪些&#xff1f;6、Lis…

Spring MVC | Spring MVC 的“核心类” 和 “注解”

目录: Spring MVC 的“核心类” 和 “注解” &#xff1a;1.DispatcherServlet (前端控制器)2.Controller 注解3.RequestMapping 注解3.1 RequestMapping 注解的 “使用”标注在 “方法” 上标注在 “类” 上 3.2 RequestMapping 注解的 “属性” 4.组合注解4.1 请求处理方法的…

哪些狗粮比较适合幼年犬?

亲爱的朋友&#x1f44b;&#xff0c;你为家中的幼年犬挑选狗粮可真是个贴心的主人呢&#xff01;选择适合幼年犬的狗粮&#xff0c;确实是个需要仔细考虑的问题。幼年犬处于生长发育的关键期&#xff0c;所以狗粮的营养成分和口感都非常重要。 &#x1f436; 在选择狗粮时&…

排序算法全景:从基础到高级的Java实现

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

CentOS系统上安装Redis操作教程

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

【Python+Selenium学习系列4】Selenium常用的方法

目录 一、前言 二、基本方法 1、send_keys方法---模拟键盘输入 1.1 源代码 1.2 运行结果 2、text方法---用于获取文本值 2.1 源代码 2.2 运行结果 3、get_attribute()方法---用于获取属性值 ​3.1 源代码 3.2 运行结果 ​4、maximize_window()方法---实现浏览器窗口…