php建设网站,wordpress自动采集手动写,直接在原备案号下增加新网站,无锡市政建设集团有限公司网站目录
我们的post请求爬取百度翻译的代码
详细解释
解释一
解释二
再说一下callback
总结 发现了很多人对存在有yield的代码都不理解#xff0c;那就来详细的解释一下 我们的post请求爬取百度翻译的代码
import scrapy
import jsonclass TestpostSpider(scrapy.Spider):…
目录
我们的post请求爬取百度翻译的代码
详细解释
解释一
解释二
再说一下callback
总结 发现了很多人对存在有yield的代码都不理解那就来详细的解释一下 我们的post请求爬取百度翻译的代码
import scrapy
import jsonclass TestpostSpider(scrapy.Spider):name testpostallowed_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/sugdata {kw: final}yield scrapy.FormRequest(urlurl, formdatadata, callbackself.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格式并打印出来。
详细解释 import scrapy 和 import json导入Scrapy框架和JSON库。 class TestpostSpider(scrapy.Spider):定义一个名为TestpostSpider的Spider类该类继承自Scrapy的Spider类。 name testpost指定爬虫的名称为testpost。 allowed_domains [fanyi.baidu.com]设置允许爬取的域名为fanyi.baidu.com。 def start_requests(self):定义一个方法用于生成初始请求。 url https://fanyi.baidu.com/sug设置目标URL为百度翻译的sug API。 data {kw: final}构造POST请求的表单数据其中kw参数的值为final。 yield scrapy.FormRequest(urlurl, formdatadata, callbackself.parse_second)使用scrapy.FormRequest生成POST请求并指定回调函数为parse_second。yield关键字用于生成请求对象使得Scrapy能够异步处理请求。 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(urlurl, formdatadata, callbackself.parse_second) 这句代码是在start_requests方法中使用yield关键字创建了一个scrapy.FormRequest对象并将其返回。scrapy.FormRequest表示一个POST请求可以指定请求的URL、表单数据和回调函数。
urlurl指定请求的URL为url变量的值即https://fanyi.baidu.com/sug。formdatadata指定请求的表单数据为data变量的值即{kw: final}。callbackself.parse_second指定请求完成后的回调函数为parse_second方法。当请求完成后Scrapy会将响应传递给parse_second方法进行处理。 通过使用yield关键字返回scrapy.FormRequest对象该对象将被Scrapy的引擎接收并执行。这样Scrapy将会发送POST请求到指定的URL并在获取到响应后调用parse_second方法进行处理。
解释二
这句代码使用了scrapy.FormRequest来生成一个POST请求。
yield scrapy.FormRequest(urlurl, formdatadata, callbackself.parse_second)urlurl指定请求的目标URL即要发送POST请求的地址这里是百度翻译的suggest API。 formdatadata设置POST请求的表单数据这是一个字典其中键值对表示表单中的字段和相应的值。在这个例子中kw: final是表单中的一个字段和值。 callbackself.parse_second指定了请求成功后的回调函数即在收到响应后要执行的函数。在这里回调函数是parse_second该函数会处理服务器返回的响应。 yield这是关键的异步操作部分。通过使用yieldScrapy能够以异步的方式处理请求而不会阻塞程序的执行。这使得程序能够同时发送多个请求并处理它们的响应提高了效率。 总体来说这一行代码的作用是生成一个POST请求发送到指定的URL携带特定的表单数据并在成功获取响应后调用parse_second函数进行处理。使用yield确保了异步操作使得爬虫能够高效地处理多个请求。
再说一下callback
例子
import scrapyclass ExampleSpider(scrapy.Spider):name examplestart_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(urlnext_page, callbackself.parse)callbackself.parse 的部分指定了在新请求完成后应该调用的回调函数也就是处理新响应的方法。在这个例子中回调函数是 parse 方法。 在 Scrapy 中parse 是默认的回调函数名称用于处理初始请求的响应。当新请求被生成并完成后Scrapy 将调用指定的回调函数来处理新的响应。这种设计使得爬虫能够以递归的方式处理多个页面特别是在需要翻页时。 在翻页的情况下通过 yield scrapy.Request(urlnext_page, callbackself.parse) 生成了一个新的请求对象这个请求对象将发送到下一页的 URL。当这个请求完成后它的响应会由 parse 方法处理从而实现了对多个页面的异步爬取。 你也可以定义其他的回调函数来处理不同的请求或响应这取决于你的爬虫需求。例如你可以为处理详情页的响应定义一个独立的回调函数然后在生成请求时指定相应的回调函数。
总结 yield 在 Python 中有两个主要的用途作为生成器generator的一部分和在异步编程中用于生成异步操作的结果。在 Scrapy 中yield 主要用于异步爬取的场景其中最常见的用法是生成请求对象和处理响应。
在 Scrapy 中yield 通常用于 生成请求对象 使用 yield 生成包含新请求的请求对象使得 Scrapy 能够异步地发送和处理多个请求。这在处理翻页、跟踪链接等情况下非常常见。例如 yield scrapy.Request(urlhttp://example.com/page1, callbackself.parse_page) 处理响应 使用 yield 生成爬取到的数据允许 Scrapy 异步地处理和保存数据。这通常发生在回调函数中。例如 yield { title: response.css(h1::text).get(), content: response.css(div.article::text).get(), } 异步操作 yield 在异步编程中用于生成异步操作的结果允许程序在等待异步操作完成的同时执行其他任务。 总的来说yield 在 Scrapy 中的使用是为了利用异步特性允许爬虫同时执行多个任务而不阻塞提高了爬虫的效率。它被用于生成请求、处理响应、以及在异步编程中生成异步操作的结果。