[英]Scrapy CrawlSpider - add meta data to request
我正在研究一個CrawlSpider
,它獲取多個Domain
對象(它包含main_url
和name
- 域名)。 然后它為每個Domain
對象抓取整個頁面。
所以有一個Domain
為main_url = 'http://www.example.com'
name = 'example.com'
。 我需要為此domain
的每個響應獲取此domain
對象。 所以http://www.example.com
: http://www.example.com/x
: http://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.