您好,登录后才能下订单哦!
# 怎么用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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。