Web Scraping问题:opensubtitle.org无法识别href链接及标题
解决OpenSubtitles爬取时无法识别链接和标题的问题
我帮你排查了下代码和目标网站的结构,发现两个核心问题导致你拿不到想要的数据:
1. 被网站的反爬机制拦截了
OpenSubtitles会检测请求的User-Agent,默认requests.get()用的是python-requests/x.x.x这类标识,很容易被识别为爬虫,直接返回的页面里可能根本没有你要的搜索结果内容。解决办法很简单,给请求加个模拟浏览器的请求头就行。
2. DOM结构解析逻辑不对
你代码里直接遍历#search_results下的所有<td>,但实际上网站的搜索结果是按行(<tr>)组织的,而且不是所有<td>里都有<a>标签——比如有些td是显示评分、语言的,根本没有链接,强行取film.find("a")["href"]肯定会报错。
修改后的完整代码
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/114.0.0.0 Safari/537.36' } URL = 'https://www.opensubtitles.org/it/search/sublanguageid-eng/searchonlymovies-on/genre-horror/movielanguage-english/moviecountry-usa/subformat-srt/hd-on/offset-4040' def scarica_pagina(link): # 带请求头发送请求 page = requests.get(link, headers=HEADERS) soup = BeautifulSoup(page.text, 'lxml') # 找到搜索结果的表格主体 results_table = soup.find(id="search_results") if not results_table: print("未找到搜索结果,可能被反爬拦截或链接无效") return # 遍历每一行结果(排除表头) cnt = 0 for row in results_table.find("tbody").find_all("tr"): cnt += 1 # 找到包含标题链接的td(第一个带有bnone类的td) title_td = row.find("td", class_="bnone") if not title_td: continue # 提取链接和标题 title_link = title_td.find("a") if title_link: link = title_link["href"] title = title_link.text.strip() print(f"序号: {cnt} | 标题: {title} | 链接: {link}") if __name__ == '__main__': scarica_pagina(URL)
代码里的关键调整说明
- 新增了
HEADERS字典,模拟Chrome浏览器的请求标识,绕过基础反爬 - 改为遍历搜索结果表格的每一行(
<tr>),精准定位包含标题链接的<td class="bnone"> - 添加了空值判断,避免因为个别异常行导致程序崩溃
- 输出内容更清晰,包含序号、标题和链接,方便你查看结果
你可以运行这段代码试试,应该能正常获取到你要的href链接和标题了。
内容的提问来源于stack exchange,提问作者PdF
相关产品推荐
相关产品推荐

