Scrapy 爬取不同网站及自动运行的经验分享

距离上一篇博客的分享已经过去…嗯,好久时间了,最近在玩爬虫,分享一点个人的经验。

1 问题

最近接到一个需求,要写一个爬虫程序:

  • 需要抓取不同网站的数据,举例如同时抓取「淘宝」、「京东」商品详情页。
  • 需要将数据存入到数据库中,抓取完成后对数据进行简单分析处理。
  • 需要将爬虫日志、统计信息及数据分析结果发送到指定邮箱。
  • 需要定期自动执行。

2 分析整理

我计划使用 Scrapy 框架来写爬虫程序实现:

  • Scrapy 中不同 Spider 解析不同的网页,可实现不同网站的抓取;
  • Scrapy 中可通过 Pipeline 实现数据库的写入操作;
  • 可在 Scrapy 一级目录下写分析模块实现数据分析功能;
  • 可借助于 CrawlerProcess 实现 multi spider 运行;
  • 将所有功能整合进 run.py 中,使用 Linux 中的 crontab 实现自动运行。

最终的程序目录结构如下:

├── Pipfile
├── Pipfile.lock
├── README.md
├── run.py
├── scrapy.cfg
└── ScrapyTest
    ├── __init__.py
    ├── items.py
    ├── middlewares.py
    ├── pipelines.py
    ├── settings.py
    └── spiders
        └── __init__.py
        └── taobao.py
        └── jingdong.py
└── utils
    ├── __init__.py 
    ├── db.py 
    ├── email.py
    ├── preanalysis.py
    ├── settings.py

说明:这里使用的的 Python 环境管理工具是 pipenv,最终部署环境是在一台 CentOS 服务器上。

3 具体实现

因为只是举例说明下思路,所以并没有给出完整的代码,主要分享的是运行的脚本 run.py 以及在 CentOS 中自动运行的处理。

3.1 run.py

from scrapy import spider_loader
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings

from utils.email import send_email
from utils.preanalysis import analysis

def run_spider():
    '''
    运行爬虫
    '''
    settings = get_project_settings()
    process  = CrawlerProcess(settings)
    spider_loader = spiderloader.SpiderLoader.from_settings(settings)

    # 将 spider 逐个添加到 CrawlerProcess 实例及 crawlers 列表中
    crawlers = []
    for spider in spider_loader.list():
        logger.info(f'Running spider {spider}')
        crawler = process.create_crawler(spider)
        crawlers.append(crawler)
        process.crawl(crawler)

    # 开始爬虫
    process.start()

    # 获取爬虫的统计信息
    stats_dict = {}
    for crawler in crawlers:
       stats_dict[crawler.spider.name] = crawler.stats.get_stats()

    return stats_dict

def main():
    # 运行爬虫
    spider_stats = run_spider()

    # 对结果进行简单分析处理
    analysis_stats = analysis()

    # 发送结果到指定邮箱
    send_email(analysis_stats, spider_stats)

if __name__ == "__main__":
    main()

3.2 实现自动运行

由于是部署在 Linux 服务器上,可借助 cron 来实现自动运行的功能。

cron (crond) 是用于控制循环工程排程的系统服务,可通过 crontab 指令建立自己的例行工作排程:

# 新建排程
$ crontab -e
# 此时会进入 vi 的编辑画面让您编辑工作!注意到,每项工作都是一行。
5   5 *  *  1 bash /pathto/auto-spider.sh
#分 时 日 月 周 |<==============指令串========================>|
# 查看排程
$ crontab -l
5   5 *  *  1 bash /pathto/auto-spider.sh

这里的意思时每周一五点零五分运行 auto-spider.sh ~ 这里不是直接运行 run.py 而是运行一个 auto-spider.sh 脚本 ~ 是为了在 Python 虚拟环境中运行爬虫程序。

auto-spider.sh 脚本示例如下:

cd /pathto/ScrapyTest
PATH=/usr/local/bin:$PATH
pipenv run python run.py

4 参考资料

  1. CrawlerProcess 官方文档:docs.scrapy.org/en/latest/topics/p....

  2. 参考案例:stackoverflow.com/questions/393651....

  3. Crontab 教程:linux.vbird.org/linux_basic/centos....

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!