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

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,复制CookieUser-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

火山引擎 最新活动