在crontab中执行scrapy(解决不执行,不爬取数据的问题)

在crontab中执行scrapy会遇到命令不执行,或者执行了但是没有爬取数据的问题,这里做一下总结

  1. 先说这里遇到的问题和解决方案:
    1. spider不执行:在crontab中需要先cd到项目目录,然后调用命令,否则找不到爬虫
    2. 执行scrapy的时候需要调用/usr/local/bin/scrapy crawl spider_name,否则找不到scrapy命令
  2. 如何使用crontab做爬取:这里有2种方式,一种是直接在crontab中执行scrapy crawl spider_name,将每个爬虫写一遍
    1. 0 3 * * * cd /project_path/spider && /usr/bin/python3 startup.py >> /tmp/spider.log
    2. 另一种是增加一个startup.py,调用subprocess,将需要调用的爬虫做整合然后循环调用:
# 顺序执行所有爬虫
import subprocess
from datetime import datetime
import time


def crawl_work():
    date_start = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())

    crawl_name_list = ['spider_1', 'spider_2']
    record_time_list = {}
    for crawl_name in crawl_name_list:
        start_time = time.time()
        record_time_list[crawl_name] = {}
        record_time_list[crawl_name]['start_date'] = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
        subprocess.Popen('/usr/local/bin/scrapy crawl ' + crawl_name, shell=True).wait()
        end_time = time.time()
        record_time_list[crawl_name]['end_date'] = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
        record_time_list[crawl_name]['time_last'] = int((end_time - start_time) / 60)  # 分钟,向下取整
    print('time_record-date_start: ', date_start)
    for crawl_name, record_time in record_time_list.items():
        print('time_record-' + crawl_name + ': ', record_time)
    date_end = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
    print('time_record-date_end: ', date_end)


if __name__ == '__main__':
    crawl_work()

scrapy常见问题汇总

  • 多个pipeline管道文件存在时,后面的pipeline获取不到item:
    • 前面的pipeline中process_item方法在最后需要return item。 否则item被丢弃则后续的pipeline无法获取到item
  • 调用scrapyd时报错:sqlite3.OperationalError: attempt to write a readonly database
    • 没有权限,需要增加权限:项目根目录的文件夹dbs,修改其权限和所有者即可。
      • chmod -R 755 dbs
      • chown -R username:usergroup dbs

scrapy提供接口服务

将scrapy发布为服务并提供接口服务,以便其他项目调用:

  • pip install scrapyd
  • pip install scrapyd-client
  • 修改scrapy.cfg:
  • 启动服务:scrapyd

[settings]
default = compass.settings

[deploy]
url = http://localhost:6800/
project = compass[settings]

  • 部署服务:scrapyd-deploy
  • 启动服务:scrapyd
  • 调用服务:curl http://localhost:6800/schedule.json -d project=your_project_name -d spider=your_spider_name
  • 不清楚项目名和爬虫名可以用下面命令查询:
    • 列出项目:curl http://localhost:6800/listprojects.json
    • 列出爬虫:curl http://localhost:6800/listspiders.json?project=compass
  • 其他命令:
    • 调度爬虫
      • curl http://localhost:6800/schedule.json -d project=your_project_name -d spider=your_spider_name
    • 包含参数
      • curl http://localhost:6800/schedule.json -d project=your_project_name -d spider=your_spider_name -d setting=DOWNLOAD_DELAY=2 -d arg1=val1
    • 取消运行
      • curl http://localhost:6800/cancel.json -d project=your_project_name -d job=2bffadcb3218k9abbd23ccf016aa82f02
    • 列出版本
      • curl http://localhost:6800/listversions.json?project=your_project_name
    • 列出job
      • curl http://localhost:6800/listjobs.json?project=your_project_name
    • 删除版本
      • curl http://localhost:6800/delversion.json -d project=your_project_name -d version==15419782769
    • 删除项目
      • curl http://localhost:6800/delproject.json -d project=your_project_name