基于Jsoup的网页抓取:提取嵌套链接动态标题的方法问询
如何提取网页中的动态嵌套标题(以Google搜索结果为例)
嘿,我来帮你搞定这个问题!你已经能抓取静态的头部信息,但像谷歌搜索里“显示X条搜索结果”这种动态内容,本质是页面加载后由JavaScript渲染生成的,普通的静态HTML抓取工具(比如requests)根本拿不到——因为源码里压根没有这段内容,它是浏览器运行JS后才生成的。
下面给你分步骤拆解解决方案:
1. 先搞清楚:目标内容是静态还是动态?
先做个简单判断:
- 静态内容:右键页面→“查看页面源代码”,直接能搜到的文字
- 动态内容:源码里搜不到,但在浏览器开发者工具的「Elements」标签里能看到的内容(JS运行后才生成)
谷歌的搜索结果数就是典型的动态内容,所以静态抓取工具抓不到。
2. 用支持JS渲染的工具来抓取
推荐两个Python常用的工具,上手都不难:
方案一:Selenium(模拟真实浏览器)
Selenium可以完全模拟浏览器打开页面,等JS执行完再抓取内容,示例代码如下:
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 # 初始化Chrome浏览器(需要提前下载对应版本的chromedriver) driver = webdriver.Chrome() try: # 打开谷歌搜索页面,这里可以替换成你要处理的链接 driver.get("https://www.google.com/search?q=你的搜索关键词") # 等待结果数元素加载完成(谷歌的结果数元素ID是#result-stats) result_element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "result-stats")) ) # 提取动态生成的结果文本,比如"约 1,230,000,000 条结果" result_text = result_element.text print(result_text) finally: # 用完记得关闭浏览器 driver.quit()
这个方法的优势是兼容性极强,几乎能抓所有动态内容;缺点是速度稍慢,需要配置浏览器驱动。
方案二:Playwright(更轻量的自动化工具)
Playwright是微软出的,比Selenium更简洁,还自带浏览器驱动,不用额外下载:
from playwright.sync_api import sync_playwright with sync_playwright() as p: # 启动无头模式的Chrome(不显示浏览器窗口) browser = p.chromium.launch(headless=True) page = browser.new_page() # 打开目标页面 page.goto("https://www.google.com/search?q=你的搜索关键词") # 定位结果数元素并提取文本 result_text = page.locator("#result-stats").text_content() print(result_text) browser.close()
这个工具上手更快,代码更简洁,推荐优先试试。
3. 几个需要注意的细节
- 元素选择器要稳定:谷歌的元素ID或类名可能会更新,要是
#result-stats失效了,就换用文本匹配的方式,比如page.get_by_text("条结果")(根据实际语言调整) - 避开反爬机制:谷歌对频繁抓取有限制,建议加个随机延迟,用真实的User-Agent,必要时用代理IP
- 试试找API接口:有些网站的动态内容是通过AJAX请求获取的,你可以在开发者工具的「Network」标签里找对应的接口,直接请求接口拿数据——这种方式比模拟浏览器快得多,但谷歌的接口加密比较严,一般还是用浏览器模拟更靠谱。
总的来说,核心就是先判断内容是不是JS渲染的动态内容,然后选对应的工具抓取就行,Selenium和Playwright都能完美解决你的问题~
内容的提问来源于stack exchange,提问作者Zeshan Fayyaz
相关产品推荐
相关产品推荐

