問題: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")