1

我目前正在使用 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)

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

4

2 回答 2

1

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

  • 编写一个简单的下载器中间件
  • 这是一个简单的类,只有一个方法实现:process_request(request, spider):
  • 如果请求在您的列表中,则返回IgnoreRequest ,否则。spider.dynamic_deny_domainNone

然后将您的下载器MiddleWare添加到scrapy设置中的中间件列表的第一个位置 'myproject.downloadermiddleware.IgnoreDomainMiddleware': 50,

应该做的伎俩。

于 2012-10-18T23:37:02.413 回答
0

唉?

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-07-04T17:41:20.827 回答