維基百科作為全球最大的免費在線百科全書,擁有超過 6000 萬篇多語言文章,其結構化數據和開放版權特性使其成為理想的網頁抓取學習對象。通過抓取維基百科,您可以獲取:
當把以上的數據類型進行分類匯總,會發現大概可以抓取的種類是如下的四種:
文本數據
當抓取的是文本數據時,可用於語言學研究,分析不同語言的使用習慣、詞匯頻率等。如統計英語文章中不同詞性的分佈情況。也可用於構建文本語料庫,為機器學習中的自然語言處理任務提供訓練數據,像訓練情感分析模型、文本生成模型等。
錶格數據
人們往往需要錶格去進行數據分析,抓取的錶格數據可用於收集各種結構化信息。如歴史事件的時間軸、各國經濟數據對比、體育賽事成績排名等,便於後續的數據分析和可視化。
圖片數據
維基百科的圖片可用於圖像識別相關的機器學習項目。如訓練圖像分類模型、目標檢測模型等。也可用於文化研究,分析不同歴史時期藝術風格的演變等。例如,收集不同時期繪畫作品的圖片,研究繪畫風格的變遷。
鏈接數據
通過分析鏈接結構,可以了解文章之間的引用關繫和相關性,有助於構建知識圖譜和推薦繫統。例如,根據頁面之間的鏈接關繫,推薦與當前瀏覽頁面相關的其他頁面內容。
首先確定要抓取的維基百科頁面,接下來的教程將以這個頁面作為參考進行抓取https://en.wikipedia.org/wiki/Python_(programming_language)
在開始抓取維基百科數據之前,需要准備好 Python 環境併安裝必要的庫。
安裝 Python:確保妳的繫統已安裝 Python 3.6+
創建環境:
# 創建環境(Windows) python -m venv venv # 激活(Windows) venv\Scripts\activate # 創建環境(Mac/Linux) python3 -m venv venv # 激活(Mac/Linux) source venv/bin/activate
激活後,終端應顯示 (venv) 前綴。
安裝必要的庫
pip install requests beautifulsoup4 pandas
requests:用於發送 HTTP 請求(獲取網頁內容)
beautifulsoup4:用於解析 HTML 併提取數據
測試環境是否正常
import requests from bs4 import BeautifulSoup url = "https://en.wikipedia.org/wiki/Python_(programming_language)" response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') print("頁面標題:", soup.title.text)
抓取維基百科頁面時,我們需要確保頁面存在。這就需要妳右鍵單擊光標併選擇查看網頁源代碼。如果妳要提取所有的鏈接,那麽妳可以確定標記位置:<a>
如果要提取圖片,那麽妳可以確定標記位置:<img>src
從錶格中提取數據也是一樣,幫您收集行和列:<table>wikitable
要提取段落,只要包含主要的文本內容即可:<p>
以下是完整的代碼示例,可以從維基百科頁面提取和保存數據:
import requests from bs4 import BeautifulSoup import csv
1. 獲取頁面內容
url = "https://en.wikipedia.org/wiki/Python_(programming_language)" headers = {'User-Agent': 'Mozilla/5.0'} # 模擬瀏覽器訪問 response = requests.get(url, headers=headers) soup = BeautifulSoup(response.content, 'html.parser')
2. 提取核心數據
def scrape_wikipedia_page(soup): data = { "title": "", "text": [], "images": [], "tables": [], "links": [] }
提取標題
data["title"] = soup.find('h1', id='firstHeading').text
提取正文文本(排除引用標記)
for paragraph in soup.select('div.mw-parser-output > p'): text = paragraph.get_text().strip() if text: # 跳過空段落 data["text"].append(text)
提取圖片(獲取src和alt文本)
for img in soup.select('div.mw-parser-output img'): data["images"].append({ "src": img.get('src', ''), "alt": img.get('alt', ''), "caption": img.find_parent('figcaption').text if img.find_parent('figcaption') else "" })
提取錶格(包括信息框)
for table in soup.select('table'): rows = [] for row in table.find_all('tr'): cells = [cell.get_text(strip=True) for cell in row.find_all(['th', 'td'])] if cells: rows.append(cells) if rows: # 跳過空錶格 data["tables"].append(rows)
提取內部鏈接(僅限維基百科站內鏈接)
for link in soup.select('div.mw-parser-output a[href^="/wiki/"]'): if ':' not in link['href']: # 過濾特殊頁面(如"File:") data["links"].append({ "text": link.get_text(strip=True), "url": "https://en.wikipedia.org" + link['href'] }) return data
3. 執行抓取
page_data = scrape_wikipedia_page(soup)
4. 打印部分結果示例
print(f"標題: {page_data['title']}\n") print("前兩段文本:") for i, text in enumerate(page_data['text'][:2], 1): print(f"{i}. {text[:150]}...") # 截斷顯示 print("\n前兩張圖片:") for img in page_data['images'][:2]: print(f"描述: {img['alt']}\n鏈接: https:{img['src']}") # 補全協議 print("\n第一個錶格的前兩行:") for row in page_data['tables'][0][:2]: # 通常第一個是信息框 print(row) print("\n前五個鏈接:") for link in page_data['links'][:5]: print(f"{link['text']}: {link['url']}")
5. 保存為CSV文件(示例:保存鏈接數據)
with open('wikipedia_links.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerow(['Link Text', 'URL']) for link in page_data['links']: writer.writerow([link['text'], link['url']])
版權問題:網頁上的內容通常受版權保護。未經授權抓取和使用受版權保護的數據,可能構成侵權,需承擔相應的法律責任。
違反網站使用條款:許多網站在其使用條款中明確處理抓取行為,違反這些條款可能導致法律訴訟或被處理訪問該網站。
反爬蟲機制:經常的請求可能會導致 IP 地址被網絡異常,從而中斷數據抓取過程。維基百科頁面的結構復雜,包含大量的動態內容和嵌套元素,這使得准確提取所需數據變得睏難。
數據准確性:維基百科的內容由用戶編輯,雖然有審核機制,但仍然可能存在錯誤、不完整或過時的信息。抓取的數據如果未經進一步驗證和清洗,可能會對後續的研究或分析產生誤導。
維基百科頁面可能會經常更新,抓取的數據可能在短時間內就失去時效性,需要定期重新抓取以保持數據的最新狀態。
因此,在抓取維基百科網頁數據時,必須謹慎行事,充分考慮這些處理和風險,併採取相應的措施來確保數據抓取的合法性和可持續性。
網頁抓取是一項強大的技術工具,尤其在獲取維基百科這類開放知識庫時,能夠為學術研究、商業分析和創新應用提供寶貴的數據支持。然而,這一過程涉及法律、技術、倫理等多方面的挑戰,需要謹慎操作。
如果您需要專業的網頁抓取服務,不妨嘗試一下LunaProxy,我們為個人和企業提供高效的抓取服務,確保您無限使用流量、獲取准確的數據信息。
請通過郵件聯繫客服
我們將在24小時內通過電子郵件回复您