在 Scrapy 蜘蛛中动态添加 allowed_domains

2023-12-01

我有一个蜘蛛,它以一小部分列表开头allowed_domains在蜘蛛爬行的开始。当蜘蛛抓取从解析器内继续时,我需要动态地将更多域添加到此白名单中,但由于后续请求仍在过滤中,因此以下代码段无法完成此操作。还有更新的吗allowed_domains在解析器内?

class APSpider(BaseSpider):
name = "APSpider"

allowed_domains = ["www.somedomain.com"]

start_urls = [
    "http://www.somedomain.com/list-of-websites",
]

...

def parse(self, response):
    soup = BeautifulSoup( response.body )

    for link_tag in soup.findAll('td',{'class':'half-width'}):
        _website = link_tag.find('a')['href']
        u = urlparse.urlparse(_website)
        self.allowed_domains.append(u.netloc)

        yield Request(url=_website, callback=self.parse_secondary_site)

...

(在写下这个答案的同时,最新版本scrapy is 1.0.3。这个答案适用于所有最新版本scrapy)

As the OffsiteMiddleware读取内容allowed_domains仅在处理预编译的正则表达式对象时初始化spider_opened信号,值在allowed_domains以后永远不会被访问。
因此只需更新内容allowed_domains并不能解决问题。

基本上,需要两个步骤:

  1. 更新内容allowed_domains根据您的实际需要。
  2. 有正则表达式缓存OffsiteMiddleware神清气爽。

这是我用于步骤 #2 的代码:

# Refresh the regex cache for `allowed_domains`
for mw in self.crawler.engine.scraper.spidermw.middlewares:
    if isinstance(mw, scrapy.spidermiddlewares.offsite.OffsiteMiddleware):
        mw.spider_opened(self)

上面的代码应该在响应回调中调用,因此self这里是蜘蛛类的一个实例。

也可以看看:

  • 的源代码scrapy.spidermiddlewares.offsite.OffsiteMiddleware在 GitHub 上
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Scrapy 蜘蛛中动态添加 allowed_domains 的相关文章

随机推荐