我从数千个网页获取更新。可以有多个具有相同域的页面。我已将DOWNLOAD_DELAY
设置为1秒,所以我不会超载服务器。如何更改Scrapy蜘蛛网站的订单?
蜘蛛效果很好,但是如果有100个相同域名的网站彼此相邻,它会减慢爬行速度,因为蜘蛛必须在每次请求后等待1秒。
是否有可能使其抓取具有不同域名的下一个网址,因此Spider无需等待?
例如:
CONCURRENT_REQUESTS = 3
DOWNLOAD_DELAY = 1
URLS:A.com/1,A.com/2,A.com/3,A.com/4,B.com/1,B.com/2,B.com/3
蜘蛛将开始抢先前三个网址。由于下载延迟,它至少需要三秒钟的时间。但如果它处理了B.com/1而不是A.com/2(例如),它会更快。
class MainSpider(scrapy.Spider):
...
def __init__(self, scraping_round, frequencies=None):
super(MainSpider, self).__init__())
...
def start_requests(self):
for url in self.urls:
yield scrapy.Request(url=url, callback=self.parse, errback=self.err, dont_filter=True)
也许我应该重新订购urls
列表。
谢谢你的答案。我已经把并发请求设置为100,但在问题中是3作为一个简单的例子。但我可以从列表中的相同域相邻的2000个URL,因此100对我无能为力。我可能会随机排队或按域分组。弗隆特拉看起来不错,但这不是矫枉过正吗?或者,如果你愿意,你可以在这里张贴一个与frontera和我的蜘蛛的例子吗? –
是的,如果你有来自同一个域的那么多网址,它们会帮助你很多的随机化。在您的URL列表中调用'random.shuffle'应该可以做到这一点(https://docs.python.org/2/library/random.html#random.shuffle)。 – rrschmidt
Frontera将有助于排除最后一点的并行性,但是随机化列表对于您的目的而言是足够的。 – rrschmidt