PySpider爬取去哪兒攻略資料專案

未名w發表於2021-08-01

1 建立專案

  • 點選WEB中的Create建立專案

  • 填入相關專案名和其實爬取URL

 

  • 建立後進入專案首頁

 

  • 右邊 Handler 是pyspider的主類,整個爬蟲一個Handler,其中可定義爬蟲的爬取、解析、儲存邏輯;crawl_config 中定義專案爬取配置;on_start() 爬取入口,通過呼叫 crawl() 方法新建爬取請求,第一個引數是爬取的URL,另外一個引數callback指定爬取成功後的解析方法,即index_page()。index_page() 接收Response引數,Response對接了pyquery,可直接呼叫doc()解析頁面;detail_page() 方法接收Response引數,抓取詳情頁資訊,不生成新的請求,對Response解析後以字典形式返回資料。
  • 左邊,上面綠色和灰色是執行引數內容,下面點選左邊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後自動刪除。

 

相關文章