爬取Google图片搜索结果网站URL返回空列表的解决方法
Google图片搜索爬虫提取关联网站URL返回空列表修复方案
问题概述
- 核心需求:提取Google图片搜索结果中关联的源站URL,统一存入列表
- 异常现象:基于
requests、BeautifulSoup编写的爬虫运行后,最终返回的链接列表为空 - 测试用搜索入口:Google图片搜索链接
- 目标提取效果:

原问题代码
from bs4 import BeautifulSoup search_link = 'https://www.google.com/search?tbs=sbi:AMhZZisiaoy1wggx2tclyVPl7ZElZuKcwjhfiYUHVFXr34pc55jcoqk8gusdeUW0_1iysA9-fbuy5vl4ZFPZl-46EcoOGra04IDQDSCBTZpGaaUeO7tw4xLQ2q_159_1GsCOjhyIPi5smZmTTzjezzRsekOALA0u-5GuinrW72FIUSfyc9SsLBqw8DH88ATdRnSefjF3bC9di_1las1jmHga4lAPcWRENSwiSyEMfvNO_1Bh5B8pUtzlXNL4MTx8XdRDUCyT8mt0vqYlG1lymcrV_15Ql6OyfgK9r4CLM0YZ3awnw2kiH60Ft6q1mySWtoXULycNbdgbGPtg1s214kr5G2r_1TnFmeEYTQObQ&hl=en-KR' all_links=[] for i in range(1,10): url= search_link.format(i) #print("url: " +url) r = requests.get(url) c = r.content soup = BeautifulSoup(c, 'html.parser') all = soup.find_all('a', {'class': 'ArticleTeaserSearchResultItem_link'}, href=True) for item in all: print(item) print(item['href']) all_links.append(item['href']) print(all_links)
问题根因
- 基础语法错误:原代码未导入
requests依赖,直接运行会抛出模块不存在的报错;且定义的search_link字符串无{}占位符,调用.format(i)无法修改URL,分页逻辑完全失效 - 选择器不匹配:
ArticleTeaserSearchResultItem_link是第三方内容站点的CSS类名,Google搜索结果页的DOM元素不存在该类,无法匹配到任何目标节点 - 反爬拦截:
requests默认请求头会被Google识别为爬虫程序,返回的内容是人机验证页或异常提示页,并非正常搜索结果结构 - 分页规则错误:Google搜索分页通过
start参数控制(每页默认返回20条结果,参数值按0、20、40依次递增),原代码未使用正确的分页参数规则 - 链接格式未处理:Google搜索结果的站外链接默认使用自身跳转前缀,不会直接展示源站地址,即使匹配到节点也需要二次解析才能拿到真实URL
修复后实现代码
import requests import time from bs4 import BeautifulSoup from urllib.parse import urlparse, parse_qs # 基础搜索地址,预留分页参数start占位符,修正原链接中的HTML转义字符&为& base_link = 'https://www.google.com/search?tbs=sbi:AMhZZisiaoy1wggx2tclyVPl7ZElZuKcwjhfiYUHVFXr34pc55jcoqk8gusdeUW0_1iysA9-fbuy5vl4ZFPZl-46EcoOGra04IDQDSCBTZpGaaUeO7tw4xLQ2q_159_1GsCOjhyIPi5smZmTTzjezzRsekOALA0u-5GuinrW72FIUSfyc9SsLBqw8DH88ATdRnSefjF3bC9di_1las1jmHga4lAPcWRENSwiSyEMfvNO_1Bh5B8pUtzlXNL4MTx8XdRDUCyT8mt0vqYlG1lymcrV_15Ql6OyfgK9r4CLM0YZ3awnw2kiH60Ft6q1mySWtoXULycNbdgbGPtg1s214kr5G2r_1TnFmeEYTQObQ&hl=en-KR&start={}' # 模拟正常浏览器的请求头,绕过基础反爬检测 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Accept-Language': 'en-US,en;q=0.9' } all_links = [] # 爬取前9页结果,对应start参数0-160 for page_idx in range(9): start_val = page_idx * 20 current_url = base_link.format(start_val) resp = requests.get(current_url, headers=headers, timeout=10) # 状态码异常直接跳过当前页 if resp.status_code != 200: print(f"第{page_idx+1}页请求失败,状态码:{resp.status_code}") continue soup = BeautifulSoup(resp.text, 'html.parser') # 遍历所有带href属性的a标签 for a_tag in soup.find_all('a', href=True): href = a_tag['href'] # 匹配Google站外跳转链接格式 if href.startswith('/url?q='): # 解析提取真实源站URL real_url = parse_qs(urlparse(href).query).get('q', [''])[0] # 去重后存入结果列表 if real_url and real_url not in all_links: all_links.append(real_url) # 降低请求频率,避免触发反爬 time.sleep(3) print(all_links)
补充说明:如果运行后仍返回人机验证页面,说明当前IP已被Google反爬限制,可更换代理IP、升级请求头指纹,或改用
playwright/selenium等支持JS渲染的工具加载完整页面后再做解析。
内容的提问来源于stack exchange,提问作者David98
相关产品推荐
相关产品推荐

