# 網路爬蟲入門 本文所有內容與資料皆由本人蒐集與撰寫,轉載請註明出處。 - [Python 網路爬蟲(靜態)](https://hackmd.io/@NCHUIT/1101223) ## 簡介 ### 什麼是網路爬蟲? 網路爬蟲是一種自動化程式,用於從網路上的網站中提取信息。它們模擬人類在瀏覽網頁時的行為,但可以快速且大規模地提取數據。網路爬蟲通常用於資料探勘、搜索引擎索引、價格比較、新聞整理等各種應用。 ### 為什麼要學習網路爬蟲? - 爬蟲是一種強大的資料收集工具,可用於研究、分析和解決各種問題。 - 爬蟲技能在資料科學、網路分析和機器學習領域中非常有價值。 - 瞭解網站結構和 HTML 程式碼對網站開發和資料提取都有幫助。 ### 網路爬蟲的相關應用 - 針對發佈單一資訊的網頁,爬蟲可以定時擷取並更新資訊:機票價格、實習資訊 - 針對發佈許多資訊的網頁,爬蟲可以幫我們做彙整與統計:論壇或社群媒體上的留言、競爭者的商品價格 ### 靜態爬蟲 vs 動態爬蟲 靜態爬蟲和動態爬蟲是兩種不同類型的網路爬蟲,它們在爬取網站數據的方式和處理動態內容上有重大區別。 | 特點/分類 | 靜態爬蟲 | 動態爬蟲 | |--------------------|------------------------------|---------------------------------| | 目標 | 爬取靜態網站的數據 | 爬取動態網站的數據 | | HTML解析 | 解析靜態HTML文件 | 需要處理動態生成內容的JavaScript | | 動態內容 | 不需要處理動態內容 | 需要模擬用戶互動以獲取內容 | | 速度和複雜性 | 速度較快,簡單 | 速度較慢,複雜 | ### 我們訪問網站時,到底發生了甚麼事情? <!-- 1. 輸入網址 2. DNS解析 3. 建立TCP連接 4. 發送HTTP請求 5. 伺服器接收請求 6. 處理請求 7. 生成HTTP回應 8. 傳送HTTP回應 9. 瀏覽器接收回應 10. 渲染網頁 對於網路爬蟲來說,我們通常關注的是模擬這些步驟中的一部分,特別是發送HTTP請求並解析伺服器回應以提取所需的信息。 --> ![](https://hackmd.io/_uploads/ryGjW0aRh.png) > 補充:[網站運作原理 – 從瀏覽器到伺服器端發生了甚麼事?](https://jimmyswebnote.com/principle-of-website/) ## HTTP & HTTPS HTTP 全名為 HyperText Transfer Protocol,HTTPS 則為 HTTP 的安全版本(Secured),是兩種常見且最主要的傳輸協議,現在主要的網站多採用 HTTPS 的方法。其他傳輸協定如 TCP/IP、UDP、SMTP、SSH 等等,分別用於不同狀況與檔案的傳輸,在此不贅述。 - HTTP: HTTP是一個不安全的協議,它的數據傳輸是明文的,這意味著數據在傳輸過程中容易受到攻擊者的竊聽和修改。主要用於一些不需要高度安全性的網站,如新聞網站和部落格等。 - HTTPS: HTTPS是HTTP的安全版本。它使用 SSL 或 TLS 協議來加密數據,使其在傳輸過程中難以被竊聽或修改。被廣泛用於需要保護用戶數據和隱私的網站,如電子商務網站、銀行網站和社交媒體平台。 ### 狀態碼(Status Code) HTTP 狀態碼是網頁伺服器回應客戶端請求的三位數字代碼,用以表示請求的結果。一些常見的狀態碼包括: * 200 請求成功。 * 403 沒有權限。 * 404 找不到資源。 * 500 伺服器端錯誤。 這些狀態碼有助於了解網路請求的狀態和問題。 > 參照:[常見的狀態碼](https://rab.tw/the-http-status-code-you-need-to-know/) > 補充:[完整的狀態碼列表(參考即可)](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status) ### 請求方法種類 HTTP 有九種請求方法,最常使用的為 GET 與 POST。 * GET:用於請求伺服器傳送指定資源的資料。這是最常見的請求方法,通常用於從伺服器獲取資料,例如網頁、圖片、文件等。 * POST:用於向伺服器提交資料,以便伺服器處理這些資料。通常用於提交表單資料或在伺服器上創建新資源,例如提交註冊信息。 * PUT:用於請求伺服器更新或創建指定資源。客戶端通常發送完整的資源表示形式,以替換伺服器上的現有資源或創建新資源。 * DELETE:用於請求伺服器刪除指定資源。伺服器收到DELETE請求後,應刪除指定資源,如果刪除成功,通常返回204 No Content狀態碼。 > 補充:[九種請求方法](https://developer.mozilla.org/zh-TW/docs/Web/HTTP/Methods) ## HTML ### 什麼是HTML? HTML 全名為 HyperText Markup Language,是網頁的結構性語言。它由一系列標記(標籤)組成,每個標記用於定義網頁上的不同元素,例如標題、段落、圖片等。 - HTML標籤:HTML文檔由各種標籤組成,如`<html>、<head>、<title>、<body>、<h1>、<p>`等。這些標籤用於定義網頁的結構和內容。 - 元素和屬性:每個HTML標籤可以包含一個或多個元素,並且可以具有屬性。例如,`<a>`標籤用於創建超鏈接,可以包含`href`屬性指向目標網址。 以下是一個簡單的HTML例子: ```html= <!DOCTYPE html> <html> <head> <title>這是大標題</title> </head> <body> <h1>這是小標題</h1> <p>這是一個段落。</p> <a href='https://youtube.com'>這是一個連結</a> <br> <img src="https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/2._Mestre_%28Italy%29%2C_the_dog_MILO.jpg/120px-2._Mestre_%28Italy%29%2C_the_dog_MILO.jpg" alt="A picture of dog"> </body> </html> ``` > 補充 - HTML Tag 說明: > ![](https://hackmd.io/_uploads/SynshtlkT.png) --- ## Python實作 靜態爬蟲:使用 Requests 與 BeautifulSoup 動態爬蟲:使用 Selenium 模擬使用者操作 我們會先專注在靜態爬蟲。 ### 環境設置 我們需要使用下列套件來實作靜態爬蟲: - Requests:用於發送HTTP請求以下載網頁。 - BeautifulSoup(bs4):用於解析HTML文檔並提取數據。 ```python= # 安裝套件 pip install requests pip install beautifulsoup4 ``` ### 基本流程 1. 使用 Requests 發送 HTTP GET 請求獲取網頁內容。 2. 使用 Beautiful Soup 解析 HTML 文檔。 3. 使用 Beautiful Soup 方法查找和提取所需的數據。 ```python= import requests from bs4 import BeautifulSoup # 要請求的頁面,以 ptt 為例 url = 'https://www.ptt.cc/bbs/' # 發送 GET 請求 response = requests.get(url) # 檢查請求是否成功 if response.status_code == 200: # 如果成功,可以獲取網頁內容 page_content = response.text # 使用 Beautiful Soup 解析網頁內容 soup = BeautifulSoup(page_content, 'html.parser') # 使用 prettify 整理 html # print(soup.prettify) # 提取頁面標題 title = soup.title.string print(f"頁面標題: {title}\n") # 提取頁面中的第一個連結 link = soup.find('a') print("第一個連結:",link.get('href')) # 提取頁面中的所有看板名稱 attr = {"class":"board-class"} boards = soup.find_all('div', attrs=attr) print("所有看板:",[i.string for i in boards]) else: print(f"請求失敗,狀態碼: {response.status_code}") ``` > 補充:[Python 網路爬蟲Web Crawler教學 — 資料結構複習+Requests篇](https://seanchien0525.medium.com/python-%E7%B6%B2%E8%B7%AF%E7%88%AC%E8%9F%B2-web-crawler-%E6%95%99%E5%AD%B8-%E8%B3%87%E6%96%99%E7%B5%90%E6%A7%8B%E8%A4%87%E7%BF%92-requests%E7%AF%87-d02580f3884) > 補充:[Python 網路爬蟲Web Crawler教學 — Beautiful Soup篇](https://seanchien0525.medium.com/python-requests-beautifulsoup-%E7%88%AC%E8%9F%B2%E6%95%99%E5%AD%B8-83d146faa9e8) > 補充:[API 到底是什麼? 用白話文帶你認識](https://medium.com/codingbar/api-%E5%88%B0%E5%BA%95%E6%98%AF%E4%BB%80%E9%BA%BC-%E7%94%A8%E7%99%BD%E8%A9%B1%E6%96%87%E5%B8%B6%E4%BD%A0%E8%AA%8D%E8%AD%98-95f65a9cfc33) > 參考:[BeautifulSoup 官方中文文檔](https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/) ## 實戰練習:來爬個網站試試看吧! - 選定任一篇 ptt 文章,爬取文章標題、文章內容、作者、時間等等資訊 - 爬取 [Yahoo 電影的每周新片專區](https://movies.yahoo.com.tw/movie_thisweek.html),爬取資訊包含電影中英文名稱、上映時間、期待度([解答參考](https://ithelp.ithome.com.tw/articles/10295937)) ``` 輸出格式 === 中文名稱: 英文名稱: 上映時間: 期待度: === ``` - 爬取 [Google 新聞](https://news.google.com/home?hl=zh-TW&gl=TW&ceid=TW:zh-Hant) 的新聞標題與看板分類 - 最後:爬你任何想爬的網站! ## 進階補充:Selenium - [Python Selenium with VSCODE 教學筆記(較進階,但可參考)](https://hackmd.io/@FortesHuang/S1V6jrvet) - [動態爬蟲 Selenium 的簡單範例](https://ithelp.ithome.com.tw/articles/10296409) - [Python 網路爬蟲 Webcrawler教學 — Selenium 超好用的自動化爬蟲神器](https://seanchien0525.medium.com/python-%E7%B6%B2%E8%B7%AF%E7%88%AC%E8%9F%B2-webcrawler%E6%95%99%E5%AD%B8-selenium-%E8%B6%85%E5%A5%BD%E7%94%A8%E7%9A%84%E8%87%AA%E5%8B%95%E5%8C%96%E7%88%AC%E8%9F%B2%E7%A5%9E%E5%99%A8-1991cec90eb5) - [Selenium GeeksforGeeks](https://www.geeksforgeeks.org/selenium-python-tutorial/) - [Selenium Python Youtube](https://www.youtube.com/playlist?list=PLsjUcU8CQXGEe8D7ZVJnANklJEHeqjBul) ### 一些小細節 - 注意:Selenium 中的 `find_element_by_{}` 已被棄用,請改成使用 `find_element(By.CLASS_NAME, )` - 若對於尋找元素不太了解,可以參考 [這裡](https://hackmd.io/@FortesHuang/S1V6jrvet#%E8%85%B3%E6%9C%AC%E5%B0%8D%E6%96%BC%E5%85%83%E7%B4%A0%E5%AE%9A%E4%BD%8D%E7%9A%84XPATH%E6%98%AF%E6%80%8E%E9%BA%BC%E6%89%BE%E5%87%BA%E4%BE%86%E7%9A%84) 關於 XPath 的使用 - 注意網頁的載入速度與尋找的使用,若網站還沒載入完畢是尋找不到的,這時候可以適當的加入 `time.sleep()` 來等待