反复从同一个URL抓取数据并延迟一段时间

时间:2017-07-04 12:59:19

标签: python-3.x web-scraping scrapy

我试图在一段时间内不断抓取一个网页,以监控某些值以及它们在该时间段内的变化情况

我没有网络抓取的经验,我有点困惑为什么我的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函数中的数据传递到我可以进行此类比较的任何地方。

1 个答案:

答案 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,并继续重复,直到它被杀死或停止。