如何安排蜘蛛每 5 分钟运行一次?

Raf*_*fal 1 python scheduled-tasks scrapy scrapy-pipeline

几天来我一直在试图弄清楚如何安排我的 scrapy 蜘蛛,但没有任何运气。(我尝试了从 Windows 任务计划程序到 scrapy-do lib 的所有内容,但在我的MAIN.PY上没有任何效果)

(我的主要目标是安排我的蜘蛛每 5 分钟从我的蜘蛛NewsSpider收集数据到 mySQL news_db数据库)

请查看我的脚本,因为它有所修改,并根据需要进行更改。我真的希望这个能发挥作用。

主程序.PY

from scrapy import cmdline
cmdline.execute("scrapy crawl news".split())
Run Code Online (Sandbox Code Playgroud)

新闻_蜘蛛.PY

import scrapy
from ..items import WebspiderItem


class NewsSpider(scrapy.Spider):
    name = 'news'
    start_urls = [
        'https://www.coindesk.com/feed'
    ]

    def parse(self, response):
        pub_date = response.xpath('//pubDate/text()').extract()[0]
        page_title = response.xpath('//title/text()').extract()[2]
        page_summary = response.xpath('//description/text()').extract()[1]
        text_link = response.xpath('//link/text()').extract()[2]

        item = WebspiderItem()
        item['date'] = pub_date
        item['title'] = page_title
        item['summary'] = page_summary
        item['link'] = text_link

        yield item
Run Code Online (Sandbox Code Playgroud)

项目.PY

import scrapy


class WebspiderItem(scrapy.Item):
    # define the fields for your item here like:
    date = scrapy.Field()
    title = scrapy.Field()
    summary = scrapy.Field()
    link = scrapy.Field()
Run Code Online (Sandbox Code Playgroud)

管道.PY

import mysql.connector


class WebspiderPipeline(object):

    def __init__(self):
        self.create_connection()

    def create_connection(self):
        self.conn = mysql.connector.connect(
            host='localhost',
            user='root',
            passwd='passordpassord',
            database='news_db'
        )
        self.curr = self.conn.cursor()

    def process_item(self, item, spider):
        self.store_db(item)
        return item

    def store_db(self, item):
        self.curr.execute("""insert into news_tb values (%s, %s, %s, %s)""", (
            item['date'],
            item['title'],
            item['summary'],
            item['link']

        ))
        self.conn.commit()

Run Code Online (Sandbox Code Playgroud)

Dan*_*iel 6

使用计划包在本地 Windows 和 Linux 服务器上都对我有用。只需使用pip install schedule. 然后通过将以下内容粘贴到文件中来设置新作业main.py

import schedule
import time
import os

print('Scheduler initialised')
schedule.every(5).minutes.do(lambda: os.system('scrapy crawl news'))
print('Next job is set to run at: ' + str(schedule.next_run()))

while True:
    schedule.run_pending()
    time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

python main.py然后在终端中运行。scrapy crawl news只要您不关闭终端,脚本就会每 5 分钟运行一次该命令。

请注意,据我记得,使用os.system()而不是因为在作业完成时退出调度程序的无限 while 循环非常重要。不会执行此操作,因此将在又过了 5 分钟后等待另一个作业运行。cmdline.execute()cmdline.execute()os.system()