【发布时间】:2019-11-20 19:14:39
【问题描述】:
我有一个 scrapy 项目,它使用来自不同域的 URL 列表作为种子,但是对于任何给定的页面,我只想关注与该页面的 URL 相同域中的链接(所以通常的 LinkExtractor(accept='example.com') 方法不会'行不通。我很惊讶我在网上找不到解决方案,因为我希望这是一项常见的任务。我能想到的最好的就是在蜘蛛文件中并在规则:
class CustomLinkExtractor(LinkExtractor):
def get_domain(self, url):
# https://stackoverflow.com/questions/9626535/get-protocol-host-name-from-url
return '.'.join(tldextract.extract(url)[1:])
def extract_links(self, response):
domain = self.get_domain(response.url)
# https://stackoverflow.com/questions/40701227/using-scrapy-linkextractor-to-locate-specific-domain-extensions
return list(
filter(
lambda link: self.get_domain(link.url) == domain,
super(CustomLinkExtractor, self).extract_links(response)
)
)
但这不起作用(蜘蛛离开域)。
现在我正在尝试使用规则中的 process_request 选项:
rules = (
Rule(LinkExtractor(deny_domains='twitter.com'),
callback='parse_response',
process_request='check_r_r_domains',
follow=True,
),
)
和
def check_r_r_domains(request, response):
domain0 = '.'.join(tldextract.extract(request.url)[1:])
domain1 = '.'.join(tldextract.extract(response.url)[1:])
log('TEST:', domain0, domain1)
if (domain0 == domain1) and (domain0 != 'twitter.com'):
return request
log(domain0, ' != ', domain1)
return None
但我得到了一个异常,因为它将self 传递给方法(蜘蛛没有url 属性);当我将self 添加到方法签名时,我得到一个异常,即缺少response 位置参数!如果我将回调更改为process_request=self.check_r_r_domains,我会收到一个错误,因为在我设置rules 的位置没有定义self!
【问题讨论】:
标签: python-3.x web-scraping scrapy web-crawler domain-name