AndyChiangFri, Feb 5, 2021 9:59 AM
Python
爬蟲
這兩個套件都是爬蟲好用(必備)的套件,使用起來簡單,適合用於靜態網站爬蟲(最常被爬的:PTT、Dcard、Yahoo等等)。
Beautiful Soup通常用來分析抓下來的HTML,使用pip安裝:
Requests用於抓取HTML原始碼下來,一樣是使用pip安裝:
大部分爬蟲引用這兩個模組就夠用了,少部分需要其他模組(os、json等等)
抓取網站使用到 requests.get() 函數,參數為我們想要爬蟲的網址(URL),範例為PTT的C_Chat版。
抓下來的並不是我們想要的HTML,因此要經過 BeautifulSoup 轉化。
轉化後的HTML排版並不好看,soup.prettify()
可以美化排版。
搜尋為爬蟲相當重要的一環,抓下來的資訊零零散散,搜索就是幫助我們找到想要的資訊。
搜尋第一個符合條件的HTML節點,參數為要搜尋的標籤名稱,回傳第一個符合條件的節點。
搜尋所有符合條件的HTML節點,回傳符合條件的節點列表。
參數可加入關鍵字指定屬性值,另外limit參數可以限制搜尋的數量。
回傳為一個符合條件的節點列表(list),當然也有索引值。
如果要同時搜尋多個HTML標籤,可以將標籤名稱打包成串列(list)後當成參數。
如果要搜尋指定的CSS屬性值,則可以加入參數指定。
因為 class
是 Python 的保留字,所以要用 class_
。
遇到這種情況,也可以用 { key : value }
表示法。
使用 string 參數可搜尋指定文字內容的節點。
select()使用CSS選擇器的方式搜尋節點,類似jQuery的語法。
搜尋某節點底下的子節點,回傳第一個符合條件的子節點。
搜尋某節點底下的子節點,回傳多個符合條件的子節點的列表(list),另外limit參數可以限制搜尋的數量。
所以通常是先find()到想爬的標籤,再select()往下找子節點。
如果要搜尋指定的CSS屬性值,則是用類似 Emmet 的語法。
比方說想搜尋 class=summary 的 h2 底下的 a 子節點,就要這樣搜尋:
從目前節點向上搜尋符合條件的父節點。find_parent()用於搜尋單個,find_parents()則用於搜尋多個。
比方說想搜尋 itemprop="url" 的 a 上層的 h2 父節點,就要這樣搜尋:
在同級的節點中,搜尋上一個節點。
比方說想搜尋 itemprop="headline" 的 h2 上一個的 a 節點,就要這樣搜尋:
在同級的節點中,搜尋下一個節點。
比方說想搜尋 itemprop="headline" 的 h2 下一個的 p 節點,就要這樣搜尋:
搜尋到想要的節點後,下一個重要步驟當然就是抓取資料下來嘛!
抓取節點屬性值,參數為屬性。
比方說想搜尋一個 a 的 href(URL連結),就要這樣搜尋:
抓取節點內部文字。
比方說想搜尋一個 a 的內部文字,就要這樣搜尋:
還在一張一張下載圖片嗎? 太落伍了! 試試看用爬蟲自動下載圖片吧~
get()
下載圖檔下來(注意,此時你的電腦中還不會出現圖片!)。完整程式碼:
在前面,我們可能只會這樣寫:
但現在跟你說,Request還有更多的功能。
參數 status_code
可以得到該網站的狀態碼。
順便提一下狀態碼(Status Code)是什麼,幾個常見的有:
更多狀態碼:MDN - HTTP 狀態碼
有些網站URL中會夾帶的關鍵字,使用 params 參數生成。
使用 headers 參數,經常加入 user-agent 或 cookie 等關鍵字。
如果是要找網頁存了哪些 cookie,可使用 cookie 參數加上 cookie 名稱。
將自己設定的 cookie 放入 GET 的 headers 中。
前面都是用 GET,但 POST 也算滿常用到的函數,可以用於回傳資料或上傳檔案。