首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Scrapy -基于正则表达式处理的异地请求

Scrapy -基于正则表达式处理的异地请求
EN

Stack Overflow用户
提问于 2016-08-23 13:46:15
回答 1查看 579关注 0票数 0

我必须抓取5-6个域名。我想写一个爬虫,这样离线请求如果包含一些子字符串的例子设置为aaa,bbb,ccc,如果离线url包含来自上面设置的子字符串,那么它应该被处理,而不是过滤掉。我应该编写一个自定义中间件,或者我可以只在允许的域中使用正则表达式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-23 18:26:05

默认情况下,异地中间件已经使用了regex,但它并未公开。它将您提供的域编译为正则表达式,但是域被转义,因此在allowed_domains中提供正则表达式代码将不起作用。

但是,您可以做的是扩展中间件并覆盖get_host_regex()方法来实现您自己的异地策略。

scrapy.spidermiddlewares.offsite.OffsiteMiddleware中的原始代码

代码语言:javascript
运行
复制
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)

你可以直接重写返回你自己的正则表达式:

代码语言:javascript
运行
复制
# 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,
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39093211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档