gpt4 book ai didi

web-scraping - 在 scrapy.Request 中添加 dont_filter=True 参数如何使我的解析方法起作用?

转载 作者:行者123 更新时间:2023-12-04 17:44:49 90 4
gpt4 key购买 nike

这是一个简单的爬虫蜘蛛

import scrapy

class ExampleSpider(scrapy.Spider):
name = "dmoz"
allowed_domains = ["https://www.dmoz.org"]
start_urls = ('https://www.dmoz.org/')

def parse(self,response):
yield scrapy.Request(self.start_urls[0],callback=self.parse2)

def parse2(self, response):
print(response.url)

当您运行程序时,parse2 方法不起作用并且它不打印 response.url。然后我在下面的线程中找到了解决方案。

Why is my second request not getting called in the parse method of my scrapy spider

只是我需要在请求方法中添加 dont_filter=True 作为参数以使 parse2 函数工作。
yield scrapy.Request(self.start_urls[0],callback=self.parse2,dont_filter=True)

但是在scrapy文档和许多youtube教程中给出的示例中,他们从未在scrapy.Request方法中使用dont_filter = True参数,并且他们的第二个解析函数仍然有效。

看看这个
def parse_page1(self, response):
return scrapy.Request("http://www.example.com/some_page.html",
callback=self.parse_page2)

def parse_page2(self, response):
# this would log http://www.example.com/some_page.html
self.logger.info("Visited %s", response.url)

为什么除非添加 dont_filter=True 否则我的蜘蛛不能工作?我究竟做错了什么 ?我的蜘蛛在第一个示例中过滤的重复链接是什么?

附言我本可以在上面发布的 QA 线程中解决这个问题,但除非我有 50 名声望(可怜的我!!)

最佳答案

简答:您正在提出重复的请求。 Scrapy 内置了重复过滤,默认情况下是打开的。这就是为什么parse2不会被调用。当您添加 dont_filter=True 时,scrapy 不会过滤掉重复的请求。所以这次请求被处理了。

加长版:

在 Scrapy 中,如果你设置了 start_urls或者有方法start_requests()定义后,蜘蛛会自动请求这些 url 并将响应传递给 parse method 是用于解析请求的默认方法。现在你可以从这里产生新的请求,这些请求将再次被 Scrapy 解析。如果不设置回调,parse方法将再次使用。如果您设置了回调,则将使用该回调。

Scrapy 还有一个内置过滤器,可以阻止重复的请求。也就是说,如果 Scrapy 已经抓取了一个站点并解析了响应,即使您使用该 url 产生另一个请求,scrapy 也不会处理它。

在您的情况下,您的网址位于 start_urls . Scrapy 从那个 url 开始。它抓取站点并将响应传递给 parse .里面parse方法,你再次向同一个 url 发出请求(scrapy 刚刚处理过),但这次是 parse2作为回调。当此请求被产生时,scrapy 将其视为重复。所以它忽略请求并且从不处理它。所以没有调用 parse2制作。

如果您想控制应该处理哪些网址以及使用哪个回调,我建议您覆盖 start_requests()并返回 scrapy.Request 的列表而不是使用单个 start_urls属性。

关于web-scraping - 在 scrapy.Request 中添加 dont_filter=True 参数如何使我的解析方法起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38951878/

90 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com