网页爬取时获取椭圆符号隐藏的动态剧集标题数据的问题
网页爬取时获取椭圆符号隐藏的动态剧集标题数据的问题
我明白你现在的困扰——想用代码自动获取网页上的剧集标题,但不管是用requests直接请求还是Selenium,都拿不到<h1 id="epName">里的实际内容,只看到空标签对吧?这是因为这个标题是JavaScript动态填充的,页面初始加载时只是个空壳,等JS执行完才会把标题内容放进去。
先帮你梳理下之前尝试里的问题:
- 用
requests的话,只能拿到服务器返回的初始HTML,那些需要JS渲染的动态内容自然拿不到,所以你看到的是空的<h1>标签。 - 你用Selenium的时候,问题大概率出在没等页面完全加载完成就获取源码,而且手动调用
changeEp函数其实没必要——页面的onload="initPage()"已经触发了初始化逻辑,只是你的代码跑得太快,JS还没来得及填充标题内容。
下面给你两个可行的解决方案:
方案一:优化Selenium代码,等待动态内容加载
你需要让Selenium等待标题元素加载完成,而不是急着拿page_source。可以用WebDriverWait来等待元素的文本不为空,确保拿到正确的标题。
修正后的代码示例:
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 初始化浏览器(这里用Safari,你也可以换成Chrome等) driver = webdriver.Safari() url = "https://g1.heartshine.gay/?s=1&e=46&res=480" driver.get(url) # 等待h1元素的文本不为空,最多等10秒 try: # 等待标题元素可见且文本非空 WebDriverWait(driver, 10).until( EC.text_to_be_present_in_element((By.ID, "epName"), "") == False ) # 直接获取元素的文本内容 ep_title = driver.find_element(By.ID, "epName").text print("剧集标题:", ep_title) finally: driver.quit()
解释下关键点:
WebDriverWait会一直等待到满足条件(这里是h1的文本不再为空),最多等10秒,避免因网络慢或JS执行慢导致拿不到内容。- 不要直接打印
page_source,因为它可能还是初始的HTML内容,直接获取元素的.text属性才能拿到动态渲染后的标题。
方案二:直接调用后端API(更高效)
如果不想用Selenium(毕竟启动浏览器比较慢),可以直接找页面获取标题的后端接口。你可以打开浏览器的开发者工具(F12),切换到网络面板,刷新页面,看看有没有XHR/Fetch请求是用来获取剧集信息的。
一般来说,页面会发送一个请求到某个API接口,带上s(季数)和e(集数)参数,返回包含标题的JSON数据。找到这个接口后,直接用requests调用就能拿到标题,不用渲染整个页面。
举个模拟的例子(你需要替换成实际找到的接口地址):
import requests # 替换成你实际找到的API接口地址 api_url = "https://g1.heartshine.gay/api/get-episode-info" params = { "s": 1, "e": 46 } response = requests.get(api_url, params=params) if response.status_code == 200: episode_data = response.json() ep_title = episode_data.get("title") print("剧集标题:", ep_title)
最后提醒下:注意网站的反爬规则,不要频繁请求给服务器造成压力;如果API接口需要特定的请求头或者Cookie,记得在requests里加上对应内容。
备注:内容来源于stack exchange,提问作者Dmitri




