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




