IMDB电影时长爬虫问题:误爬取上映日期求助
解决IMDB Top250爬取时长而非日期的问题
问题根源在于IMDB页面里,电影的上映日期、时长这类元数据都使用了同一个CSS类名 sc-14dd939d-6 kHVqMR cli-title-metadata-item,你当前用find()方法只会获取到匹配该类的第一个元素(也就是上映日期),要拿到时长需要定位到第二个元素。
以下是修正后的完整代码:
import openpyxl as opx from bs4 import BeautifulSoup import requests wb = opx.Workbook() ws = wb.active ws.title = "Movies" header_row = ["Name", "Date", "Rate", "Duration"] ws.append(header_row) url = "https://www.imdb.com/chart/top/?ref_=nv_mv_250" header = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36' } response = requests.get(url, headers=header) html_content = response.content soup = BeautifulSoup(html_content, "html.parser") movies = soup.find_all( "li", class_="ipc-metadata-list-summary-item sc-bca49391-0 eypSaE cli-parent") for movie in movies: # 提取电影名称 name = movie.find("h3", class_="ipc-title__text").text.strip() # 获取所有元数据项:第一个是日期,第二个是时长 metadata_items = movie.find_all("span", class_="sc-14dd939d-6 kHVqMR cli-title-metadata-item") date = metadata_items[0].text.strip() if len(metadata_items) > 0 else "N/A" duration = metadata_items[1].text.strip() if len(metadata_items) > 1 else "N/A" # 提取评分,处理可能的None情况 rate_element = movie.find("span", class_="ipc-rating-star ipc-rating-star--base ipc-rating-star--imdb ratingGroup--imdb-rating") rate = rate_element.text.strip() if rate_element else "N/A" # 将数据写入Excel ws.append([name, date, rate, duration]) # 打印验证 print(f"名称: {name}, 日期: {date}, 评分: {rate}, 时长: {duration}") wb.save("IMDB_Top250_Movies.xlsx")
关键修改说明:
- 用
find_all()替代find()获取所有元数据span,通过索引区分日期(第0位)和时长(第1位) - 添加判空逻辑,避免页面结构变化导致的索引越界或属性错误
- 补充了评分的文本提取和写入Excel的完整逻辑
内容的提问来源于stack exchange,提问作者Alireza Pirmahdi
相关产品推荐
相关产品推荐

