[英]How to increase Scrapy crawling speed when there are many duplicates links
我正在使用 Scrapy 來抓取一個包含數百萬個頁面的網站,我需要關注這些頁面並從中提取信息。
爬蟲目前每分鍾只能抓取 200 頁,我需要加快速度。
對於每個頁面,爬蟲都會提取其鏈接並跟蹤它們。 問題是每個頁面都有大約 600 個鏈接,其中大部分都在所有頁面上,我認為這就是為什么爬蟲要花這么長時間才能為所有鏈接調用請求函數的原因,即使它們是重復的。
這是我的代碼的簡化版本:
def parse_data(self, response):
item = URL()
outlinks_extrated = [l.url for l in LinkExtractor(allow_domains=self.allowed_domains, deny_extensions = self.reg_deny, unique=False, restrict_xpaths=self.xpath_outlinks, tags=self.tags, deny = self.regex_denied).extract_links(response)]
for url in outlinks_extrated:
yield scrapy.Request(url, callback=self.parse_data)
item['url'] = response.request.url
yield item
我已經嘗試設置每個域的並發請求和並發請求,但沒有用。
有誰知道為什么爬行需要這么長時間,我該如何加快速度?
如果我正確理解您,您遇到的問題之一是重復鏈接。 為什么不簡單地解析一組鏈接並檢查您要針對該集合解析的所有鏈接? 這就是我的意思:
links_visited = set()
def parse_data(self, response):
item = URL()
outlinks_extrated = [l.url for l in LinkExtractor(allow_domains=self.allowed_domains, deny_extensions = self.reg_deny, unique=False, restrict_xpaths=self.xpath_outlinks, tags=self.tags, deny = self.regex_denied).extract_links(response)]
for url in outlinks_extrated:
if url not in links_visited:
yield scrapy.Request(url, callback=self.parse_data)
links_visited.add(url)
item['url'] = response.request.url
yield item
這樣您就可以確保您不會重新訪問 URL。
編輯:也許更好的解決方案是實例化scrapy.Request
一次; 這樣您就可以使用dont_filter
參數(查看https://docs.scrapy.org/en/latest/topics/request-response.html了解更多信息;默認情況下您的請求將被過濾,因此您不會訪問重復的網址)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.