You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python爬取IMDb个人评分遇登录问题求助

IMDb爬虫登录失败?教你正确获取个人影片评分

我刚学Python爬虫的时候也踩过IMDb登录的坑,你遇到的问题很典型——直接硬编码appActionToken肯定登录不上,这个参数是动态生成的,每次访问登录页都会变,而且登录请求需要的参数也不止你写的那几个。

先看看你原来的代码问题:

import requests
from requests import get
from bs4 import BeautifulSoup
EMAIL = ''
PASSWORD = ''
session = requests.Session()
payload = {'appActionToken':'izXDj2BVRfSIj2Bkj2Bgpqij2BMI58AYu1cj3D', 'appAction':'SIGNIN', 'email':EMAIL, 'password':PASSWORD}
login = session.post('https://www.imdb.com/ap/signin', data=payload)
url = ''
response = session.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# print(soup)的内容

问题出在哪?

  • appActionToken是动态值,你写死的这个只会在某一次访问登录页时有效,下次就失效了
  • 登录请求缺少其他必填参数(比如csrf),服务器会直接拒绝你的请求
  • 没有设置合理的请求头(比如User-Agent),容易被IMDb的反爬机制拦截

调整后的正确步骤和代码

1. 先获取登录页的动态参数和Cookie

首先用session访问登录页面,保存Cookie,然后从页面里解析出需要的动态参数,而不是自己硬编码。

2. 完善登录请求的参数

把解析到的动态参数加到payload里,同时加上User-Agent模拟浏览器请求。

3. 验证登录状态再爬取评分

登录后检查session里的Cookie是否包含登录标识,确认成功后再去爬目标影片的评分。

完整代码示例:

import requests
from bs4 import BeautifulSoup
import time

# 替换成你的账号信息和目标影片URL
EMAIL = '你的IMDb注册邮箱'
PASSWORD = '你的IMDb密码'
TARGET_MOVIE_URL = 'https://www.imdb.com/title/tt1375666/'  # 示例:盗梦空间的URL

# 初始化session,设置请求头模拟浏览器
session = requests.Session()
session.headers.update({
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
})

# 第一步:访问登录页面,获取动态参数
login_page = session.get('https://www.imdb.com/ap/signin')
login_soup = BeautifulSoup(login_page.text, 'html.parser')

# 提取动态生成的token和csrf参数
app_action_token = login_soup.find('input', {'name': 'appActionToken'})['value']
csrf_token = login_soup.find('input', {'name': 'csrf'})['value']

# 构造完整的登录payload
login_payload = {
    'appActionToken': app_action_token,
    'appAction': 'SIGNIN',
    'email': EMAIL,
    'password': PASSWORD,
    'csrf': csrf_token,
    'rememberMe': 'false'
}

# 第二步:发送登录请求
login_response = session.post('https://www.imdb.com/ap/signin', data=login_payload)

# 验证登录是否成功:检查session中是否有登录标识Cookie
if 'at-main' in session.cookies:
    print('✅ 登录成功!')
else:
    print('❌ 登录失败,请检查账号密码或请求参数')
    exit()

# 第三步:爬取目标影片的个人评分
time.sleep(2)  # 加个延迟,避免被反爬
movie_response = session.get(TARGET_MOVIE_URL)
movie_soup = BeautifulSoup(movie_response.text, 'html.parser')

# 查找个人评分(IMDb页面结构可能会更新,需根据实际情况调整选择器)
personal_rating_element = movie_soup.find('span', class_='ipc-rating-star ipc-rating-star--base ipc-rating-star--imdb ratingGroup--imdb-rating')
if personal_rating_element:
    personal_rating = personal_rating_element.text.strip()
    print(f'🎬 你的个人评分:{personal_rating}')
else:
    print('⚠️ 未找到个人评分,可能你还没给这部影片评分,或者页面结构已更新')

额外提醒

  • 页面结构可能变化:如果以后找不到评分元素,打开浏览器开发者工具,重新定位评分对应的HTML标签和类名
  • 避免频繁请求:爬取时适当加延迟(比如time.sleep(2)),不然容易被IMDb限制访问
  • 账号安全:不要在公共代码里泄露你的账号密码,最好用环境变量来存储敏感信息

内容的提问来源于stack exchange,提问作者Jason Wang

火山引擎 最新活动