我目前正在使用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列表?
答案 0 :(得分:1)
执行此操作的最佳方法是在Spider类中维护自己的dynamic_deny_domain
列表:
process_request(request, spider):
spider.dynamic_deny_domain
列表中,则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