簡體   English   中英

Scrapy CrawlSpider - 添加要請求的元數據

[英]Scrapy CrawlSpider - add meta data to request

我正在研究一個CrawlSpider ,它獲取多個Domain對象(它包含main_urlname - 域名)。 然后它為每個Domain對象抓取整個頁面。

所以有一個Domainmain_url = 'http://www.example.com' name = 'example.com' 我需要為此domain的每個響應獲取此domain對象。 所以http://www.example.com : http://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

你知道怎么做嗎? 而且,這還有另一個問題。 它不會向parse_item方法發送第一個(根)url響應。

我不知道你的最終目標是什么,但認為你可以做到這一點,創建dict all_responses並在每個URL被all_responses后,將其放入字典中,因為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)   

我不確定第一個問題,但要解決第二個問題,你可以覆蓋CrawlSpider類的方法parse_start_url

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM