Python爬取IMDB A24影片列表无法输出完整结果如何解决
爬虫代码问题修复
现存问题
- 电影节点选取错误:
soup.find('div',class_="lister-list").find_all('div')会抓取列表容器下所有层级的div,包含评分块、海报块等非单部电影的节点,遍历到这类节点时调用元素查找方法会返回None,触发报错中断程序。正确的单部电影容器class为lister-item mode-detail。 - 输出语句位置错误:
print写在for循环外部,循环执行完只会保留最后一部电影的变量值,无法输出完整列表。 - 缺少合法请求头:IMDB会拦截requests默认的请求标识,直接访问大概率返回反爬校验页,拿不到真实的榜单内容。
- 缺失空值判断:部分影片没有metascore、票房数据,直接调用属性/文本方法会触发NoneType错误,导致循环中断。
- 存在无效导入:开头导入的
cmath.e、pydoc.synopsis和当前逻辑完全无关,属于冗余代码。
修复后代码
from bs4 import BeautifulSoup import requests import time # 配置请求头模拟浏览器访问 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" } try: source = requests.get('https://www.imdb.com/list/ls024372673/', headers=HEADERS) source.raise_for_status() soup = BeautifulSoup(source.text, 'html.parser') # 仅选取单部电影对应的容器节点 movies = soup.find('div', class_="lister-list").find_all('div', class_="lister-item mode-detail") for movie in movies : # 所有字段增加空值判断,避免单条数据缺字段导致整个程序崩溃 name = movie.find('h3', class_="lister-item-header").a.text.strip() if movie.find('h3', class_="lister-item-header") else "无" rank = movie.find('span', class_="lister-item-index unbold text-primary").text.strip() if movie.find('span', class_="lister-item-index unbold text-primary") else "无" year = movie.find('span', class_="lister-item-year text-muted unbold").text.strip() if movie.find('span', class_="lister-item-year text-muted unbold") else "无" star = movie.find('span', class_="ipl-rating-star__rating").text.strip() if movie.find('span', class_="ipl-rating-star__rating") else "无" metascore_tag = movie.find('div', class_="inline-block ratings-metascore") metascore = metascore_tag.span.text.strip() if metascore_tag else "无" score_tag = movie.find('div', class_="list-description") score = score_tag.text.strip() if score_tag else "无" genre_tag = movie.find('span', class_="genre") genre = genre_tag.text.strip() if genre_tag else "无" runtime_tag = movie.find('span', class_="runtime") runtime = runtime_tag.text.strip() if runtime_tag else "无" about_tag = movie.find('p', class_="") about = about_tag.text.strip() if about_tag else "无" elements = movie.find_all('span', attrs = {'name':'nv'}) votes = elements[0]['data-value'] if len(elements)>=1 else "无" gross = elements[1]['data-value'] if len(elements)>=2 else "无" # 输出逻辑移到循环内部,每遍历一部影片即时打印结果 print(name, rank, year, star, metascore, score, genre, runtime, about, votes, gross) # 增加请求间隔,避免触发反爬 time.sleep(1) except Exception as e: print(e)
注意事项
- 代码中用
strip()清除了提取文本前后多余的换行、空格,输出格式更整洁。 - 该榜单默认单页展示100条内容,抓全量数据需要拼接分页参数,比如第二页url为
https://www.imdb.com/list/ls024372673/?page=2,依次递增page值即可翻页。 - 不要短时间内高频发起请求,否则容易被IMDB临时封禁IP。
内容的提问来源于stack exchange,提问作者Veronika Mihovec
相关产品推荐
相关产品推荐

