You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用requests+bs4爬取谷歌搜索结果时无法提取img完整src属性

问题解析与解决方法

现象原因

你遇到的问题本质是谷歌图片搜索的懒加载+反爬机制:

  • 谷歌返回的原始HTML中,img[id^="dimg"]标签的src只是一个1x1像素的base64占位图(就是你拿到的data:image/gif;base64,...),真实图片链接并不直接写在src属性里。
  • 当你把HTML保存到本地用浏览器打开时,浏览器会执行页面中的JavaScript代码,这些JS会从页面内嵌的JSON数据里读取真实图片链接,替换掉占位的src——所以你能看到正常渲染的图片,甚至在DevTools里能看到完整的src,但这是JS执行后的动态结果,不是爬虫直接拿到的原始HTML内容。

提取真实图片链接的方法

方法1:解析页面内嵌的JSON数据(无需模拟浏览器)

谷歌会把搜索结果的图片数据打包在页面的<script>标签里,格式类似AF_initDataCallback({key: 'ds:1', ...})。你可以提取这段脚本内容,解析出JSON后拿到真实图片URL:

import requests
from bs4 import BeautifulSoup
import json

# 添加请求头避免被谷歌拦截
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}
# 加tbm=isch指定图片搜索,更精准
url = "https://www.google.com/search?q=best+laptops+2022&tbm=isch"
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, "html.parser")

# 定位包含图片数据的script标签
for script in soup.find_all("script"):
    script_content = script.string
    if script_content and "AF_initDataCallback" in script_content:
        # 提取JSON核心内容
        json_str = script_content.split("AF_initDataCallback(")[1].split(");")[0]
        data = json.loads(json_str)
        # 遍历数据结构提取图片URL(路径可能随谷歌页面更新调整,可自行打印data查看结构)
        image_groups = data['data'][3][1][0][0][1]
        for group in image_groups:
            if group[0] and group[0][3]:
                print(group[0][3])  # 输出真实图片URL
        break

方法2:用Selenium模拟浏览器执行JS

如果觉得解析JSON太繁琐,直接用Selenium模拟浏览器加载页面,等JS执行完毕后再获取图片的src:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument("--headless=new")  # 无头模式,无需打开浏览器窗口
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36")

driver = webdriver.Chrome(options=options)
driver.get("https://www.google.com/search?q=best+laptops+2022&tbm=isch")

# 等待页面加载完成(可添加显式等待优化稳定性)
images = driver.find_elements(By.CSS_SELECTOR, 'img[id^="dimg"]')
for img in images:
    src = img.get_attribute("src")
    # 过滤掉占位图
    if not src.startswith("data:image/gif"):
        print(src)

driver.quit()

注意事项

  • 谷歌反爬严格,直接用requests可能被封IP或返回验证码,务必添加真实的User-Agent,必要时使用代理或添加请求延迟。
  • 谷歌页面结构可能随时更新,解析JSON的路径需要根据实际返回的数据调整,可通过print(data)查看完整结构后定位图片URL位置。

内容的提问来源于stack exchange,提问作者Driftr95

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 21:15:44