Scrapy即使重定向也会在start_url中抓取所有网站

时间:2015-01-16 16:56:28

标签: python redirect scrapy web-crawler scrape

我正在尝试抓取一长串网站。 start_url列表中的一些网站重定向(301)。我希望scrapy从start_url列表中抓取重定向的网站,就像它们也在allowed_domain列表中一样(它们不是)。例如,example.com位于我的start_url列表中,允许域列表和example.com重定向到foo.com。我想抓住foo.com。

DEBUG: Redirecting (301) to <GET http://www.foo.com/> from <GET http://www.example.com>

我尝试在parse_start_url方法中动态添加allowed_domains并返回一个Request对象,以便scrapy在返回允许的域列表后返回并抓取重定向的网站,但我仍然得到:

 DEBUG: Filtered offsite request to 'www.foo.com'

以下是我尝试动态添加allowed_domains:

def parse_start_url(self,response):
    domain = tldextract.extract(str(response.request.url)).registered_domain
    if domain not in self.allowed_domains:
        self.allowed_domains.append(domain)
        return Request = (response.url,callback=self.parse_callback)
    else:
        return self.parse_it(response,1)

我的其他想法是尝试在spidermiddleware offsite.py中创建一个函数,它为源自start_urls的重定向网站动态添加allowed_domains,但我无法使该解决方案工作。

1 个答案:

答案 0 :(得分:2)

我找到了自己问题的答案。

我编辑了异地中间件,以便在过滤之前获取允许域的更新列表,并在parse_start_url方法中动态添加到允许的域列表。

我将此功能添加到OffisteMiddleware

def update_regex(self,spider):
    self.host_regex = self.get_host_regex(spider)

我还在OffsiteMiddleware

中编辑了这个功能
def should_follow(self, request, spider):
    #Custom code to update regex
    self.update_regex(spider)

    regex = self.host_regex
    # hostname can be None for wrong urls (like javascript links)
    host = urlparse_cached(request).hostname or ''
    return bool(regex.search(host))

最后,对于我的用例,我将此代码添加到我的蜘蛛

def parse_start_url(self,response):
    domain = tldextract.extract(str(response.request.url)).registered_domain
    if domain not in self.allowed_domains:
        self.allowed_domains.append(domain)
    return self.parse_it(response,1)

此代码将为重定向的任何start_urls添加重定向域,然后抓取这些重定向的网站。