IMDB页面爬取异常:为何watchlist页面soup返回空列表?
问题分析与解决思路
你的核心问题在于第一个URL是用户专属的Watchlist页面,IMDB要求必须登录才能访问其完整内容,而你的请求没有携带有效的登录认证信息,导致服务器返回的是登录引导页面(而非实际的收藏列表),自然找不到lister-item-content类的元素,所以movie_div1返回空列表。而第二个Top1000页面是公开可访问的,无需登录,因此能正常获取内容。
下面是具体的解决步骤:
1. 验证页面访问权限
手动在浏览器打开https://www.imdb.com/user/ur34087578/watchlist,如果跳转到登录页面或者提示"Please sign in to access your watchlist",就确认了必须登录才能爬取这个页面的内容。
2. 携带登录会话信息
你有两种方式获取有效的登录会话:
方式一:直接复制浏览器的认证Cookie(简单快速)
- 打开浏览器,登录IMDB账号,进入目标Watchlist页面
- 按F12打开开发者工具,切换到Network标签,刷新页面
- 找到第一个请求(就是当前页面的请求),查看其Request Headers,复制
Cookie和User-Agent字段 - 将这些字段添加到你的
headers中,示例代码如下:
import requests from bs4 import BeautifulSoup headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Cookie': '这里粘贴你从浏览器复制的完整Cookie字符串' } url1 = "https://www.imdb.com/user/ur34087578/watchlist" results1 = requests.get(url1, headers=headers) # 先打印页面文本,确认是否返回了正常的Watchlist内容 # print(results1.text) soup1 = BeautifulSoup(results1.text, "html.parser") movie_div1 = soup1.find_all('div', class_='lister-item-content') print(movie_div1)
方式二:用requests.Session()模拟登录(更持久,但复杂)
如果Cookie过期频繁,你可以模拟登录流程:
- 先访问IMDB的登录页面,获取CSRF token(在页面的隐藏表单字段中)
- 构造登录表单数据(包含你的账号、密码、CSRF token)
- 使用
requests.Session()提交登录请求,保持会话 - 之后用同一个Session对象请求Watchlist页面
注意:IMDB的登录可能有验证码或反爬验证,这种方式需要处理这些额外步骤,难度较高。
3. 确认页面实际结构
即使登录成功,也要注意IMDB可能更新了页面结构。拿到返回的页面文本后,用开发者工具查看实际的电影项容器类名,确认是否还是lister-item-content,如果不是,替换成正确的选择器。
4. 规避反爬机制
IMDB有反爬策略,即使登录后也可能被拦截:
- 给请求添加随机间隔(比如
time.sleep(2)),避免频繁请求 - 使用真实的浏览器
User-Agent,不要用requests默认的标识 - 如果被封IP,可以考虑使用代理IP
内容的提问来源于stack exchange,提问作者user13500929




