我试图在一段时间内不断抓取一个网页,以监控某些值以及它们在该时间段内的变化情况
我没有网络抓取的经验,我有点困惑为什么我的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
函数中的数据传递到我可以进行此类比较的任何地方。
答案 0 :(得分:0)
你应该保持蜘蛛本身的逻辑:
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,并继续重复,直到它被杀死或停止。