Python requests模块无法获取谷歌以图搜图完整页面内容
问题核心原因
- 谷歌图片搜索的结果区域是JavaScript动态渲染生成的:
requests模块仅能获取服务器返回的初始静态HTML文本,不会执行页面内嵌的JS脚本,无法获取JS运行后才插入页面的搜图结果内容。requests返回的内容和浏览器右键「查看网页源代码」展示的内容完全一致,仅包含导航、页脚这类不需要JS加载的静态公共模块。 - 默认请求未携带真实浏览器身份标识:requests默认的请求头
User-Agent会标识自身为Python爬虫,谷歌会对这类请求返回精简页面,甚至触发反爬校验,不会返回完整结果。 - 代码中Windows本地路径未做转义处理:直接书写
"C:\Users\mjjha\..."格式的路径,会因为反斜杠为转义字符触发路径解析错误。
修复方案
- 首先给所有请求加上真实浏览器的请求头,模拟正常用户访问,解决反爬返回精简页的问题。如果补全请求头后仍无法获取完整结果,必须更换支持JS渲染的抓取工具——纯requests不具备JS执行能力,本质上不可能抓取动态生成的页面内容。
- 两类常用实现路径:
- 轻量方案:使用
requests-html库,内置Chromium内核,可自动执行页面JS后再提取DOM内容,代码改动量小。 - 稳定方案:使用Playwright/Selenium这类浏览器自动化工具,完全模拟真实浏览器加载行为,等搜图结果全部渲染完成后再提取标签内容,反爬触发概率最低。
- 轻量方案:使用
修正后的参考代码(requests-html版本)
首先安装依赖:pip install requests-html beautifulsoup4
from requests_html import HTMLSession from bs4 import BeautifulSoup import webbrowser # 路径前加r做原生字符串转义,避免Windows路径反斜杠转义问题 filePath = r"C:\Users\mjjha\Documents\Checkrow\monaLisa.jpg" searchUrl = 'http://www.google.com/searchbyimage/upload' # 模拟真实浏览器请求头 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", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8" } session = HTMLSession() multipart = {'encoded_image': (filePath, open(filePath, 'rb')), 'image_content': ''} response = session.post(searchUrl, files=multipart, allow_redirects=False, headers=headers) fetchUrl = response.headers['Location'] # 访问结果页,等待JS渲染完成,等待时间可根据网络情况调整 r = session.get(fetchUrl, headers=headers) r.html.render(timeout=20) webbrowser.open(fetchUrl) soup = BeautifulSoup(r.html.html, 'html.parser') # 提取需要的标签 all_a = soup.find_all('a') all_img = soup.find_all('img') all_h3 = soup.find_all('h3') # 示例输出a标签链接 for i in all_a: if i.get('href'): print(i['href'])
首次运行
requests-html时会自动下载Chromium内核,等待下载完成即可正常运行。如果需要更高的抓取稳定性,可直接替换为Playwright实现,核心逻辑一致,页面加载等待的可控性更强。
内容的提问来源于stack exchange,提问作者Kshitij_Jha_7
相关产品推荐
相关产品推荐

