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

Python谷歌图片爬虫循环失效求助:soup.find_all('rg_meta')无响应

Google图片爬虫循环无法运行的解决方案

问题根源

Google图片搜索页面的HTML结构已更新,原脚本依赖的rg_meta类div元素已不存在,导致soup.find_all("div",{"class":"rg_meta"})找不到任何元素,循环无法执行。

修复方案

  1. 替换元素选择器:当前Google图片的原图链接存储在div.rg_i元素的data-iurl属性中,直接提取该属性即可获取图片地址;图片类型可通过URL后缀推断,或默认使用jpg格式。
  2. 更新请求头:使用更贴近现代浏览器的User-Agent,降低被拦截概率。
  3. 清理冗余代码:原脚本中query=input()会覆盖命令行传入的搜索词,可根据需求选择保留命令行参数或交互式输入。

修改后的完整代码

from bs4 import BeautifulSoup
import urllib.request as urllib2
import os
import argparse
import sys

def get_soup(url, header):
    return BeautifulSoup(urllib2.urlopen(urllib2.Request(url, headers=header)), 'html.parser')

def main(args):
    parser = argparse.ArgumentParser(description='Scrape Google images')
    parser.add_argument('-s', '--search', default='bananas', type=str, help='搜索关键词')
    parser.add_argument('-n', '--num_images', default=10, type=int, help='保存图片数量')
    parser.add_argument('-d', '--directory', default='/Users/gene/Downloads/', type=str, help='保存目录')
    args = parser.parse_args()
    
    # 二选一逻辑:命令行参数优先,无参数则走交互式输入
    query = input("请输入搜索关键词:") if not args.search else args.search
    max_images = args.num_images
    save_directory = args.directory
    
    # 自动创建不存在的保存目录
    if not os.path.exists(save_directory):
        os.makedirs(save_directory)
    
    query = '+'.join(query.split())
    url = f"https://www.google.co.in/search?q={query}&source=lnms&tbm=isch"
    # 更新为现代浏览器的User-Agent
    header = {
        "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"
    }
    soup = get_soup(url, header)
    ActualImages = []
    
    # 遍历新的图片元素容器,收集有效链接
    for img_container in soup.find_all("div", class_="rg_i"):
        img_url = img_container.get("data-iurl")
        if img_url:
            # 从URL推断图片类型,过滤无效格式后默认用jpg
            img_type = img_url.split('.')[-1].lower() if '.' in img_url else 'jpg'
            img_type = img_type if img_type in ['jpg', 'jpeg', 'png', 'gif'] else 'jpg'
            ActualImages.append((img_url, img_type))
            # 达到设定数量后停止收集
            if len(ActualImages) >= max_images:
                break
    
    # 下载并保存图片
    for i, (img, img_type) in enumerate(ActualImages):
        try:
            req = urllib2.Request(img, headers=header)
            raw_img = urllib2.urlopen(req).read()
            file_path = os.path.join(save_directory, f"img_{i}.{img_type}")
            with open(file_path, 'wb') as f:
                f.write(raw_img)
            print(f"已保存:{file_path}")
        except Exception as e:
            print(f"无法加载图片:{img}")
            print(f"错误信息:{str(e)}")

if __name__ == '__main__':
    try:
        main(sys.argv)
    except KeyboardInterrupt:
        print("程序已中断")
    sys.exit()

额外说明

  • 若仍出现无法获取元素的情况,可能是Google启用了动态加载,此时需要使用selenium等工具模拟浏览器行为获取完整页面。
  • 频繁爬取可能触发Google的反爬机制,建议添加请求间隔时间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 05:36:22