1. 程式人生 > >linux下使用crontab設定scrapy爬蟲定時抓取資料

linux下使用crontab設定scrapy爬蟲定時抓取資料

1. crontab設定定時執行程式

在我們的專案中,需要從入口網站上抓取新聞資料。由於網上的新聞資料更新的速率並不是太快,所以只需要設定每天執行一遍資料抓取即可。這樣也可以利用新聞上面的時間便籤,每次只抓取當天釋出的新聞,這樣就不會出現重複了。

首先我們已經建立了scrapy爬蟲工程,其中只需要執行main.py函式即可正確進行資料抓取。假設main.py所在的路徑是:home/myusrname/workspace/myspider/myspider/main.py

crontab檔案語法

分 小時 日 月 星期 命令
0-59 0-23 1-31 1-12 0-6 command

“*”代表取值範圍內的數字,
“/”代表”每”,
“-”代表從某個數字到某個數字,
“,”分開幾個離散的數字

那麼我們可以這樣來設定每天執行一邊該程式:

  • $ crontab -e # 開啟crontab設定檔案
  • 在該設定檔案中輸入:0 23 * * * python home/myusrname/workspace/myspider/myspider/main.py
    每天的23點執行一次mian.py檔案

2. 提示:AttributeError: ‘list’ object has no attribute ‘iteritems’錯誤

原本在自己的電腦上跑得挺好的程式,一放到伺服器上就出錯了。

ITEM_PIPELINES = ['linkedIn.pipelines.LinkedinPipeline']

上網查了一下,原來是settings中ITEM——PIPELINES 在這裡若為list的話就會出錯,解決方法
所以只需要將ITEM_PIPELINES修改為字典形式即可:

ITEM_PIPELINES = {
    'myproject.pipelines.PricePipeline': 300,
    'myproject.pipelines.JsonWriterPipeline': 800,
}

這裡的整數值表示的是執行的優先順序,範圍是0-1000,數字越小,則執行的優先順序越高。

3. 使用sudo提示使用者不在sudoers檔案中的解決方法

有時候需要使用sudo命令來執行程式,可是使用者本身的許可權不夠。這是就需要我們來進行使用者許可權修改了,可以把我們的使用者增加到sudoers使用者中,這時候需要修改 /etc/sudoers檔案
- 首先需要使用su命令切換到root使用者
- 然後修改sudoers檔案,可以直接使用vi編輯器進行改寫。假設我要增加的使用者名稱叫 dabai,那麼可以在sudoers檔案的最後加上下面一句話:
dabai ALL=(ALL)
然後退出儲存,這時提示該檔案為只讀檔案,那麼我們可以使用:qw! 來進行強制儲存。
這時候就可以使用sudo命令了。

4. sudo命令執行pip安裝python庫提示沒有pip

儘管我們已經安裝好了pip,只是直接是用的話會提示許可權不夠。在第三步中我們已經成功地將使用者修改可以使用sudo了,但是卻沒有辦法使用pip命令,真是煩。其實這主要是路徑的問題。
我們可以直接使用全路徑就可以了,比如:
sudo /usr/local/bin/bin/pip install requests
當然我們可以通過修改路徑來實現,不用每次都輸入全路徑,但是這個我也是偶爾採用,所以現在還沒看具體如何修改,之後再更新吧。

5. scrapy進行翻頁抓取

在進行資料抓取的過程中,我們經常需要實現翻頁抓取的功能,scrapy中實現這個很簡單,只需要在抓完第一頁之後,返回request即可,引數中攜帶下一頁的url和自己的解析函式。
例如:

def parse(self, response): 
    . 
    . 
    . 
    url = 下一頁的url 
    yield scrapy.Request(url, callback=self.parse) 

在抓取新浪的新聞時,只有第一頁的資料沒有問題,而使用回撥進行抓取時出現403錯誤,即伺服器拒絕了訪問,應該是headers設定的問題。我嘗試著修改user-agent,但是一改就連原來的都出錯了。所以應該是user-agent的問題,但是嘗試了幾個都沒成功。
最後我只好直接在start_urls中添加了所有的頁面url,然後在抓取的過程中再進行判斷。這樣的話效率肯定會比較低,但是由於目前對效率的要求不是太高,所以就先採用這種比較笨的方法了。