2017-03-09 31 views
3

我正在嘗試配置scrapy以關注外部鏈接。爲不同領域增加scrapy的爭議?

與此同時,我有DOWNLOAD_DELAY = 3,所以這是禮貌的服務器。

是否有配置scrapy立即開始和並行下載外部鏈接的方法嗎?

從日誌看來,外部鏈接與內部鏈接位於同一隊列中。

我的蜘蛛是:

16 class RedditSpider(scrapy.Spider): 
17  name = "reddit" 
18  start_urls = ['https://www.reddit.com/'] 
19 
20  def parse(self, response): 
21   digest = hashlib.md5(response.body).hexdigest() 
22   if pages.find_one({'digest': digest}): 
23    return 
24   links = LinkExtractor(allow=()).extract_links(response) 
25   urls = [l.url for l in links] 
26   pages.insert_one({ 
27    'digest': digest, 
28    'url': response.url, 
29    'links': urls, 
30    'body': response.text 
31   }) 
32   for url in urls: 
33    yield scrapy.Request(url, callback=self.parse) 

回答

1

是,scrapy通常刮並行的網頁。有這些設置,你可以在你的scrapy項目的settings.py修改/清除:

  • CONCURRENT_REQUESTS
  • CONCURRENT_REQUESTS_PER_DOMAIN

(見https://doc.scrapy.org/en/latest/topics/settings.html#concurrent-requests

推薦值:

應設置CONCURRENT_REQUESTS_PER_DOMAIN不要太高以對服務器禮貌(例如,低單個數字),CONCURRENT_REQUESTS應該儘可能高(不會耗盡內存)...所以在這裏建議超過100的值。

不幸的是在scrapy排隊是不完美的,如果你有超過CONCURRENT_REQUESTS對您的隊列的最高點相同的域(如書籤交易)較多,這些將阻止其他請求的並行處理,直到足夠的人有已經處理並且第一個外部域被分配給處理槽。

因此,讓CONCURRENT_REQUESTS值儘可能高是關鍵。