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

爬取Google图片搜索结果网站URL返回空列表的解决方法

Google图片搜索爬虫提取关联网站URL返回空列表修复方案

问题概述

  • 核心需求:提取Google图片搜索结果中关联的源站URL,统一存入列表
  • 异常现象:基于requests、BeautifulSoup编写的爬虫运行后,最终返回的链接列表为空
  • 测试用搜索入口:Google图片搜索链接
  • 目标提取效果:图片搜索结果页待提取URL示意

原问题代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 10:51:34