![](/img/trans.png)
[英]Scrapy CrawlSpider doesn't scrape with callback = 'parse_page'
[英]Scrapy CrawlSpider retry scrape
對於我要抓取的頁面,有時會在響應中返回一個“占位符”頁面,其中包含一些會自動重新加載直到獲取真實頁面的JavaScript。 我可以檢測到何時發生這種情況,我想重試下載並抓取頁面。 我在CrawlSpider中使用的邏輯類似於:
def parse_page(self, response):
url = response.url
# Check to make sure the page is loaded
if 'var PageIsLoaded = false;' in response.body:
self.logger.warning('parse_page encountered an incomplete rendering of {}'.format(url))
yield Request(url, self.parse, dont_filter=True)
return
...
# Normal parsing logic
但是,似乎當調用重試邏輯並發出新的請求時,頁面及其包含的鏈接不會被爬網或刮擦。 我的想法是,通過使用self.parse
用於應用爬網規則的dont_filter=True
和dont_filter=True
,我可以避免使用重復的過濾器。 但是,如果DUPEFILTER_DEBUG = True
,我可以看到重試請求已被過濾掉。
我是否缺少某些東西,或者有更好的方法來解決這個問題? 我想避免使用splash之類的方法進行動態js渲染的復雜性,並且這種情況只會間歇性地發生。
我會考慮使用自定義的Retry Middleware ,它類似於內置的 。
示例實現(未經測試):
import logging
logger = logging.getLogger(__name__)
class RetryMiddleware(object):
def process_response(self, request, response, spider):
if 'var PageIsLoaded = false;' in response.body:
logger.warning('parse_page encountered an incomplete rendering of {}'.format(response.url))
return self._retry(request) or response
return response
def _retry(self, request):
logger.debug("Retrying %(request)s", {'request': request})
retryreq = request.copy()
retryreq.dont_filter = True
return retryreq
並且不要忘記激活它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.