【问题标题】:Dynamically adding domains to scrapy crawlspider deny_domains list将域动态添加到 scrapy crawlspider deny_domains 列表
【发布时间】:2012-05-18 17:17:36
【问题描述】:

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

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

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

附加似乎并没有停止爬行,但如果我用预期的特定域启动蜘蛛,那么它会按要求停止。所以我假设你不能在蜘蛛启动后更改 deny_domains 列表?

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

    最好的方法是在你的 Spider 类中维护你自己的dynamic_deny_domain 列表:

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

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

    应该做的伎俩。

    【讨论】:

      【解决方案2】:

      有什么事吗?

      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
      

      【讨论】:

        猜你喜欢
        • 2012-12-22
        • 2019-01-01
        • 2017-07-22
        • 1970-01-01
        • 1970-01-01
        • 2014-04-08
        • 1970-01-01
        • 1970-01-01
        • 2011-09-06
        相关资源
        最近更新 更多