使用Beautiful Soup爬取Google图片遇异常,请求技术排查指导
问题描述
尝试用Beautiful Soup爬取Google图片搜索中「车内人物」相关内容时,通过URL获取的数据中大部分标记被隐藏/未显示,但浏览器中检查该URL能看到完整内容。注释请求头后内容缺失,使用请求头则返回异常结果(截图显示奇怪内容)。已确认非JS导致内容丢失(浏览器禁用JS后仍可见全部内容),还发现URL返回的信息和页面中检查的div数量相关,检查的div越多,获取的信息越多,求解决方法。
相关代码:
from bs4 import BeautifulSoup import numpy as np import requests url="https://www.google.com/search?site=&tbm=isch&source=hp&biw=1873&bih=990&" # u_agent={ # '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' # # 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', # # 'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3', # # 'Accept-Encoding': 'none', # # 'Accept-Language': 'en-US,en;q=0.8', # # 'Connection': 'keep-alive' # } page=requests.get(url + 'q='+'person-inside-car') soup=BeautifulSoup(page.text, 'html.parser') print(soup)
解决思路与方案
1. 修正请求头配置
Google有反爬机制,会识别非浏览器请求,之前的请求头参数不全(比如注释了Accept等字段)或设置错误(比如Accept-Encoding: none会导致编码异常),需要使用完整且正确的浏览器请求头:
from bs4 import BeautifulSoup import requests # 模拟Chrome浏览器的完整请求头 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', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', 'Referer': 'https://www.google.com/', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1' } search_query = 'person-inside-car' # 简化并规范URL拼接 url = f"https://www.google.com/search?tbm=isch&q={search_query}" page = requests.get(url, headers=headers) soup = BeautifulSoup(page.text, 'html.parser')
2. 正确提取图片链接
Google图片的缩略图链接通常存储在img标签的data-src属性中(src多为占位图),提取方式如下:
# 定位图片元素,class可能随Google更新变化,需自行核对 image_tags = soup.find_all('img', class_='rg_i Q4LuWd') for img_tag in image_tags: # 优先取data-src,没有则取src img_url = img_tag.get('data-src') or img_tag.get('src') if img_url: print(img_url)
3. 处理滚动加载的多结果问题
你提到的「检查div越多获取信息越多」,本质是Google图片采用滚动加载机制,初始请求仅返回部分结果。想要获取更多内容,有两种方式:
- 分页参数请求:在URL中添加
&start=N参数(N为结果起始索引,每次递增20,比如&start=20、&start=40),循环请求多页结果。 - 模拟浏览器滚动:使用Selenium模拟浏览器滚动行为,触发动态加载,再解析页面内容(适合需要大量结果的场景)。
内容的提问来源于stack exchange,提问作者Srivaths Gondi
相关产品推荐
相关产品推荐

