IMDB Top1000电影爬虫重复爬取同一页面问题求助
解决IMDB Top1000爬虫重复抓取同一页数据的问题
你尝试爬取IMDB Top1000电影列表,预期每次循环抓取50部、共20页完成1000部,但实际每次都重复抓取第一页的50条数据,最终数据库里存了20遍相同内容。
代码错误分析
- 函数内硬编码起始页参数:
getPageContent函数里直接把start赋值为1,完全忽略传入的参数,导致每次请求的都是第一页的URL。 - 未接收函数返回的解析对象:循环中调用
getPageContent(start)时,没有将返回的BeautifulSoup对象赋值给bs变量,后续处理一直沿用第一次请求的第一页内容。 - 拼写错误:代码里的
bsp(r.text, "lxml")应为BeautifulSoup(r.text, "lxml"),若未正确使用BeautifulSoup会导致解析异常。
修正后的代码
import requests from bs4 import BeautifulSoup import pandas as pd # 初始化DataFrame模板 data = pd.DataFrame(columns=['ID','Title','Genre','Summary']) # 获取单页内容的函数 def getPageContent(start=1): # 使用传入的start参数构造URL,移除硬编码的start=1 url = f'https://www.imdb.com/search/title/?title_type=feature&year=1950-01-01,2019-12-31&sort=num_votes,desc&start={start}' r = requests.get(url) # 修正BeautifulSoup的拼写错误 bs = BeautifulSoup(r.text, "lxml") return bs # 循环爬取Top1000电影 for start in range(1,1001,50): # 接收当前页的解析结果 bs = getPageContent(start) movies = bs.findAll("div", "lister-item-content") for movie in movies: id = movie.find("span", "lister-item-index").contents[0] title = movie.find('a').contents[0] genres = movie.find('span', 'genre').contents[0] genres = [g.strip() for g in genres.split(',')] # 优化摘要获取,清理换行并增加异常判断 summary_elem = movie.find("p", "text-muted").find_next_sibling("p") summary = summary_elem.get_text(strip=True) if summary_elem else "" # 添加数据到DataFrame data.loc[data.shape[0]] = [id, title, genres, summary] # 清理ID列:去除末尾的点并转为数值类型 data['ID'] = data['ID'].str.replace('.', '', regex=False).astype(float) # 查看前51条数据验证结果 print(data.head(51))
修正说明
- 移除
getPageContent函数内的硬编码start=1,改用传入的参数构造URL,同时用f-string简化字符串拼接。 - 调用函数时将返回的BeautifulSoup对象赋值给
bs,确保每次循环处理当前页的内容。 - 修正
bsp为BeautifulSoup,并补充必要的导入语句。 - 优化摘要获取逻辑,避免因元素缺失导致的报错,同时清理多余的换行和空格。
- 修复ID列的清理代码,使用更安全的字符串替换方式处理格式问题。
内容的提问来源于stack exchange,提问作者Broccoli
相关产品推荐
相关产品推荐

