# 網路爬蟲入門 本文所有內容與資料皆由本人蒐集與撰寫,轉載請註明出處。 - [Python 網路爬蟲(靜態)](https://hackmd.io/@NCHUIT/1101223) - [進階:Python 爬蟲常用技巧 (持續更新)](https://titangene.github.io/article/python-crawler-note.html) ## 簡介 ### 什麼是網路爬蟲? 網路爬蟲是一種自動化程式,用於從網路上的網站中提取信息。它們模擬人類在瀏覽網頁時的行為,但可以快速且大規模地提取數據。網路爬蟲通常用於資料探勘、搜索引擎索引、價格比較、新聞整理等各種應用。 ### 為什麼要學習網路爬蟲? - 爬蟲是一種強大的資料收集工具,可用於研究、分析和解決各種問題。 - 爬蟲技能在資料科學、網路分析和機器學習領域中非常有價值。 - 瞭解網站結構和 HTML 程式碼對網站開發和資料提取都有幫助。 ### 網路爬蟲的相關應用 - 針對發佈單一資訊的網頁,爬蟲可以定時擷取並更新資訊:機票價格、實習資訊 - 針對發佈許多資訊的網頁,爬蟲可以幫我們做彙整與統計:論壇或社群媒體上的留言、競爭者的商品價格 ### 靜態爬蟲 vs 動態爬蟲 靜態爬蟲和動態爬蟲是兩種不同類型的網路爬蟲,它們在爬取網站數據的方式和處理動態內容上有重大區別。 | 特點/分類 | 靜態爬蟲 | 動態爬蟲 | |--------------------|------------------------------|---------------------------------| | 目標 | 爬取靜態網站的數據 | 爬取動態網站的數據 | | HTML解析 | 解析靜態HTML文件 | 需要處理動態生成內容的JavaScript | | 動態內容 | 不需要處理動態內容 | 需要模擬用戶互動以獲取內容 | | 速度和複雜性 | 速度較快,簡單 | 速度較慢,複雜 | ### 我們訪問網站時,到底發生了甚麼事情? <!-- 1. 輸入網址 2. DNS解析 3. 建立TCP連接 4. 發送HTTP請求 5. 伺服器接收請求 6. 處理請求 7. 生成HTTP回應 8. 傳送HTTP回應 9. 瀏覽器接收回應 10. 渲染網頁 對於網路爬蟲來說,我們通常關注的是模擬這些步驟中的一部分,特別是發送HTTP請求並解析伺服器回應以提取所需的信息。 -->  > 補充:[網站運作原理 – 從瀏覽器到伺服器端發生了甚麼事?](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 說明: >  --- ## 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()` 來等待
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.