首页 > 解决方案 > 如何使用 crontab 调度带有参数的 python 脚本?

问题描述

我有一个 python 脚本,运行时需要 2 个参数, [url] & [keyword] 。文件完成后,它会输出一个 .csv 文件,其中包含 [position] 、 [url]、 [keyword] 、 [date] 。

我正在尝试使用 crontab 安排此脚本每天运行一次。

所以,换句话说,我试图安排以下每天运行:

python3 script.py [url] [keyword]

我在我的 crontab 中添加了以下内容(我试图通过每分钟运行一次来​​查看它是否有效)

* * * * * * /usr/bin/python3 /path-to-my-script/rank.py

但没有任何反应,我在 /path-to-my-script/ 文件夹中看不到预期的 .csv 文件,当我检查邮件时,我收到以下错误:

/bin/sh: file-name.csv: command not found

我的 python 脚本如下所示:


import sys
import re
import random
from robobrowser import RoboBrowser
import datetime
import csv


sitename = sys.argv[1]
keyword = "+".join(sys.argv[2:])

print("site: %s keyword: %s" % (sitename, keyword))

agent = ['Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:54.0) Gecko/20100101 Firefox/54.0',
         'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36',
         'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0',
         'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36',
         'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:54.0) Gecko/20100101 Firefox/54.0']

parser = 'html.parser'

browser = RoboBrowser(history=False,
                      user_agent=random.choice(agent),
                      parser=parser)

browser.open('https://www.google.com/search?num=100&q=' + keyword)

links = browser.find_all("div", {"class": "g"})

counter = 0



d=[]
for i in links:
    counter = counter + 1
    if sitename in str(i):
        url = i.find_all('a', href=True)
        position = "%d" % (counter)
        rank = "%s" % (url[0]['href'])
        now = datetime.date.today().strftime("%d-%m-%Y")
        keyword = keyword
        d.append(keyword)
        d.append(position)
        d.append(rank)
        d.append(now)
        print(keyword, position, rank, now)



file =datetime.date.today().strftime("%d-%m-%Y")+'-' +keyword + '.csv'
with open(file, 'w') as f:
    writer = csv.writer(f)
    writer.writerow(['Keyword' , 'Rank', 'URL' , 'Date'])
    writer.writerows(zip( d[0::4], d[1::4] , d[2::4], d[3::4]))

我希望每天运行以下命令并将我的 .csv 文件存储在特定文件夹中

python3 script.py [url] [keyword]

标签: pythoncron

解决方案


这是一个简单的示例来演示如何使用 shell 脚本和 cronjob 来安排带有 args 的 python 脚本。

hello_world.py

import sys

def main():
    print(sys.argv[1])
    print(sys.argv[2])


if __name__ == '__main__':
    main()

hello_world_scheduler.sh - 使用这样的 shell 脚本有很多额外的优势,将来可能会派上用场。

#! /bin/bash

cd /path_to_my_script
/usr/bin/python3 hello_world.py hello world! > execution_logger.log

chmod +x hello_world_scheduler.sh ## to make the script executable
./hello_world_scheduler ## to run the shell script
cat execution_logger.log

输出应该是

hello
world!

只需将调度程序添加到 cronjob -

* * * * * /path_to_script/hello_world_scheduler.sh

这应该工作


推荐阅读