前言
為什麼要學網路爬蟲呢?什麼是網路爬蟲?講白了,爬蟲就是一隻可以讓你自動化抓取網頁資料的程式。網頁可以分成三個重點,分別是HTML / CSS / Javascript。大概可以理解成內容相關的會在HTML中,裝飾設計相關會在CSS裡面,一些動畫或是與網站互動則會是Javascript負責。而網路爬蟲就是要把網站HTML中你需要資料給擷取下來。
前置作業
- 下載 Python 3.8
- 下載一個IDE(整合開發環境),推薦使用
Jupyter Notebook / Visual Studio Code / Sublime Text / Pycharm
🌟🌟初學者推薦🌟🌟 Jupyter Notebook下載及使用教學:(1)在終端機Terminal輸入: pip3 install jupyter notebook
(2)下載完畢後,在終端機輸入: jupyter notebook
(3)可以開始使用了!
- 安裝爬蟲所需套件(順便把之後要用的套件也都下載下來)
#在Terminal 輸入以下指令 pip3 install requests
pip3 install bs4
pip3 install selenium
Python資料結構複習
在開始之前,先讓大家複習一下Python的資料結構,這樣在做之後的爬蟲才比較可以了解每段程式碼在做什麼!
字串 Str
基本上字串就是我們看得的文字,通常會透過兩個雙引號或是兩個單引號將想呈現的文字包覆在中間串包覆在中間!另外針對字串有一些常用的函式用法如下:
整數 Int & 浮點數 Float
一般常見的數字可以分為整數 Int 和帶有小數的浮點數 Float。
布林值 Bool
一般常見的真 True 假 False 就是布林值,網路上有很多真值表,有興趣的人可以再自己去研究一下~
元組 Tuple
是一個透過小括號()並將元素透過逗號區分的一個資料型態,有順序性,讀取速度快、佔用空間少,但不可修改。常用函式如下:
串列 List
是一個透過中括號{}並將元素透過逗號區分的一個資料型態,有順序性,讀取速度較慢、佔用空間較多,但是可以修改。常用函式如下:
字典 Dict
是一個透過大括號{}並將元素透過鍵值對應{“key”:“value”},可以更新與刪除,可以搜尋複雜的資料的一種資料型態。常用函式如下:
Python內建的資料結構就先複習到這邊,有需要的可以上網查詢或是加我的Linkedin@SeanChien,互相交流一下!接下來,就要快要開始寫程式啦~
網站請求 — HTTP Requests
在開始前要先知道一下,網路是怎樣運作的。首先我們會在瀏覽器上輸入網址,按下Enter,這時候相當於對網路Server發出請求(Request),接著網站回傳結果(Response)。
那Request的類型又可以分為下面幾類~我們比較常用的就是GET跟POST
- GET 取得
- POST 新增-> 輸入密碼之類的
- PUT 覆蓋
- PATCH 更新部分
- DELETE 刪除
那我們要怎麼看這個網站是透過什麼方式發送請求的呢?那就是在網站按下右鍵>檢查>Network
來查看,記得按下重新整理
,會有一堆資料跑進來,選擇你要查看的名稱,就可以看到Request Method
裡面是用什麼方式發送!
像是上圖是我在google首頁點擊檢查的截圖,可以看到是透過GET來取得,另外可以看到Status Code,是Http的狀態碼,可以讓使用者知道請求是否完成,像是200就是成功回應了!
常見的狀態碼如下:
- 1XX 資訊回應 Informational Responses
- 2XX 成功回應 Successful Responses
- 3XX 重新定向 Redirects
- 4XX 用戶端錯誤 Client Errors
- 5XX 伺服器端錯誤 Server Errors
想了解更細節的可以參考:MDN Web Docs — Https Response Status Cod
Python爬蟲 — Requests套件
簡單了解完網站請求之後可以開始寫程式啦!!!
首先要先下載requests套件,最一開始的時候已經先下載過了,還沒下載的可以在自己的terminal輸入 pip3 install requests
發出GET請求
接著開啟IDE,對www.google.com發出GET請求,並回傳HTTP狀態碼以及將該網頁HTML印出來看看~
import requests #導入requests套件
URL = 'https://www.google.com'res = requests.get(URL) # 對URL發出GET請求並用res存起來print(res.status_code) # 印出剛剛那個請求的狀態碼print(res.text) #將剛剛抓下來的HTML呈現出來
URL增加參數
在網站分頁上常常會看到URL後面有加&page=2之類的分頁方式,或是搜尋關鍵字等等的方式來到達該分頁。這時候我們可以用下列的方式來發送請求
URL2 = 'https://www.google.com/search'set_param = {'q':'python'} #到時候網站後面會顯示 q=pythonres2 = requests.get(URL2, params = set_param) #將設定的參數帶入print(res2.url) #查看請求網站的網址
像上面的程式碼,就相當於在google搜尋中輸入python,網址也會在後面加上q=python,最後會呈現成https://www.google.com/search?q=python
新增Header
有時候,發送請求後,卻發現回傳的資料錯誤,這時候可能就要檢查一下Header了,很多網站為了避免被大量爬蟲,所以設置了需要檢查Header的機制,所以可以透過設置Header來讓我們繼續達到目的!那要怎麼觀察表頭呢?一樣是透過右鍵>檢查>Network
來觀察喔~
set_header = {'user-agent': 'Mozilla/5.0'}res3 = requests.get('https://google.com.tw', headers = set_header)
#即可將header加入請求中print(res3.text) #將剛剛抓下來的HTML呈現出來
Cookies
有些網站需要Cookies認證才能到達特定網站。以ptt表特版為例,首次進入時,會詢問是否成年,若成年的話會在網頁的cookies做紀錄,如果這時候在發送請求沒有加入cookies的話,則無法爬取正確的網頁內容。
url_ptt = "https://www.ptt.cc/bbs/Beauty/index.html"ptt_cookies = {'over18':'1'}#從右鍵>檢查>Network 可以看到有個over18=1的參數,這就是他的cookieres_ptt = requests.get(url_ptt, cookies = ptt_cookies)print(res_ptt.text) #將剛剛抓下來的HTML呈現出來
登入
有些網站需要透過登入才能取得該帳戶的相關資料,這時候就要透過auth來取得驗證,最常見就是Github的API!
login_auth = ('帳號', '密碼')r = requests.get('https://api.github.com/user', auth = login_auth)#這樣即可取得該帳號的資料了,詳細API用法要參照其文件。print(r.text) #將剛剛抓下來的HTML呈現出來
發送POST請求
在發送POST請求的時候,常常需要輸入一些參數,就是使用者要提交給Server端的資料,那這時候就必須增加data的參數把資料給傳遞過去。
post_data = {'key_A':'value_A','keyB:'value_B'}r_post = requests.post('一個可以接收post的網站', data= post_data)#這樣即可順利發送該POST請求了~
小結
透過Python發送Requests請求的分享大概就到一個段落,如果想了解更詳細的資料可以直接參考官方文件,裡面有更多Requests的使用情境與方法。另外有很多API,都是透過requests的方式就可以得到很多資料,所以要好好的把這個套件練熟。之後會再分享Postman這個軟體,是一個API測試神器,可以讓你快速的讀取與測試API的資料喔~
到目前為止,都是透過print(res.text)的方式將HTML給印出來,但其實還不夠好用,因此下一章會分享使用BeautifulSoup這個套件,來解析HTML,讓使用者很直接也很方便的取得想要的資訊。那bs4的分享我們下次見!
我是尚恩,一個從商學院畢業的菜鳥工程師,有任何想從商轉換跑道的問題都可以找我聊聊,歡迎透過Linkedin@SeanChien聯絡我~