如何从Brave图片搜索页面爬取指定类的图片src链接?
解决Brave图片搜索结果图片src抓取失败的问题
问题根源
你的代码在Brave图片搜索页面失效,核心原因是该页面的图片结果是通过JavaScript动态渲染生成的。requests或urllib直接请求得到的是初始HTML骨架,浏览器还没执行JS,所以目标img.image.svelte-qd248k标签根本不存在于静态源码中。
此外你的代码还存在几个冗余/错误点:
- 重复发起HTTP请求(先用
requests.get又用urllib.request.urlopen),完全没必要 - 未按目标class筛选img标签,而是遍历所有img,会拿到很多无关元素
- 链接拼接逻辑错误:如果src本身是完整URL,直接拼接基础url会生成类似
https://search.brave.com/images?q=lfchttps://xxx.com/xxx.jpg的无效链接 - 用
set存储link对象而非src字符串,去重逻辑无效
解决方案
方案1:用Selenium模拟浏览器渲染(最直接)
通过模拟浏览器加载页面并执行JS,获取渲染后的完整源码,再提取图片链接。
- 先安装依赖:
pip install selenium beautifulsoup4
下载对应浏览器的驱动(比如ChromeDriver,需和你的Chrome版本匹配),放到可执行路径下。
修正后的代码:
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 url = "https://search.brave.com/images?q=lfc" # 初始化浏览器(这里用Chrome,也可以用Firefox等) driver = webdriver.Chrome() driver.get(url) # 等待图片元素加载完成(最多等10秒) try: WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "svelte-qd248k")) ) except: print("图片元素加载超时") driver.quit() exit() # 获取渲染后的页面源码 page_source = driver.page_source driver.quit() # 保存页面源码到文件 with open("brave_images_page.txt", "w", encoding="utf-8") as f: f.write(page_source) # 解析源码提取目标图片src soup = BeautifulSoup(page_source, "html.parser") target_imgs = soup.find_all("img", class_="image svelte-qd248k") # 收集并保存图片链接 all_img_srcs = set() with open("imgUrls.txt", "w", encoding="utf-8") as f: for img in target_imgs: src = img.get("src") if src and src != "#": all_img_srcs.add(src) print(src) f.write(src + "\n") print(f"共提取到{len(all_img_srcs)}个有效图片链接")
方案2:直接调用Brave图片搜索API(效率更高)
通过浏览器开发者工具抓包,找到Brave图片搜索的API接口,直接请求接口获取JSON格式的图片数据,无需渲染页面。
示例(需根据实际抓包结果调整请求头和参数):
import requests url = "https://search.brave.com/api/images/search" params = { "q": "lfc", "count": 20, # 每页数量 "offset": 0 } # 模拟浏览器请求头,避免被拦截 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" } response = requests.get(url, params=params, headers=headers) data = response.json() # 提取图片链接 img_srcs = [item["thumbnail"] for item in data["results"]] # 保存结果 with open("imgUrls_api.txt", "w", encoding="utf-8") as f: for src in img_srcs: f.write(src + "\n")
注意:API接口可能会随时变化,需要自行抓包确认最新的接口地址和参数。
内容的提问来源于stack exchange,提问作者AnxiousDino
相关产品推荐
相关产品推荐

