Python爬蟲入門教程:使用requests庫
爬蟲是數據獲取的重要手段,下面我將通過一個完整的示例,教你如何使用Python的requests庫編寫一個簡單的爬蟲。我們將以爬取豆瓣電影Top250為例。
【python】網絡爬蟲教程 - 教你用python爬取豆瓣電影 Top250
1. 環境準備
首先需要安裝必要的庫:
pip install requests beautifulsoup4
2. 項目結構規劃
一個簡單的爬蟲項目通常包含以下模塊:
- 發送HTTP請求獲取頁面內容
- 解析HTML提取數據
- 數據存儲
- 控制爬蟲行為(如翻頁、延時)
3. 編寫爬蟲代碼
下面是一個完整的爬蟲示例:
import requests
from bs4 import BeautifulSoup
import time
import random
import csvclass DoubanSpider:def __init__(self):# 設置請求頭,模擬瀏覽器訪問self.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'}# 存儲結果的列表self.movies = []def get_page(self, page_num):"""獲取指定頁數的HTML內容"""url = f'https://movie.douban.com/top250?start={page_num*25}'try:response = requests.get(url, headers=self.headers, timeout=10)# 檢查響應狀態碼if response.status_code == 200:return response.textelse:print(f"請求失敗,狀態碼: {response.status_code}")return Noneexcept requests.exceptions.RequestException as e:print(f"請求異常: {e}")return Nonedef parse_page(self, html_content):"""解析HTML內容,提取電影信息"""if not html_content:returnsoup = BeautifulSoup(html_content, 'html.parser')# 查找所有電影項movie_items = soup.select('div.item')for item in movie_items:try:# 提取電影標題title = item.select_one('span.title').text# 提取評分rating = item.select_one('span.rating_num').text# 提取簡介quote = item.select_one('span.inq')quote = quote.text if quote else '無簡介'# 提取導演和主演info = item.select_one('div.bd p').text.strip()# 添加到結果列表self.movies.append({'title': title,'rating': rating,'quote': quote,'info': info})except Exception as e:print(f"解析錯誤: {e}")def save_to_csv(self, filename='douban_movies.csv'):"""將結果保存為CSV文件"""if not self.movies:print("沒有數據可保存")returnwith open(filename, 'w', newline='', encoding='utf-8-sig') as csvfile:fieldnames = ['title', 'rating', 'quote', 'info']writer = csv.DictWriter(csvfile, fieldnames=fieldnames)# 寫入表頭writer.writeheader()# 寫入數據writer.writerows(self.movies)print(f"數據已保存到 {filename}")def run(self, pages=10):"""運行爬蟲,爬取指定頁數的數據"""for page in range(pages):print(f"正在爬取第 {page+1} 頁...")html_content = self.get_page(page)self.parse_page(html_content)# 設置隨機延時,避免頻繁請求delay = random.uniform(1, 3)print(f"等待 {delay:.2f} 秒后繼續...")time.sleep(delay)# 保存數據self.save_to_csv()print(f"共爬取 {len(self.movies)} 條電影數據")# 運行爬蟲
if __name__ == "__main__":spider = DoubanSpider()# 爬取前10頁數據,共250條spider.run(pages=10)
4. 代碼解析
這個爬蟲程序包含以下關鍵部分:
-
請求處理:
get_page
方法發送HTTP請求獲取網頁內容- 設置了請求頭和超時時間,提高穩定性
- 處理了可能的請求異常
-
數據解析:
parse_page
方法使用BeautifulSoup解析HTML- 通過CSS選擇器定位電影信息元素
- 提取標題、評分、簡介等關鍵信息
-
數據存儲:
save_to_csv
方法將結果保存為CSV文件- 使用UTF-8-sig編碼確保中文正常顯示
-
爬蟲控制:
run
方法控制爬取流程- 設置隨機延時避免被封IP
- 支持指定爬取頁數
5. 進階優化建議
-
添加異常處理:可以增強錯誤處理機制,例如失敗重試功能
-
使用代理IP:爬取大量數據時,使用代理IP避免被封
-
數據清洗:提取數據后進行清洗和驗證
-
存儲優化:可以使用數據庫存儲數據,如SQLite、MySQL等
-
異步請求:對于大規模爬取,可以考慮使用aiohttp提高效率
這個爬蟲示例展示了基本的爬蟲架構和實現方法。實際應用中,你可以根據目標網站的結構調整解析邏輯,或者添加更多功能如圖片下載、數據可視化等。