Python谷歌图片爬虫循环失效求助:soup.find_all('rg_meta')无响应
Google图片爬虫循环无法运行的解决方案
问题根源
Google图片搜索页面的HTML结构已更新,原脚本依赖的rg_meta类div元素已不存在,导致soup.find_all("div",{"class":"rg_meta"})找不到任何元素,循环无法执行。
修复方案
- 替换元素选择器:当前Google图片的原图链接存储在
div.rg_i元素的data-iurl属性中,直接提取该属性即可获取图片地址;图片类型可通过URL后缀推断,或默认使用jpg格式。 - 更新请求头:使用更贴近现代浏览器的User-Agent,降低被拦截概率。
- 清理冗余代码:原脚本中
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
相关产品推荐
相关产品推荐

