只要步驟清楚、邏輯清晰,爬蟲一點也不難!
再學會爬蟲前,要先了解HTML架構
這次實作會使用到H1、class等元素
這次實作對象為結婚吧
python中有需多套件
針對這次爬蟲,需要有以下四種套件
python套件介紹
requert
建立適當的 HTTP 請求,透過 HTTP 請求從網頁伺服器下載指定的資料,這種方式雖然步驟比較繁瑣,也需要一點通訊協定的基礎,但是絕大部分的網路爬蟲或除錯問題都可以靠這個架構解決,是資深網路程式設計師必備的工具之一。
詳細作法可以參考下方
BeautifulSoup
可以快速解析網頁 HTML 碼,從中翠取出使用者有興趣的資料。
詳細作法可以參考下方
io
負責開啟檔案、關閉檔案的套件
其實可有可無
因為我在local端測時,沒有使用也可以開檔案
但將檔案放在在server上時,卻出錯了
初步推測可能是跟環境或版本有關係
time
負責處理時間上的運算,可以計算爬蟲花了多久,這樣可以有效推估一次爬蟲一萬筆、十萬筆大約多久~
再正式coding前!
首先先想好流程,爬蟲最重要的是要如何爬!該怎麼爬!
但其實也可以想成,使用者如何操作,我們就如何爬蟲
流程步驟為:
1.開啟結婚吧
2.點選上方婚宴場地
3.隨機點選一間場地內容 (ex.晶宴會館竹北館)
4.進網站後,會先看到店家名稱
5.接著向下瀏覽,想看該廠商的關於我中的提供服務(此次爬蟲的內容)
以上就是我們基本的流程
但再python爬蟲過程中當然不會這麼死板,或多或少會有變化
流程只是先給大家一個參考模板
接著正式爬蟲吧~~~~
先開始引入我們需要使用到的套件
接著做一個休息的def,每爬一筆,我們休息數分鐘。
為了是不要讓對方server把我們當作DDOS擋下,等於說我們是做一個模仿使用者情境的爬蟲。
接著我們觀察一下網站格式
開啟F12,尋找要爬的特定內容
尋找該廠商的名稱
名稱為H1
尋找提供服務的html
我們需要找到打勾的li
這時我們會需要使用到class名稱icon-check
基本上要找工具都齊全
但關鍵來了!!!
我們要爬的對象不是只有一間
而是要將數百間廠商都爬下來
這樣該怎麼辦呢?
正當我苦惱的時候
突然看到網站的
分頁!!
發現分頁1與分頁2不同之處再於網址後面-kwbt2004mmir0mmpg1mm
分頁2為
太開心了!!
因為我們找到了網頁的規律
就是
-kwbt2004mmir0mmpg+編號+mm
那麼 Coding time!
先來看我寫的code,等等會逐一講解
(雖然code上面有註解,但怕解釋不清楚,我會再詳細說明一次)
第13行 - 計時器,負責運算時間。第14行 - 開啟檔案名為marryData-List.txt的檔案,使用ab+是因為以二進制讀跟寫模式,並且會自動判斷如果沒有marryData-List.txt檔案會自動建立一個新檔,若已有檔案的話就直接將資料逐一遞補在後面。第15行 - 宣告i為數字1第16行 - 因為網站分頁有33頁,所以透過while 當i<=33會執行以下爬蟲程式第17行 -nextlink變數則是分頁的網址,因為網址上只有編號數字不一樣,讓i透過while自動執行遞加的動作。第18行 -用resquest套件將網址get下來。第19行 -用BuautifulSoup套件將get下來的資料解析成lxml。
(補充: lxml是用來解析處理requests取得的數據)第20行 - 用findAll方式得所有a標籤並且class名為shop_name的元件,並用for迴圈逐筆執行。第21行 -url會取得一串a標籤的xml,我們使用get('href')的方式取得廠商網址,一樣透過requests get方式將網址內容抓下來。
做到這邊其實就已經初步完成廠商列表頁面單頁的爬蟲了。
重點:頁數網址、遞補頁數網址編號、廠商網址
第24行 - 取得網址內H1,並判斷是否為空,也就是判斷是否有廠商名稱(以防萬一爬到一半失敗)第25行 - 取得H1內a標籤的文字第27行 - 一樣是在做判斷廠商名稱是否為空第29行 - 用findAll取得li元件並且class名稱為icon-check,是為了要抓取有打勾的資訊第30行 -將findAll取得的所有資訊,用for迴圈制逐筆丟出來,並取出元件內文字,用join方式逐一加到Con變數內。
補充第33行:
資料會變成:婚禮主持人,新娘小管家,xxxxx,xxxx…以此類推
strip()是去除多餘的空白
第32行 - 是取得地址,用法跟32行一樣,只是我將32行與28行概念結合第33.4行 - 是寫檔的部分,值得一題的是我用了許多encode,但其實我一樣在local端測時不需要encode,放到server上執行卻需要,原因應該也是環境與版本差異。第35行 - 透過sleeptime(0,1,0),會每爬完一筆,停留在網頁上一分鐘,這樣也可以不被對方server當作惡意刷流量以至於被擋掉。第36行 - 因為在for迴圈外面,表示做完一頁爬蟲,就讓i+1 ,這樣就可以進行下一個分頁的爬蟲。第37行 - 計時結束第38行 - 關閉檔案,這很重要哦!要記得!
以上就是小弟寫得簡單利用Python爬蟲
寫得很粗糙,但也是當作筆記記一下,怕日後又需要使用爬蟲XD
個人認為爬蟲很有趣,可以訓練程式邏輯,又可以加強HTML上的架構,還能學會觀察網站運行的邏輯,可謂是多多益善阿~
延伸閱讀-進階爬蟲