使用BeautifulSoup爬取Google图片时src标签请求异常如何解决?
问题排查结论
你遇到的问题是多个原因共同导致的,和谷歌图片的返回结构、请求配置都有关:
- 谷歌图片搜索结果的首个
<img>标签是谷歌官方logo的base64编码占位图,src属性以data:image/开头,不属于可发起HTTP请求的网络链接,直接传入requests.get()会触发异常 - 请求图片资源时没有携带请求头,谷歌的静态资源服务会校验请求身份,无合法User-Agent的请求会被直接拦截返回403
- 计数逻辑存在误差,
tik <= NumberOfImages会导致最终下载的图片数量比你输入的指定数量多1张 - 没有对输入的文件夹路径做校验,如果你输入的Google Drive路径不存在,写入文件时会直接抛出IO错误
修复后的代码
# 挂载Google Drive from google.colab import drive drive.mount('/content/gdrive') import requests import os from bs4 import BeautifulSoup import base64 # 定义搜索参数 query = input("Images of:") NumberOfImages = int(input("Number of images:")) FolderLocation = input("Input Folder Location(示例:/content/gdrive/MyDrive/imgs):") # 目标文件夹不存在则自动创建 os.makedirs(FolderLocation, exist_ok=True) query= query.split() query='+'.join(query) url="https://www.google.co.in/search?q="+query+"&source=lnms&tbm=isch" headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'} # 解析搜索页面 request = requests.get(url,headers=headers) soup = BeautifulSoup(request.text,'html.parser') images = soup.find_all('img') tik = 0 for image in images: if tik < NumberOfImages: link = image.get('src', '') # 跳过无有效src的标签 if not link: continue name = f"{query}_{tik}.jpg" print(link, name) save_path = os.path.join(FolderLocation, name) with open(save_path,'wb') as f: # 处理base64格式的占位图 if link.startswith('data:image'): # 截取base64编码部分解码写入 img_data = base64.b64decode(link.split(',')[1]) f.write(img_data) else: # 请求网络图片时携带合法请求头 im = requests.get(link, headers=headers) f.write(im.content) print(f"Writing {name} to file") tik +=1 else: break
额外说明
如果需要下载高清原图,谷歌图片的原图地址默认不会存在于首次加载的img标签的src属性中,你需要额外解析页面的JSON数据块提取高清链接,上述修复后的代码已经可以实现基础的谷歌图片缩略图下载功能,符合入门阶段的学习需求。
内容的提问来源于stack exchange,提问作者CosCosCos
相关产品推荐
相关产品推荐

