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 参考资料
CrawlerProcess 官方文档:docs.scrapy.org/en/latest/topics/p....
Crontab 教程:linux.vbird.org/linux_basic/centos....
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: