我试图在一段时间内持续抓取单个网页以监控某些值以及它们在该期间内的变化情况
我没有网络抓取方面的经验,我对为什么我的 scrapy 蜘蛛运行一次并挂起感到有点困惑。
我正在尝试通过“main.py”脚本运行蜘蛛,如下所示:
timecheck = timeit.default_timer()
while (timecheck) < 30:
if __name__ == "__main__":
settings = get_project_settings()
crawler = CrawlerProcess(settings)
crawler.crawl(mySpider())
crawler.start(stop_after_crawl=False)
time.sleep(5)
print("Finished crawl, time elapsed: %s" % str(timecheck))
我的爬虫脚本如下:
class poeSpider(scrapy.Spider):
name = "spidername"
def start_requests(self):
urls = ["myurl.com/page1"]
allowed_domains = ["myurl.com"]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse, dont_filter=True)
def parse(self,response):
datavar = response.xpath("/mydata").extract()
print(datavar[:3])
PS:另一个问题,但相关:
我还希望在抓取之间将数据存储在某种列表或变量中,以便我能够在程序运行时比较这些值,理想情况下没有任何文件 I/O,这是我的理由使用 'main.py' 虽然我也不知道如何将蜘蛛的 parse
函数中的数据传递到任何我可以进行此类比较的地方。
最佳答案
您应该将逻辑保留在蜘蛛本身中:
import scrapy
import logging
import time
from scrapy import signals, Request
class MySpider(scrapy.Spider):
start_urls = ['first_url']
@classmethod
def from_crawler(cls, crawler, *args, **kwargs):
spider = super(MySpider, cls).from_crawler(crawler, *args, **kwargs)
crawler.signals.connect(spider.spider_idle, signals.spider_idle)
return spider
def parse(self, response):
# parse page
pass
def spider_idle(self, spider):
time.sleep(30)
# after 30 seconds crawl the same page again
logging.info('starting a crawl again!')
self.crawler.engine.schedule(Request(self.start_urls[0], dont_filter=True), spider)
raise DontCloseSpider
在这个例子中,当蜘蛛进入空闲状态后,它会冷静 30 秒,然后重新开始抓取 url,并不断重复这一过程,直到它被杀死或停止。
关于python-3.x - 重复地从相同的 url 中抓取数据,但有时间延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44906738/