2020年4月24日 星期五

Python 練習 網路爬蟲 scrapy

看到有徵網路爬蟲的工讀生,我也想打個小工,如果時間可以配合的話。

但我已經有段時間沒有寫爬蟲程式,爬來佔硬碟空間,因為沒有想到要的資料,但我電腦每天都會運行爬蟲程式。

再次練習,除了css selector等的選擇器經驗不足,感覺自己寫得還有很多可以強化效率的部分。

這次要針對「缺失值」作更好的處理,因為大部分的爬蟲教學是不考慮爬取失敗的時候。

時代變遷,網頁也會改版,沒有永遠適用的爬蟲。一旦不能用,或是抓取的部分跑掉,這是一定要馬上處理好的事情。

因此,注重例外處理與警示是實戰必寫的。當然不寫例外直接跳出也是一種變向的警示,前提是要留意到。

況且,加載失敗也是會讓本來設定提取的部分失敗,導致爬取意外中止。格式跑掉並非是自身的問題,但是會害到你。

使用框架,可以大幅省去針對例外而寫處理的時間,因此我練習 scrapy。


----分隔線----

首先,我建議使用 anaconda ,從官網下載的。

如果是第一次用,從「本機」>「內容」>「進階」>「環境變數」>「系統變數」清單「Path」>「編輯」,新增三個 「(anaconda的位置)」、「(anaconda的位置)\Scripts」、「(anaconda的位置)\Library\bin」」

這樣就可以用「字元提示命令」(cmd)去執行python(anaconda環境)。

在cmd輸入「pip install scrapy」安裝「scrapy」,安裝完成就可以用「scrapy startproject projectname」建立scrapy專案。

(小技巧:如果我想在 A資料夾 建立專案,在「檔案總管」進入 A資料夾 ,在上方路徑輸入 cmd 後按enter, 就能以當前資料夾為工作路徑執行cmd,這樣使用建立專案指令也會建在當前的資料夾

我使用 visual studio 把 scrapy 建立的專案都加進來,這樣方便編輯。

官網教程學習是不錯的。

如果會使用 requests、BeautifulSoup,寫出scrapy spider絕對沒問題是。

這裡提一下scrapy的優勢,在 selector 沒有選到會是 None,而不像 BeautifulSoup 會報錯,用try except會是效率的拖油瓶。(從leetcode的解題觀察到的)

而且 scrapy 的框架有 items ,把資料統一丟到自定義物件內,省版面也美觀。如果沒用scrapy,我大概也會寫個類別接收資料。

異步爬取也是一點,寫 multiprocessing 或 threading,也是一門功夫,既然會想高效,這自然也是得寫的,如果不用scrapy的話。

資料終究要寫進資料庫,那為什麼一開始就不寫好資料庫的管道?這一塊 scrapy 也幫你準備好了,在 pipelines 這裡。

今天我終於開啟了雲端資料庫,我使用mongoDB Altas。我覺得最難的部分總是一開始的陌生,辦好帳號卻不知道要怎麼下一步。

辦好之後,從「SANDBOX」> Closter > 「CONNECT」 可以設定連線代碼,這裡相當貼心,它可以生成可直接用的連線代碼(password要自己改),複製到code中用pymongo模組連線即可。(參考)

成功連線並寫入一筆資料順利在cloud看到,我已心滿意足,最苦惱的不知道要塞什麼資料。

想學 scrapy ,也可以看 youtube,能搜到不錯的教學,所以我也不贅述。

這裡提供一個 xpath 選擇器的進階用法。 response.xpath('A | B'),用這個就能抓下ptt文章的內文,包括<a>內的文字,我目前沒看到範例有這樣寫的。

相較於 css ,我覺得 xpath 更精確,但我也才昨天開始接觸。 BeautifulSoup 好像沒有 xpath 可用。

目前最讓我苦手的還是 jsonp 仍舊沒有除了 selenium 以外的解法,關於 jsonp 討論不多,jsonp 屬於動態加載,我好像也是為此才看看 scrapy 。