问题:scrapy爬虫在win本地和在linux的非root用户下都能够使用scrapy crawl crawlername,并且能够成功爬取,但是在linux中,使用crongtab -e 添加定时任务后,总是会在日志中报错:/home/apps/start_ratespider.sh:行5: scrapy: 未找到命令
crontab 的环境变量和我们的账号都不一样, 和 root 的环境变量也不一样.
类似普通用户会先加载 ~/.bashrc
或者 /etc/profile
, crontab 则会在运行时加载 /etc/crontab
导入其环境变量.
因此不妨看看 scrapy
这条命令是否被加入了 crontab 的运行环境变量里: /etc/crontab
.
其实最简单的办法, 是在 crontab 里执行定时任务时, 尽量用绝对路径:
# 执行命令的脚本 cd /apps/jr_n/ratespider #scrapy crawl ratecast /usr/local/bin/scrapy crawl ratecast
如果不知道 scrapy 这条命令被放在哪里了, 可以执行如下两条命令来找到这个路径:
whereis scrapy # 或者 which scrapy
现在来看看crontab的环境变量文件 /etc/contab
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed
PATH路径中只有四个:/sbin:/bin:/usr/sbin:/usr/bin
我在爬虫程序中的谷歌浏览器驱动 chromedriver由于放在了 /usr/local/bin下,如果在爬虫中不指定驱动地址,比如以下:
def __init__(self): # 在初始化页面对象时,创建driver super(RatecastSpider, self).__init__(name='rate') # 使用火狐浏览器 # option = webdriver.FirefoxOptions() # 使用谷歌浏览器 option = webdriver.ChromeOptions() # root用户也可以启动,谷歌浏览器默认root用户不能启动 option.add_argument("--no-sandbox") option.add_argument("--headless") # option.headless = True # 使用火狐浏览器 # self.driver = webdriver.Firefox(options=option) # self.driver = webdriver.Firefox(options=option, executable_path="C:\Log\geckodriver.exe") # sit的linux环境 # self.driver = webdriver.Firefox(options=option, executable_path=r"/usr/local/bin/chromedriver") # self.driver = webdriver.Firefox(options=option, executable_path="/home/lzq/driver/firefox/dr/geckodriver") # 使用谷歌浏览器 self.driver = webdriver.Chrome(options=option) # 指定驱动地址,win地址 # self.driver = webdriver.Chrome(options=option,executable_path="C:\Python27\Scripts\chromedriver.exe") # linux地址 # self.driver = webdriver.Chrome(options=option, executable_path="\usr\local\bin\chromedriver") #如果需要指定驱动地址 # self.driver = webdriver.Firefox(options=option, executable_path="") #添加随机ua # ua = UserAgent() # self.headers = { # "User-Agent":ua.random, # }
会报错:selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. 就是因为crontab的环境变量中没有这个路径。
解决方法:在代码中指定chromedriver的绝对路径
self.driver = webdriver.Chrome(options=option, executable_path="\usr\local\bin\chromedriver")