【问题标题】:Scrapy crawler in Cron jobCron 作业中的 Scrapy 爬虫
【发布时间】:2013-06-18 13:50:23
【问题描述】:

我想从 cron 作业中执行我的爬虫。

我用它的蜘蛛创建了 bash 文件 getdata.sh,scrapy 项目所在的位置

#!/bin/bash
cd /myfolder/crawlers/
scrapy crawl my_spider_name

我的 crontab 是这样的,我想每 5 分钟执行一次

 */5 * * * * sh /myfolder/crawlers/getdata.sh 

但它不起作用,怎么了,我的错误在哪里?

当我从终端 sh /myfolder/crawlers/getdata.sh 执行我的 bash 文件时,它工作正常

【问题讨论】:

  • */5 * * * * sh /myfolder/crawlers/getdata.sh 中的sh“前缀”,这是从crontab 执行shell 脚本所必需的???

标签: ubuntu cron scrapy crontab cron-task


【解决方案1】:

我解决了这个问题,包括 PATH 到 bash 文件中

#!/bin/bash

cd /myfolder/crawlers/
PATH=$PATH:/usr/local/bin
export PATH
scrapy crawl my_spider_name

【讨论】:

  • +1 有同样的问题,只是想不通。您应该将您的问题标记为已接受的答案。 :)
  • 我猜PATH不应该总是设置为/usr/local/bin,这取决于你所在的环境和服务器,对吧?那么 PATH 应该设置为什么呢? ....的文件夹?
  • 我不是 Linux 大师,有人可以 ELI5 为什么从 bash 执行 bash 脚本有效,但在 cron 中执行呢?
  • @MarcusLind 明白了。 PATH 应该设置为 scrapy 所在的位置。您可以使用以下命令找到此文件夹: which scrapy
  • 但是不是必须先进入虚拟环境吗?我可以使用复合命令执行我的蜘蛛(进入虚拟环境,然后启动scrapy脚本),但您的示例没有显示进入虚拟环境。如果不先执行该步骤,您如何使其运行?
【解决方案2】:

crontab -e 中添加以下行会在每天早上 5 点运行我的爬虫爬网。这是crocs答案的略微修改版本

PATH=/usr/bin
* 5 * * * cd project_folder/project_name/ && scrapy crawl spider_name

如果不设置$PATH,cron 会给我一个错误“找不到命令:scrapy”。我猜这是因为 /usr/bin 是运行程序的脚本存储在 Ubuntu 中的位置。

请注意,我的 scrapy 项目的完整路径是 /home/user/project_folder/project_name。我在 cron 中运行了 env 命令,发现工作目录是 /home/user。因此,我在上面的 crontab 中跳过了 /home/user

cron 日志在调试时很有帮助

grep CRON /var/log/syslog

【讨论】:

    【解决方案3】:

    对于使用pip3(或类似)安装scrapy的任何人,这里有一个简单的内联解决方案:

    */10 * * * * cd ~/project/path && ~/.local/bin/scrapy crawl something >> ~/crawl.log 2>&1
    

    替换:

    */10 * * * * 使用你的 cron 模式

    ~/project/path 带有您的scrapy 项目的路径(您的scrapy.cfg 所在的位置)

    something 与蜘蛛名称(在您的项目中使用scrapy list 查找)

    ~/crawl.log 与您的日志文件位置(以防您想要进行日志记录)

    【讨论】:

    • 路径~/.local/bin/scrapy是从哪里来的或者有什么意义?
    • 那是我使用pip3 安装scrapy 命令时所在的位置。由于在我的 cron 上下文中无法访问普通的 scrapy 命令,因此我通过直接访问它来解决它。
    • 这会阻止更改PATH的需要吗?
    • 是的,PATH直接访问命令时无关
    【解决方案4】:

    另一种选择是忘记使用 shell 脚本并直接在 cronjob 中将两个命令链接在一起。只需确保在 crontab 列表中的第一个 scrapy cronjob 之前设置 PATH 变量。运行:

        crontab -e 
    

    编辑并查看。我有几个在不同时间运行的爬虫。有的每 5 分钟一次,有的每天两次。

        PATH=/usr/local/bin
        */5 * * * * user cd /myfolder/crawlers/ && scrapy crawl my_spider_name_1
        * 1,13 * * * user cd /myfolder/crawlers/ && scrapy crawl my_spider_name_2
    

    位于 PATH 变量之后的所有作业都将找到scrapy。在这里,第一个将每 5 分钟运行一次,第二个将在每天凌晨 1 点和下午 1 点运行两次。我发现这更容易管理。如果您有其他二进制文件要运行,那么您可能需要将它们的位置添加到路径中。

    【讨论】:

      【解决方案5】:

      使用“which scrapy”命令检查 scrapy 的安装位置。 就我而言,scrapy 安装在/usr/local/bin

      使用crontab -e 打开 crontab 进行编辑。 PATH=$PATH:/usr/local/bin export PATH */5 * * * * cd /myfolder/path && scrapy crawl spider_name

      它应该工作。 Scrapy 每 5 分钟运行一次。

      【讨论】:

        【解决方案6】:

        你的shell脚本有执行权限吗?

        例如可以吗

          /myfolder/crawlers/getdata.sh 
        

        没有sh?

        如果可以的话,你可以把 sh 放到 cron 的行中

        【讨论】:

        • 不,它写的是权限被拒绝
        • 你需要做chmod u+x /myfolder/crawlers/getdata.sh给它执行权限。这就是#!/bin/bash 行的作用——它必须是文件中的第一行
        • 我授予它权限并在 crontab 中删除“sh”,但它仍然不起作用:S
        • 您可以在命令末尾添加>/tmp/cron.log 2>&1 以查看错误。如果脚本位于非标准位置,则该脚本可能无法访问 scrappy
        【解决方案7】:

        在我的例子中,scrapy 在 .local/bin/scrapy 中给出了正确的刮板路径并将其命名为完美

        0 0 * * * cd /home/user/scraper/Folder_of_scriper/ && /home/user/.local/bin/scrapy crawl "name" >> /home/user/scrapy.log 2>&1

        /home/user/scrapy.log 用于保存scrapy.log 中的输出和错误以检查程序是否正常运行

        谢谢。

        【讨论】:

          猜你喜欢
          • 2019-06-24
          • 2015-11-15
          • 2021-12-26
          • 1970-01-01
          • 1970-01-01
          • 2023-03-21
          • 2019-12-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多