如何抓取丹佛斯PVG比例阀门页面中需点击“显示更多”的产品?
解决动态加载产品的抓取问题
你的问题出在页面最后两款产品是动态加载的——初始页面源码里只包含部分产品,剩下的需要点击“显示更多”触发AJAX请求后才会渲染到页面中,而BeautifulSoup只能解析初始的静态HTML,所以拿不到这部分内容。
下面提供两种可行的解决方案:
方法一:用Selenium模拟交互加载全部产品
Selenium可以模拟浏览器的点击操作,等待动态内容加载完成后再抓取页面源码,步骤如下:
- 先安装依赖:
pip install selenium
同时需要下载对应浏览器的驱动(比如Chrome的chromedriver,版本要和浏览器一致),并配置到环境变量中或者指定路径。
- 示例代码:
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 from bs4 import BeautifulSoup import time # 初始化Chrome驱动 driver = webdriver.Chrome() driver.get("https://www.danfoss.com/en/products/dps/valves-and-actuators/valves/pvg-proportional-valves/#tab-overview") try: # 等待"显示更多"按钮可点击并点击 show_more_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, "button.load-more-btn")) ) show_more_btn.click() # 等待内容加载(根据网络情况调整等待时间) time.sleep(2) # 获取完整页面源码解析 soup = BeautifulSoup(driver.page_source, 'html.parser') tile_group = soup.find('div', attrs={"class":"tile-group-component product-group"}) product_items = tile_group.find_all("li") for item in product_items: link = item.find('a', href=True) if link: print(link['href']) finally: driver.quit()
方法二:直接调用动态加载的API接口
通过浏览器开发者工具可以找到点击“显示更多”时触发的AJAX请求,直接请求该接口获取产品数据,效率比Selenium更高:
找到API接口:
打开浏览器的开发者工具(F12),切换到Network标签页,点击页面上的“显示更多”,筛选XHR请求,找到返回产品数据的接口URL。示例代码:
import requests # 替换为你找到的实际API接口URL api_url = "https://www.danfoss.com/api/xxx/xxx" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } response = requests.get(api_url, headers=headers) if response.status_code == 200: product_data = response.json() # 根据接口返回的JSON结构提取产品链接,需自行调整字段路径 for product in product_data.get("items", []): if "url" in product: print(product["url"])
两种方法对比:API请求效率更高、资源占用少;Selenium更通用,适合复杂的交互场景。
内容的提问来源于stack exchange,提问作者Bar oo.
相关产品推荐
相关产品推荐

