爬淘宝的商品信息下 (下) -- 实现定时任务爬取

爬淘宝的商品信息下 (下) -- 实现定时任务爬取

上回我们讲到用scrapy爬取淘宝的商品信息, 今天的任务是实现爬虫的周期作业功能。商品信息的交易量评论数,等等,会处在变动之中,因此需要爬虫能够在每天预设的时间爬取网页。

假设,我们现在的任务是,要爬虫在凌晨3点,也就是 每天的凌晨3:00,(对,就是那个月黑风高,四下无人的夜晚,悄悄的,爬虫它来了,然后悄悄地又走了,)进行一次爬取任务。

main.py就是我们要写的文件,话说,scrapy爬虫,不一定非得要用scrapy命令才能去调用,我们可以直接从脚本中调用,嗯,很好,狠喜欢。

整个scrapy项目的结构如下所示,看到main.py了吗?没错,直接放在根目录下就可以了,妥妥的,就是这么简单

D:CodeTB>tree /f
文件夹 PATH 列表
卷序列号为 0000007D E659:980C
D:.
│  main.py
│  scrapy.cfg
│
├─.idea
│  │  misc.xml
│  │  modules.xml
│  │  TB.iml
│  │  workspace.xml
│  │
│  └─inspectionProfiles
│          profiles_settings.xml
│
├─results
│      result.2017-05-11.csv
│
└─TB
    │  items.py
    │  middlewares.py
    │  pipelines.py
    │  settings.py
    │  __init__.py
    │
    ├─spiders
    │  │  taobao.py
    │  │  __init__.py
    │  │
    │  └─__pycache__
    │          taobao.cpython-36.pyc
    │          __init__.cpython-36.pyc
    │
    └─__pycache__
            items.cpython-36.pyc
            pipelines.cpython-36.pyc
            settings.cpython-36.pyc
            __init__.cpython-36.pyc

下面直接上mian.py的代码,废话不多说

from scrapy.utils.project import get_project_settings
from scrapy.crawler import CrawlerRunner
from scrapy.utils.log import configure_logging
from twisted.internet import reactor
from apscheduler.schedulers.background import BlockingScheduler

import multiprocessing

scheduler = BlockingScheduler()


def release_spiders():
    configure_logging({'LOG_FORMAT': '%(levelname)s: %(message)s'})
    settings = get_project_settings()
    runner = CrawlerRunner(settings)
    for spider in runner.spider_loader.list():
        runner.crawl(spider)
    d = runner.join()
    d.addBoth(lambda _: reactor.stop())
    reactor.run()


@scheduler.scheduled_job('cron', hour=3, minute=0, id="daily_crawl")
def run():
    process = multiprocessing.Process(target=release_spiders)
    process.start()


if __name__ == "__main__":
    scheduler.start()

除了scrapy以外,还用到了多进程multiprocess包,定时任务调度apscheduler包,貌似前一个包,默认就有,而后面一个,要自己安装的。。。。

为什么要开启多进程。。。。?你以为我想啊,折腾了好久,发现如果不开多进程的话,webdriver不会自动关闭,而且,pipline中的数据存储也不工作,神烦啦!。。。。。。。所以,还是再开个进程,让定时任务和爬取任务分开,各玩各的!

@scheduler.scheduled_job('cron', hour=3, minute=0, id="daily_crawl") 这个地方就是设置定时任务的执行时间点,24小时制,所以,会在每日的凌晨3点0分,进行一次爬取任务,半夜人少,网速快,偷偷地,刺激,没毛病。

好了,就这样了,具体代码,已经上传到github了,下载地址https://github.com/Levstyle/TaobaoSpider, 只要执行main.py代码文件即可

如果有毛病,请直接跟俺说啊,反正我也不会改的

原文地址:https://www.cnblogs.com/crackpotisback/p/6840772.html