我正在使用Crawler
获取域名列表,并且每个域都会计算此页面上的网址数量。
我为此目的使用CrawlSpider
但是存在问题。
当我开始抓取时,似乎会向多个域发送多个请求,但在一段时间(一分钟)后,它会结束抓取一个页面(域)。
设置
CONCURRENT_REQUESTS = 100
CONCURRENT_REQUESTS_PER_DOMAIN = 3
REACTOR_THREADPOOL_MAXSIZE = 20
在这里,您可以看到为特定域抓取了多少网址:
7分钟后 - 正如您所看到的那样,它只针对第一个域名而忘记了其他域名
如果scrapy一次只针对一个域,它在逻辑上会减慢进程。我想在短时间内向多个域发送请求。
class MainSpider(CrawlSpider):
name = 'main_spider'
allowed_domains = []
rules = (
Rule(LinkExtractor(), callback='parse_item', follow=True, ),
)
def start_requests(self):
for d in Domain.objects.all():
self.allowed_domains.append(d.name)
yield scrapy.Request(d.main_url, callback=self.parse_item, meta={'domain': d})
def parse_start_url(self, response):
self.parse_item(response)
def parse_item(self, response):
d = response.meta['domain']
d.number_of_urls = d.number_of_urls + 1
d.save()
extractor = LinkExtractor(allow_domains=d.name)
links = extractor.extract_links(response)
for link in links:
yield scrapy.Request(link.url, callback=self.parse_item,meta={'domain': d})
它似乎只关注第一个域,直到它没有全部删除。