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

为何用Selenium+BeautifulSoup爬取谷歌搜索href返回空ResultSet?

回答

原因分析

谷歌会定期更新搜索页面的HTML结构,包括动态生成CSS类名(如yuRUbf)。这类类名没有固定命名规则,谷歌会频繁更换以防范自动化爬取,因此依赖该类名的代码会随着页面更新失效。

解决方案

1. 更换为更稳定的元素选择逻辑

放弃依赖动态类名,转而基于链接的特征定位。谷歌搜索结果的真实链接通常被包装在/url?q=开头的跳转链接中,可通过过滤这类链接提取真实地址:

# 替换原有的查找代码段
links = []
soup = BeautifulSoup(driver.page_source, 'html.parser')
# 查找所有带href属性的a标签
all_links = soup.find_all('a', href=True)
for link in all_links:
    href = link['href']
    # 筛选谷歌跳转链接,排除谷歌自身域名的链接
    if href.startswith('/url?q=') and not href.startswith('/url?q=https://www.google'):
        # 解析出真实链接(去除谷歌跳转的参数)
        real_link = href.split('/url?q=')[1].split('&')[0]
        links.append(real_link)
print(links)

2. 确保页面完全加载后再解析

谷歌搜索页面是动态渲染的,需添加显式等待避免因元素未加载导致的查找失败:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver.get(url)
# 等待搜索结果链接出现,最长等待10秒
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, 'a[href^="/url?q="]'))
)
# 等待完成后再获取页面源码
soup = BeautifulSoup(driver.page_source, 'html.parser')

3. 优化反爬规避策略

  • 原代码中UserAgent需提前导入并安装依赖:添加from fake_useragent import UserAgent,并在shell部分执行pip install fake-useragent
  • 添加随机延迟避免请求过于频繁:
    import random
    import time
    # 在driver.get(url)后添加
    time.sleep(random.uniform(2, 5))
    
  • 禁用Selenium的自动化标识,模拟真实浏览器:
    options.add_argument('--disable-blink-features=AutomationControlled')
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    

注意事项

谷歌反爬机制严格,频繁自动化请求可能导致IP封禁。建议优先使用谷歌官方的Custom Search API,这是合法且稳定的搜索结果获取方式。


内容的提问来源于stack exchange,提问作者Alejandro Romero López

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 23:25:57