使用Selenium來抓取動態網頁。動態網頁通常是指那些通過JavaScript動態加載內容的網頁,這些內容在初始HTML中并不存在,因此使用傳統的requests庫無法獲取到這些動態生成的內容。Selenium可以模擬瀏覽器行為,等待JavaScript執行并渲染頁面,從而獲取到完整的頁面內容。
下面是一個使用 Selenium 編寫的動態網頁爬蟲示例,用于抓取京東商品搜索頁面的信息(商品名稱和價格),并附有詳細注釋:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time# 設置 Chrome 瀏覽器選項
chrome_options = Options()
chrome_options.add_argument('--headless') # 無頭模式,不顯示瀏覽器窗口
chrome_options.add_argument('--disable-gpu') # 禁用GPU加速
chrome_options.add_argument('--no-sandbox') # Linux 系統需要添加此參數# 創建 WebDriver 服務 (需要下載對應版本的 chromedriver)
service = Service(executable_path='./chromedriver') # 替換為你的 chromedriver 路徑# 初始化瀏覽器驅動
driver = webdriver.Chrome(service=service, options=chrome_options)try:# 1. 打開目標網頁driver.get('https://search.jd.com/Search?keyword=手機')print("已打開京東搜索頁面...")# 2. 等待頁面加載 - 顯式等待(推薦)# 等待直到商品列表元素出現(最長等待10秒)WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".gl-item")))print("商品列表加載完成!")# 3. 模擬滾動頁面以加載更多內容(針對懶加載頁面)# 動態頁面通常需要滾動才能加載更多元素for i in range(3): # 滾動3次driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")print(f"滾動頁面 {i+1}/3...")time.sleep(1.5) # 等待新內容加載# 4. 定位所有商品元素# 使用 CSS 選擇器獲取商品列表項items = driver.find_elements(By.CSS_SELECTOR, '.gl-item')print(f"共找到 {len(items)} 個商品")# 5. 遍歷并提取數據results = []for item in items:try:# 在單個商品元素內查找名稱和價格name = item.find_element(By.CSS_SELECTOR, '.p-name em').text.strip()price = item.find_element(By.CSS_SELECTOR, '.p-price i').text.strip()results.append({'name': name, 'price': price})except Exception as e:print(f"提取商品時出錯: {str(e)}")continue# 6. 打印抓取結果print("\n抓取結果:")for i, result in enumerate(results[:5], 1): # 只打印前5個結果print(f"{i}. {result['name']} - 價格: {result['price']}")print(f"\n共抓取 {len(results)} 條商品數據")except Exception as e:print(f"爬蟲執行出錯: {str(e)}")finally:# 7. 關閉瀏覽器driver.quit()print("瀏覽器已關閉")
代碼詳細解釋:
1、導入必要模塊:
webdriver
:控制瀏覽器By
:元素定位方式WebDriverWait
和expected_conditions
:顯式等待Options
:瀏覽器配置選項
2、瀏覽器設置:
headless
模式:后臺運行不顯示界面- 禁用 GPU 和沙盒模式:提高穩定性和兼容性
3、、初始化驅動:
- 需要下載對應 Chrome 版本的
chromedriver
- 指定 driver 路徑和服務
4、頁面加載等待:
- 使用顯式等待(
WebDriverWait
)確保目標元素加載完成 - 比
time.sleep()
更高效智能
5、模擬滾動:
- 執行 JavaScript 滾動到底部
- 分次滾動并等待加載(針對懶加載頁面)
6、元素定位:
- 使用 CSS 選擇器定位商品列表項
- 在單個商品元素內進一步提取名稱和價格
7、異常處理:
- 捕獲單個商品提取時的異常
- 整體爬蟲的異常捕獲
8、資源清理:
finally
塊確保關閉瀏覽器釋放資源
使用前準備:
1、安裝必要庫:
pip install selenium webdriver-manager
2、下載對應瀏覽器版本的驅動:
-
Chrome:https://chromedriver.chromium.org/downloads
-
或使用
webdriver-manager
自動管理:from webdriver_manager.chrome import ChromeDriverManager service = Service(ChromeDriverManager().install())
常見問題解決:
1、元素定位失敗:
- 檢查網頁結構是否更新
- 使用瀏覽器開發者工具驗證選擇器
2、內容加載不全:
- 增加滾動次數和等待時間
- 調整顯式等待超時時間
3、反爬措施應對:
-
添加
user-agent
頭:chrome_options.add_argument('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')
-
添加代理:
chrome_options.add_argument('--proxy-server=http://your-proxy-ip:port')
這個爬蟲可以擴展用于其他動態網站,只需修改:目標 URL、元素定位選擇器、滾動/等待策略、數據提取邏輯等就能實現一個完整的爬蟲過程。如有不懂可以留言討論。