我想抓取一個網站,該網站每 5 分鐘抓取一次給定網頁的資訊。我通過在遞回回呼之間添加 5 分鐘的睡眠時間來實作這一點,如下所示:
def _parse(self, response):
status_loader = ItemLoader(Status())
# perform parsing
yield status_loader.load_item()
time.sleep(5)
yield scrapy.Request(response._url,callback=self._parse,dont_filter=True,meta=response.meta)
然而,將 time.sleep(5) 添加到刮板似乎會擾亂刮板的內部作業。出于某種原因,scrapy 確實發送了請求,但產量項沒有(或很少)輸出到給定的輸出檔案。
我在想這與scrapy的請求優先級有關,這可能會優先于發送新請求而不是產生被抓取的專案。可能是真的嗎?我嘗試編輯設定以從深度優先佇列變為廣度火力佇列。這并沒有解決問題。
我將如何去抓取一個給定數量的網站,比如說 5 分鐘?
uj5u.com熱心網友回復:
它不起作用,因為Scrapy默認情況下是異步的。
嘗試設定這樣的玉米作業 -
import logging
import subprocess
import sys
import time
import schedule
def subprocess_cmd(command):
process = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True)
proc_stdout = process.communicate()[0].strip()
logging.info(proc_stdout)
def cron_run_win():
# print('start scraping... ####')
logging.info('start scraping... ####')
subprocess_cmd('scrapy crawl <spider_name>')
def cron_run_linux():
# print('start scraping... ####')
logging.info('start scraping... ####')
subprocess_cmd('scrapy crawl <spider_name>')
def cron_run():
if 'win' in sys.platform:
cron_run_win()
schedule.every(5).minutes.do(cron_run_win)
elif 'linux' in sys.platform:
cron_run_linux()
schedule.every(5).minutes.do(cron_run_linux)
while True:
schedule.run_pending()
time.sleep(1)
cron_run()
這將根據os您使用的每 5 分鐘運行一次您想要的蜘蛛
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/483231.html
