gpt4 book ai didi

python - Scrapy CrawlSpider - 添加元数据到请求

转载 作者:行者123 更新时间:2023-11-30 22:20:38 26 4
gpt4 key购买 nike

我正在开发一个 CrawlSpider ,它获取多个 Domain 对象(它包含 main_urlname -域名)。然后它会抓取整个页面的每个 Domain 对象。

因此有一个 Domain ,其 main_url = 'http://www.example.com'name = 'example.com' >。我需要为该域的每个响应获取该域对象。所以http://www.example.comhttp://www.example.com/xhttp://www.example.com/x/x/y/

因此,每次我解析来自该域的响应时,我都会得到特定的 Domain 对象。

问题是它在rules = ()内是不可行的

class MainSpider(CrawlSpider):
name = 'main_spider'
rules = (
Rule(LinkExtractor(), callback='parse_item', follow=True,),
)

def start_requests(self):
for d in Domain.objects.all():
self.allowed_domains.append(d.name)
yield scrapy.Request(d.main_url,callback=self.parse,meta={'domain':d})


def parse_item(self, response):
# I need to get `Domain` object for all responses

你知道该怎么做吗?此外,这还有一个问题。它不会将第一个(根)URL 响应发送到 parse_item 方法。

最佳答案

我不知道你的最终目标是什么,但我认为你可以做到这一点,创建字典 all_responses 并在抓取每个 URL 后,将其作为 url 放入字典中> 是关键。

您可以使用self.all_responses["MY_LINK_HERE"]根据链接访问任何域对象。

class MainSpider(CrawlSpider):
name = 'main_spider'
rules = (
Rule(LinkExtractor(), callback='parse_item', follow=True,),
)

all_responses = {}

def start_requests(self):
for d in Domain.objects.all():
self.allowed_domains.append(d.name)
yield scrapy.Request(d.main_url,callback=self.parse,meta={'domain':d})


def parse_item(self, response):
self.all_responses[response.url] = response.meta['domain']

我认为不要使用Rule类,而是使用LinkExtractor,这样您就可以自由地随请求发送meta变量。

或者这样做,

from scrapy.linkextractors import LinkExtractor
extractor = LinkExtractor(allow_domains="www.website.com")
links = extractor.extract_links(response)
for link in links:
yield scrapy.Request(link.url, callback=self.my_callback)

关于python - Scrapy CrawlSpider - 添加元数据到请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48789173/

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