PySpider爬取去哪兒攻略資料專案
1 建立專案
- 點選WEB中的Create建立專案
- 填入相關專案名和其實爬取URL
- 建立後進入專案首頁
- 右邊Handler是pyspider的主類,整個爬蟲一個Handler,其中可定義爬蟲的爬取、解析、儲存邏輯;crawl_config中定義專案爬取配置;on_start() 爬取入口,通過呼叫 crawl() 方法新建爬取請求,第一個引數是爬取的URL,另外一個引數callback指定爬取成功後的解析方法,即index_page()。index_page()接收Response引數,Response對接了pyquery,可直接呼叫doc()解析頁面;detail_page()
- 左邊,上面綠色和灰色是執行引數內容,下面點選左邊RUN按鈕,執行專案,follow中是請求連線,點選連線右邊執行三角,進入頁面;html是原始碼;web是渲染頁面; enable css selecter helper幫助進行css選擇,在右邊程式碼中選中doc方法引號中內容後,點選web視窗右上方箭頭實現右邊程式碼css選擇替換;massage是頁面資訊。
- 點選run執行專案
- 發現follows中出現一條訊息,點選follows
- 出現如下介面
- 點選三角執行符號,進入該介面
- 出現頁面所有請求後,點選HTML顯示原始碼,點選web展示頁面,如果web視窗太小,可以通過開發者模式調整(嘗試網上說的修改debug.min.css失敗)
- 選擇右邊index_page()方法中的css選擇器內容,點選左邊enable css selecter helper然後選擇對應元素,在3位置出現選擇的元素後,點選右邊箭頭,對右邊程式碼選中內容進行替換
- 再次點選左邊run,follows變成10條選中css的請求連線。
- 要想選擇多頁,即實現自動翻頁爬取,修改index_page()內容
@config(age=10 * 24 * 60 * 60) def index_page(self, response):for each in response.doc('li > .tit > a').items(): self.crawl(each.attr.href, callback=self.detail_page) next=response.doc('.next').attr.href self.crawl(next,callback=self.index_page)
- 再次點選run,follows變成11(多了next)
- 隨便點進一個內容連線,發現沒有圖片,需要修改crawl新增fetch引數,修改後,重新run
self.crawl(each.attr.href, callback=self.detail_page,fetch_type='js')
- 然後修改detail_page(),設定要儲存的資料資訊
@config(priority=2) def detail_page(self, response): return { "url": response.url, "title": response.doc('#booktitle').text(), "date":response.doc('.when .data').text(), "day":response.doc('.howlong .data').text(), "who":response.doc('.who .data').text(), "text":response.doc('#b_panel_schedule').text(), "image":response.doc('.cover_img').attr.src, }
- 點選run執行成功後,點選右邊save儲存專案
- 之後就可以返回pyspider首頁,管理專案
- 選擇專案執行狀態,設定rate/burst【rate表示1s發出多少個請求;burst相當於流控制中令牌桶演算法的令牌數;這兩個值越大爬取速率越快,也越有可能被封】; progress 四個進度條各時間段狀態,藍色等待執行,綠色成功執行,黃色失敗後等待重試,紅色失敗太多被忽略的任務actions可以執行專案檢視結果。
- 我們可以看一下result,右上角可以下載資料
2 pyspider用法詳解
- 命令列:
pyspider all / pyspider # 啟動
pyspider [OPTIONS] COMMAND [ARGS]
可以指定配置檔案訪問,pyspider -c pyspider.json all
也可以單獨執行一個元件,pyspider scheduler/fetcher/processor [OPTIONS]
更換埠執行 pyspider webui --port 5001 ,也可以寫進配置檔案中
- crawl方法引數配置:
url 可以是列表也可以是字串;callback 回撥函式解析響應的方法;age 任務的有效時間;priority 優先順序越大越優先;exetime 定時任務,時間戳型別;retries 重試次數,預設為3;itag 判定網頁是否發生變化的節點值;auto_recrawl 值為true即開啟後爬取任務過期後悔重新執行;method HTTP請求方式預設是GET;params 定義get請求引數;data 定義POST表單資料;files 定義上傳檔案;user_agent;headers;cookies;connect_timeout 初始化最長等待時間,預設20s;timeout 抓取最長等待時間,預設120s;allow_redirects 自動處理重定向,預設True;validate_cert 是否驗證證書 對HTTPS有效,預設True;proxy 代理;fetch_type 開啟PhantomJS渲染;js_script 頁面載入後執行的js指令碼;js_run_at js指令碼執行位置,預設document-end;js_viewport_width/js_viewport_height js渲染時視窗大小;load_iamges 在載入js頁面時是否載入圖片,預設否;save 可以在不同方法直接傳遞引數;cancel 取消任務,如果一個任務是active狀態,需要設定force_update為True;force_update 強制更新狀態
- 任務區分
pyspider判斷兩個任務是否重複,對URL的MD5值作為任務的唯一ID。重寫task_id()方法可以改變ID計算方式,進行區分如相同URL的post和get
- 全域性配置
在crawl_config中進行指定
- 定時爬取
可以在on_start前的every屬性設定爬取的時間間隔,24*60代表每天執行一次。index_page上面的age代表過期時間,如果未到過期時間是不會重新執行的。
- 專案狀態
TODO 剛建立還沒有實現;STOP 停止某專案抓取;CHECKING 正在執行的專案被修改後;DEBUG/RUNNIG 除錯/執行;PAUSE 暫停,爬取中多次連續錯誤,會被自動設定暫停,一段時間後繼續爬取;
- 抓取進度
progress 四個進度條各時間段狀態,藍色等待執行,綠色成功執行,黃色失敗後等待重試,紅色失敗太多被忽略的任務。
- 刪除專案
pyspider沒有刪除專案的選項,如果要刪除,將專案狀態設定為STOP,分組名稱設定為delete,24h後自動刪除。