如何爬取点击「显示更多」按钮后URL不变的Vogue搜索页隐藏内容
解决Vogue搜索「显示更多」内容抓取的两种方案
方案1:调用站点内部搜索API(推荐)
Vogue搜索页的动态加载内容是通过异步接口返回的,不需要解析HTML页面,直接调用接口即可批量获取数据:
- 打开浏览器F12开发者工具,切换到「网络」面板,筛选
Fetch/XHR类型请求 - 点击页面上的「显示更多」按钮,就能捕获到搜索接口请求,接口携带的核心参数如下:
q:搜索关键词,和网页端搜索词保持一致offset:结果偏移量,即从第几条结果开始返回,首次加载默认值为0,每点击一次「显示更多」偏移量递增24(实际值以你捕获到的接口为准)limit:单次请求返回的结果数量,可尝试调整到100减少请求次数
- 直接请求该接口,解析返回的JSON格式数据即可批量提取标题、链接字段,示例代码如下:
import requests import time headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Referer": "https://www.vogue.com/" } # 替换为你捕获到的实际接口地址 base_api = "https://www.vogue.com/api/search" keyword = "HARRY STYLES" offset = 0 limit = 24 res = [] # 循环直到拿到足够的结果 while offset < 200: # 自定义需要抓取的总结果数 params = { "q": keyword, "sort": "score desc", "offset": offset, "limit": limit } resp = requests.get(base_api, params=params, headers=headers) data = resp.json() # 按接口返回的JSON结构提取字段,以下为示例,需根据实际结构调整 for item in data.get("search", {}).get("items", []): entry = { "Title": item.get("title", "").strip(), "Link": f"https://www.vogue.com{item.get('url', '').strip()}" } res.append(entry) offset += limit time.sleep(2) # 控制请求频率避免被封
方案2:模拟浏览器点击「显示更多」按钮
如果不想分析接口,可使用Selenium、Playwright等模拟浏览器工具,模拟人工点击按钮加载全部内容后再解析页面,核心逻辑示例:
from selenium import webdriver from selenium.webdriver.common.by import By import time from bs4 import BeautifulSoup as bs driver = webdriver.Chrome() url = 'https://www.vogue.com/search?q=HARRY+STYLES&sort=score+desc' driver.get(url) time.sleep(3) # 自定义点击次数,或者判断按钮是否存在循环点击 click_count = 5 # 点击5次显示更多,可调整 for _ in range(click_count): try: # 替换为页面实际「显示更多」按钮的文本或元素选择器 load_more_btn = driver.find_element(By.XPATH, '//button[contains(text(),"更多")]') load_more_btn.click() time.sleep(2) except: break # 按钮不存在时停止 # 解析全量加载后的页面源码 soup = bs(driver.page_source, 'html.parser') links = soup.find_all('a', {'class':"summary-item-tracking__hed-link summary-item__hed-link"}) titles = soup.find_all('h2', {'class':"summary-item__hed"}) res = [] for i in range(len(titles)): entry = {'Title': titles[i].text.strip(), 'Link': 'https://www.vogue.com'+links[i]['href'].strip()} res.append(entry) driver.quit()
注意事项
- 控制请求/点击间隔,避免短时间高频请求触发站点反爬限制
- 站点接口和页面元素选择器可能会迭代更新,若代码失效可重新捕获接口或更新元素选择器即可
内容的提问来源于stack exchange,提问作者Dee Cap
相关产品推荐
相关产品推荐

