大綱
爬蟲的應用場景
網路爬蟲的應用範圍非常廣泛,主要包括以下幾個方面:
資料擷取:許多開發者使用爬蟲技術從各種網站上提取數據,例如價格比較、新聞聚合、社交媒體數據分析等。
數據分析:爬取大量數據後,可以進行深入分析,幫助企業做出更明智的決策,例如市場趨勢分析、用戶行為研究等。
搜尋引擎索引:搜尋引擎利用爬蟲收集網站內容並建立索引,使得用戶能夠快速搜尋到所需資訊。
競爭對手監控:企業可以使用爬蟲監控競爭對手的網站,以獲取有關產品價格、促銷活動和市場策略的信息。
pip3 --version
pip3 install requests
安裝 requests 庫。pip show beautifulsoup4
pip3 install beautifulsoup4
安裝 BeautifulSoup4 庫。from bs4 import BeautifulSoup print(BeautifulSoup) #<class 'bs4.BeautifulSoup'>
requests
庫可以輕鬆發送 HTTP 請求。以下是使用 requests 庫發送 GET 請求的基本步驟,並以 PTT 的熱門文章頁面為例進行示範。import requests
2.發送 GET 請求:
使用 requests.get() 方法向 PTT 的熱門文章頁面發送請求。以下是獲取 PTT 手機版熱門文章的範例:
url = 'https://www.ptt.cc/bbs/index.html'
response = requests.get(url)
print(response.text)
3.檢查響應狀態碼:
在處理響應之前,檢查請求是否成功。HTTP 狀態碼 200 表示請求成功
if response.status_code == 200:
print("成功獲取網頁內容")
else:
print(f"請求失敗,狀態碼:{response.status_code}")
4.獲取網頁內容:
如果請求成功,可以使用 response.text 獲取網頁的 HTML 內容。
html_content = response.text
print(html_content)
#會print出整個網頁的html程式碼
from bs4 import BeautifulSoup
2.解析 HTML 內容:
使用 BeautifulSoup 對獲取的 HTML 內容進行解析。
soup = BeautifulSoup(response.text, 'html.parser')
3.提取熱門文章標題和連結:
使用 CSS 選擇器提取文章標題和連結。以下是提取標題的範例:
titles = soup.find_all('div',class_="board-title")
for title in titles:
print(title.text)
完整範例代碼
import requests
from bs4 import BeautifulSoup
# print(BeautifulSoup)
url = 'https://www.ptt.cc/bbs/index.html'
response = requests.get(url)
# 檢查回應狀態碼是否為 200
if response.status_code == 200:
print("成功獲取網頁內容")
else:
print(f"請求失敗,狀態碼:{response.status_code}")
soup = BeautifulSoup(response.text, 'html.parser')
titles = soup.find_all('div',class_="board-title")
for title in titles:
print(title.text)
url = "https://www.ptt.cc/bbs/MobileComm/index.html"
# 自訂 headers,模仿瀏覽器的 User-Agent
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
# 傳送帶有 headers 的請求
response = requests.get(url, headers=headers)
# 檢查回應狀態碼是否為 200
if response.status_code == 200:
# 使用 BeautifulSoup 解析網頁
soup = BeautifulSoup(response.text, 'html.parser')
# 找到所有標題的連結
titles = soup.select("div.title a")
for title in titles:
print(title['href'], title.text)
else:
print(f"Failed to retrieve the page. Status code: {response.status_code}")
(尤其是 User-Agent 和其他 header)通常是為了避免被網站的反爬蟲機制識別和封鎖。
許多網站會檢查進入的請求,並嘗試識別是否來自機器人或自動化腳本。
這些網站通常會根據以下一些原因封鎖或限制自動化請求:
偽裝 User-Agent 或其他 headers 是為了讓自動化工具看起來像是來自正常的用戶,從而避免被識別為爬蟲。
提高成功率:
有些網站對爬蟲的請求會給出 403 Forbidden 或 503 Service Unavailable 等錯誤,導致無法成功抓取資料。偽裝成瀏覽器的請求,可以避免這些限制,讓請求更容易成功。許多網站可能會允許瀏覽器進行爬取,但阻止自動化腳本的訪問,因此模擬瀏覽器行為是一種有效的方法。
避免 IP 被封禁:
如果一個網站發現短時間內來自同一個 IP 的大量請求,並且這些請求的 header 看起來像是自動化的(例如,User-Agent 是 Python 爬蟲的預設值),它有可能將該 IP 封禁。偽裝 header 可以減少這樣的風險,從而避免 IP 被封鎖。
模擬正常使用者行為:
偽裝成正常的瀏覽器請求不僅能避開反爬蟲機制,還能模擬真正的使用者行為,這對於某些需要模擬使用者交互的情況很有用。例如,有些網站可能會根據不同的 User-Agent 做出不同的回應(如行動版與桌面版網站呈現不同的頁面),所以模擬正確的 User-Agent 可以確保爬取到正確的頁面。
網站限制不同裝置的流量:
有些網站會根據請求中的 User-Agent 來判斷該請求來自哪種裝置(例如桌面或行動裝置)。這樣,爬蟲也可以根據需要調整自己的請求,以適應不同版本的頁面。
範例:
假設你要爬取某個網站的資料,並且該網站有反爬蟲機制,若你不偽裝請求,網站可能會返回 403 或 503 錯誤,或者限制你的訪問。通過偽裝請求,你可以讓網站認為你是一個正常的瀏覽器使用者,從而順利獲取資料。
結論:
偽裝 HTTP headers 是為了模擬正常使用者的行為,避開網站的反爬蟲檢測,並提高自動化腳本的成功率。這樣可以讓爬蟲更順利地抓取資料,並避免被網站封禁或限制流量。