# Python如何自動化登錄網站并爬取商品數據
## 引言
在電商分析、價格監控等場景中,自動化登錄網站并爬取商品數據是常見需求。Python憑借豐富的庫生態成為實現這類任務的理想工具。本文將詳細介紹使用`requests`、`selenium`和`BeautifulSoup`等技術實現全流程自動化數據采集的方法。
## 一、技術選型與準備工作
### 1.1 常用工具對比
| 工具 | 適用場景 | 優缺點 |
|---------------|-------------------------|---------------------------|
| requests | 簡單表單登錄的網站 | 輕量高效,但無法處理復雜JS |
| selenium | 需要模擬瀏覽器操作的網站 | 功能全面,但執行效率較低 |
| Scrapy | 大規模結構化數據采集 | 學習曲線陡峭 |
### 1.2 環境準備
```bash
pip install requests selenium beautifulsoup4 pandas
# 需下載對應瀏覽器的WebDriver(如ChromeDriver)
使用瀏覽器開發者工具(F12): 1. 切換到Network標簽頁 2. 進行手動登錄操作 3. 查看POST請求的Form Data和Headers
import requests
from bs4 import BeautifulSoup
session = requests.Session()
# 獲取登錄頁面的CSRF Token
login_url = "https://example.com/login"
response = session.get(login_url)
soup = BeautifulSoup(response.text, 'html.parser')
csrf_token = soup.find('input', {'name': 'csrf_token'})['value']
# 構造登錄數據
login_data = {
'username': 'your_username',
'password': 'your_password',
'csrf_token': csrf_token
}
# 發送登錄請求
login_response = session.post(
login_url,
data=login_data,
headers={'Referer': login_url}
)
# 驗證登錄成功
if "Welcome" in login_response.text:
print("登錄成功")
當網站采用: - 驗證碼 - OAuth認證 - 復雜JavaScript驗證時
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://example.com/login")
# 顯式等待元素加載
wait = WebDriverWait(driver, 10)
username = wait.until(EC.presence_of_element_located((By.ID, "username")))
password = driver.find_element(By.ID, "password")
# 輸入憑證
username.send_keys("your_username")
password.send_keys("your_password")
# 處理驗證碼(示例)
captcha = input("請輸入驗證碼:")
driver.find_element(By.ID, "captcha").send_keys(captcha)
# 提交表單
driver.find_element(By.XPATH, "//button[@type='submit']").click()
# 使用BeautifulSoup解析
soup = BeautifulSoup(driver.page_source, 'html.parser')
products = soup.select('.product-item')
for product in products:
name = product.select_one('.product-name').text.strip()
price = product.select_one('.price').text.strip()
print(f"商品: {name}, 價格: {price}")
# 使用Selenium直接定位
elements = driver.find_elements(By.CSS_SELECTOR, ".product-item")
for item in elements:
name = item.find_element(By.CLASS_NAME, "product-name").text
while True:
# 當前頁數據采集...
try:
next_btn = driver.find_element(By.CSS_SELECTOR, ".next-page")
if "disabled" in next_btn.get_attribute("class"):
break
next_btn.click()
time.sleep(2) # 等待頁面加載
except NoSuchElementException:
break
import pandas as pd
data = []
# ...采集數據時追加到列表
df = pd.DataFrame(data, columns=["商品名", "價格", "評分"])
df.to_csv("products.csv", index=False)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
'Accept-Language': 'zh-CN,zh;q=0.9'
}
import random
proxies = [
{"http": "http://proxy1:port"},
{"http": "http://proxy2:port"}
]
response = requests.get(url, proxies=random.choice(proxies))
import time
time.sleep(random.uniform(1, 3))
以某電商網站為例:
def main():
# 初始化瀏覽器
driver = webdriver.Chrome()
# 登錄流程
login(driver)
# 數據采集
products = []
for page in range(1, 6):
print(f"正在采集第{page}頁...")
products.extend(scrape_page(driver))
go_to_next_page(driver)
# 數據存儲
save_to_excel(products)
driver.quit()
if __name__ == "__main__":
main()
通過本文介紹的技術組合,您可以構建完整的商品數據采集系統。實際應用中還需注意: - 定期維護爬蟲適配網站改版 - 考慮使用Scrapy-Redis實現分布式爬取 - 重要項目建議使用專業爬蟲管理工具(如Gerapy)
提示:本文代碼示例需根據目標網站實際結構進行調整,建議先使用測試賬號在小規模數據上驗證可行性。 “`
這篇文章包含了約1700字內容,采用Markdown格式編寫,包含: 1. 多級標題結構 2. 代碼塊示例 3. 對比表格 4. 實戰步驟分解 5. 注意事項提醒 可根據需要調整具體技術細節或補充特定網站的案例分析。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。