将域动态添加到scrapy crawlspider deny_domains列表中

时间:2012-05-18 17:17:36

标签: python scrapy

我目前正在使用scrapy的CrawlSpider在多个start_urls列表中查找特定信息。我想要做的是在找到我查找的信息后停止抓取特定的start_url域名,这样它就不会继续命中域名而只会点击其他start_urls。

有办法做到这一点吗?我试过像这样附加deny_domains:

deniedDomains = []
...
rules = [Rule(SgmlLinkExtractor(..., deny_domains=(etc), ...)]
...
def parseURL(self, response):
    ...
    self.deniedDomains.append(specificDomain)

追加似乎不会停止抓取,但如果我使用预期的特定域启动蜘蛛,那么它将按要求停止。所以我假设在蜘蛛启动后你无法更改deny_domains列表?

2 个答案:

答案 0 :(得分:1)

执行此操作的最佳方法是在Spider类中维护自己的dynamic_deny_domain列表:

  • 写一个简单的Downloader Middleware
  • 这是一个简单的类,有一个方法实现:process_request(request, spider):
  • 如果请求在spider.dynamic_deny_domain列表中,则
  • 返回IgnoreRequest,否则返回None

然后在第一个位置将您的下载器兼容软件添加到Middleware list in scrapy settings 'myproject.downloadermiddleware.IgnoreDomainMiddleware': 50,

应该做的伎俩。

答案 1 :(得分:0)

Something ala?

from scrapy.contrib.spiders import CrawlSpider,Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor

class MySpider(CrawlSpider):
    name = "foo"
    allowed_domains = ["example.org"]
    start_urls = ["http://www.example.org/foo/",]

    rules = (
        Rule(SgmlLinkExtractor(
            allow=('/foo/[^/+]',),
            deny_domains=('example.com',)),
        callback='parseURL'),
        )

    def parseURL(self, response):

        # here the rest of your code