# 怎么用Python登陸豆瓣并爬取影評
在當今數據驅動的時代,網絡爬蟲技術成為了獲取互聯網公開數據的重要手段。本文將詳細介紹如何使用Python模擬登錄豆瓣網站,并爬取指定電影的影評數據。我們將使用`requests`、`BeautifulSoup`和`selenium`等庫來實現這一功能。
## 1. 準備工作
### 1.1 安裝必要的庫
首先,確保你已經安裝了以下Python庫:
```bash
pip install requests beautifulsoup4 selenium
此外,由于豆瓣網站有較嚴格的反爬機制,我們可能需要使用selenium
來模擬瀏覽器行為。因此,你還需要下載對應瀏覽器的驅動,例如ChromeDriver。
在代碼開頭,導入必要的庫:
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
豆瓣的登錄頁面是https://accounts.douban.com/passport/login
。我們需要分析登錄時的網絡請求,找到表單提交的URL和所需參數。
通過瀏覽器開發者工具(按F12),可以看到登錄時提交的表單數據包括:
- username
: 你的豆瓣賬號
- password
: 你的密碼
- remember
: ‘on’
- ticket': '' (可能為空)
-
randstr’: “ (可能為空)
- `tc_app_id’: 2044349630 (固定值)
我們可以嘗試使用requests
庫來模擬登錄:
login_url = 'https://accounts.douban.com/passport/login'
session = requests.Session()
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'
}
login_data = {
'username': 'your_username',
'password': 'your_password',
'remember': 'on',
'ticket': '',
'randstr': '',
'tc_app_id': 2044349630
}
response = session.post(login_url, data=login_data, headers=headers)
print(response.status_code)
然而,豆瓣可能有更復雜的驗證機制,這種方法可能無法成功。此時,我們可以考慮使用selenium
進行模擬登錄。
def douban_login(username, password):
driver = webdriver.Chrome(executable_path='path_to_chromedriver')
driver.get('https://accounts.douban.com/passport/login')
# 等待頁面加載
time.sleep(2)
# 點擊"密碼登錄"選項卡
driver.find_element(By.CLASS_NAME, 'account-tab-account').click()
# 輸入用戶名和密碼
driver.find_element(By.ID, 'username').send_keys(username)
driver.find_element(By.ID, 'password').send_keys(password)
# 點擊登錄按鈕
driver.find_element(By.CLASS_NAME, 'btn-account').click()
# 等待登錄完成
time.sleep(5)
# 獲取cookies
cookies = driver.get_cookies()
driver.quit()
return cookies
以電影《肖申克的救贖》為例,其影評頁面URL為:
https://movie.douban.com/subject/1292052/reviews
通過檢查頁面元素,可以發現每條影評都包含在<div class="review-item">
中,影評標題在<h2>
標簽內,內容在<div class="short-content">
中。
def scrape_reviews(movie_id, page_limit=5):
base_url = f'https://movie.douban.com/subject/{movie_id}/reviews'
session = requests.Session()
# 設置headers模擬瀏覽器
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'
}
all_reviews = []
for page in range(page_limit):
url = f'{base_url}?start={page*20}'
response = session.get(url, headers=headers)
if response.status_code != 200:
print(f'Failed to fetch page {page}')
continue
soup = BeautifulSoup(response.text, 'html.parser')
review_items = soup.find_all('div', class_='review-item')
for item in review_items:
title = item.find('h2').get_text(strip=True)
content = item.find('div', class_='short-content').get_text(strip=True)
all_reviews.append({'title': title, 'content': content})
time.sleep(2) # 避免請求過于頻繁
return all_reviews
豆瓣有較嚴格的反爬機制,我們需要注意: 1. 設置合理的請求間隔 2. 使用隨機User-Agent 3. 使用代理IP(如果需要大量爬?。?4. 遵守robots.txt規定
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
import time
def main():
# 1. 登錄豆瓣獲取cookies
username = 'your_username'
password = 'your_password'
cookies = douban_login(username, password)
# 2. 爬取影評
movie_id = '1292052' # 肖申克的救贖
reviews = scrape_reviews(movie_id, page_limit=3)
# 3. 保存結果
for i, review in enumerate(reviews, 1):
print(f'Review {i}:')
print(f'Title: {review["title"]}')
print(f'Content: {review["content"]}\n')
if __name__ == '__main__':
main()
通過本文介紹的方法,你可以成功登錄豆瓣并爬取影評數據。如需更復雜的功能,如爬取用戶信息或大規模數據采集,可能需要更高級的技術如分布式爬蟲等。 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。