如何用Python从IMDB热门剧集榜单提取剧集URL?代码问题求助
解决IMDb热门剧集榜单链接提取问题
第一段代码的问题
- 初始URL错误:你写的是
https://www.imdb.com/chart/toptv/m,多了尾部的/m,这会跳转到无效页面,根本获取不到榜单内容。 - 抓取逻辑偏离目标:你递归爬取所有以
https://开头的链接,但IMDb的剧集链接都是相对路径(比如/title/tt0944947/),不会触发你的判断条件,自然抓不到目标链接。而且递归爬全站完全没必要,反而会抓取一堆无关页面。 - 冗余的递归+全局变量:这种写法容易导致逻辑混乱、重复抓取,完全不符合当前只提取榜单链接的需求。
第二段代码的问题
- 未处理反爬机制:IMDb会拦截无请求头的爬虫请求,直接用
requests.get(url)返回的内容不是正常榜单页面,导致找不到正确链接。 - 未筛选目标链接:
soup.find_all('a')会抓取页面上所有链接(包括导航栏、页脚等无关内容),你需要精准定位榜单内的剧集链接——它们都在.lister-list列表下的.titleColumn标签内的<a>元素里。 - 未拼接完整URL:拿到的相对路径需要加上IMDb主域名,才能变成可直接访问的完整链接。
修正后的代码
import requests from bs4 import BeautifulSoup import pandas as pd # 正确的榜单URL url = "https://www.imdb.com/chart/toptv/" # 模拟浏览器请求头,绕过基础反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } # 发送请求并检查是否成功 response = requests.get(url, headers=headers) response.raise_for_status() # 解析页面内容 soup = BeautifulSoup(response.text, "html.parser") # 定位榜单里的所有剧集行 show_rows = soup.select(".lister-list tr") links = [] for row in show_rows: # 提取剧集的相对路径链接 relative_link = row.select_one(".titleColumn a")["href"] # 拼接成完整可访问的URL full_link = f"https://www.imdb.com{relative_link}" links.append(full_link) # 将结果保存到CSV文件 df = pd.DataFrame({"剧集链接": links}) df.to_csv("imdb_top_tv_links.csv", index=False, encoding="utf-8-sig") print(f"成功提取{len(links)}条剧集链接,已保存到imdb_top_tv_links.csv")
代码改进说明
- 使用正确的榜单URL,添加浏览器请求头绕过基础反爬;
- 用CSS选择器精准定位目标链接,只抓取榜单内的剧集内容;
- 将相对路径拼接为完整URL,确保链接可直接访问;
- 逻辑清晰简洁,没有冗余的递归和全局变量。
内容的提问来源于stack exchange,提问作者Paula Gryglewska
相关产品推荐
相关产品推荐

