Scrapy CrawlSpider - 添加要请求的元数据

时间:2018-02-14 14:07:08

标签: python scrapy

我正在使用CrawlSpider来获取多个Domain个对象(包含main_urlname - 域名)。然后它为每个Domain对象抓取整个页面。

因此Domainmain_url = 'http://www.example.com'name = 'example.com'。我需要为此域的每个响应获取此domain对象。所以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

你知道怎么做吗?而且,这还有另一个问题。它没有向parse_item方法发送第一个(根)网址响应。

2 个答案:

答案 0 :(得分:2)

我不知道你的最终目标是什么,但认为你可以这样做,创建dict 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)   

答案 1 :(得分:1)

我不确定第一个问题,但要解决第二个问题,您可以覆盖INSTALLED_APPS = [ ... 'pinax', 'pinax.notifications', ... ] 类的方法parse_start_url