我正在尝试抓取一长串网站。 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,但我无法使该解决方案工作。
答案 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添加重定向域,然后抓取这些重定向的网站。