如何使用Python抓取JustWatch页面中未在元素检查器中显示的IMDB链接
如何使用Python抓取JustWatch页面中未在元素检查器中显示的IMDB链接
嘿,我来帮你搞定这个问题!你遇到的情况太常见啦——很多现代网站(比如JustWatch)不会把这类关联链接直接写在HTML元素的属性里,而是把数据藏在页面的内嵌JSON结构中,通过JavaScript触发跳转,所以你在元素检查器里看不到链接,但点击的时候能正常跳转。
你现在的代码只能拿到评分,是因为你在解析渲染后的HTML元素,但IMDB链接其实早就藏在页面的源代码里了,只是没直接暴露在元素属性中。下面给你两种靠谱的解决方法,优先推荐第一种,更高效:
方法一:解析页面内嵌的JSON数据(推荐)
JustWatch是用Next.js构建的网站,所有页面核心数据都会放在一个ID为__NEXT_DATA__的script标签里,里面包含了影片的所有外部平台链接,包括IMDB。我们只需要找到这个脚本,解析JSON就能拿到链接:
from urllib.request import Request, urlopen import json from bs4 import BeautifulSoup url = "https://www.justwatch.com/in/movie/oppenheimer" req = Request(url, headers={'User-Agent': 'Mozilla/5.0'}) webpage = urlopen(req).read() soup = BeautifulSoup(webpage, 'html.parser') # 定位存储页面核心数据的script标签 next_data_script = soup.find('script', id='__NEXT_DATA__') if next_data_script: # 解析JSON格式的内容 page_data = json.loads(next_data_script.string) # 从数据结构中提取影片的外部ID信息 movie_info = page_data['props']['pageProps']['title'] imdb_id_or_link = movie_info.get('externalIds', {}).get('imdb') if imdb_id_or_link: # 处理两种情况:可能是纯ID,也可能是完整链接 if not imdb_id_or_link.startswith('http'): imdb_full_link = f"https://www.imdb.com/title/{imdb_id_or_link}/?ref_=justwatch" else: imdb_full_link = imdb_id_or_link print("抓取到的IMDB链接:", imdb_full_link) else: print("没有找到对应的IMDB链接") else: print("未找到页面数据脚本,请检查页面结构是否有变化")
方法二:用Selenium模拟浏览器点击(备选)
如果你不想解析JSON,也可以用Selenium模拟真实浏览器的操作,触发点击事件后获取跳转链接。这种方法需要安装Selenium和对应浏览器的驱动,相对重一些,但更贴近用户真实操作:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC url = "https://www.justwatch.com/in/movie/oppenheimer" driver = webdriver.Chrome() # 需要提前安装对应浏览器的驱动 driver.get(url) try: # 等待IMDB图标加载完成并触发点击 imdb_icon = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, "a[aria-label='IMDb']")) ) # 用回车模拟点击,在新标签页打开链接 imdb_icon.send_keys('\n') # 切换到新标签页并获取链接 driver.switch_to.window(driver.window_handles[1]) imdb_link = driver.current_url print("抓取到的IMDB链接:", imdb_link) finally: driver.quit()
为什么元素检查器里看不到链接?
因为JustWatch的IMDB图标点击事件是通过JavaScript绑定的,跳转链接是从页面的后端数据中动态获取的,并没有直接写在<a>标签的href属性里,所以你在元素检查器里看不到,但页面源代码里的JSON数据已经包含了这个链接。
备注:内容来源于stack exchange,提问作者user23178403
相关产品推荐
相关产品推荐

