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 协议》,转载必须注明作者和本文链接
          
          
          
                关于 LearnKu
              
                    
                    
                    
 
推荐文章: