我必须抓取5-6个域名。我想写一个爬虫,这样离线请求如果包含一些子字符串的例子设置为aaa,bbb,ccc,如果离线url包含来自上面设置的子字符串,那么它应该被处理,而不是过滤掉。我应该编写一个自定义中间件,或者我可以只在允许的域中使用正则表达式。
发布于 2016-08-23 18:26:05
默认情况下,异地中间件已经使用了regex,但它并未公开。它将您提供的域编译为正则表达式,但是域被转义,因此在allowed_domains
中提供正则表达式代码将不起作用。
但是,您可以做的是扩展中间件并覆盖get_host_regex()
方法来实现您自己的异地策略。
scrapy.spidermiddlewares.offsite.OffsiteMiddleware
中的原始代码
def get_host_regex(self, spider):
"""Override this method to implement a different offsite policy"""
allowed_domains = getattr(spider, 'allowed_domains', None)
if not allowed_domains:
return re.compile('') # allow all by default
regex = r'^(.*\.)?(%s)$' % '|'.join(re.escape(d) for d in allowed_domains if d is not None)
return re.compile(regex)
你可以直接重写返回你自己的正则表达式:
# middlewares.py
class MyOffsiteMiddleware(OffsiteMiddleware):
def get_host_regex(self, spider):
allowed_regex = getattr(spider, 'allowed_regex', '')
return re.compile(allowed_regex)
# spiders/myspider.py
class MySpider(scrapy.Spider):
allowed_regex = '.+?\.com'
# settings.py
DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.MyOffsiteMiddleware': 666,
}
https://stackoverflow.com/questions/39093211
复制相似问题