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

Python网页爬取邮箱结果空白问题排查求助

问题:爬取Google搜索结果中的邮箱地址返回空值

我写了一段Python代码,想从给定的Google搜索结果页面爬取邮箱地址,但输出一直为空,Excel文件里仅显示列名。作为Python新手,我不清楚问题出在哪里,代码如下:

import requests
from bs4 import BeautifulSoup
import pandas as pd

url ="https://www.google.com/search?q=solicitor+bereavement+wales+%27email%27&rlz=1C1CHBD_en-GBIT1013IT1013&sxsrf=AJOqlzWelf5qGpc4uqy_C2cd583OKlSEcQ%3A1675616694195&ei=tuHfY83MC-aIrwSQ3qxY&ved=0ahUKEwjN_9jO7v78AhVmxIsKHRAvCwsQ4dUDCBA&uact=5&oq=solicitor+bereavement+wales+%27email%27&gs_lcp=Cgxnd3Mtd2l6LXNlcnAQAzIFCAAQogQyBwgAEB4QogQyBwgAEB4QogQyBwgAEB4QogQyBwgAEB4QogQ6CggAEEcQ1gQQsANKBAhBGABKBAhGGABQrAxY7xRg1xZoAXABeACAAdIBiAGmBpIBBTEuNC4xmAEAoAEByAEIwAEB&sclient=gws-wiz-serp"

response = requests.get(url)
html_content = response.text

soup = BeautifulSoup(html_content, 'html.parser')

email_addresses = []
for link in soup.find_all('a'):
    if 'mailto:' in link.get('href'):
        email_addresses.append(link.get('href').replace('mailto:', ''))

df = pd.DataFrame(email_addresses, columns=['Email Addresses'])

df.to_excel('email_addresses_.xlsx',index=False)

问题原因

  • Google反爬拦截:直接用requests.get访问Google搜索页面,会被识别为非浏览器请求,返回的不是实际搜索结果页面(可能是人机验证页面或空白内容),导致BeautifulSoup找不到任何带mailto:的链接。
  • 搜索结果页面无直接mailto链接:Google搜索结果不会直接把邮箱以mailto:形式显示在页面链接里,邮箱通常藏在目标网站内部,你的代码只在当前搜索页查找,自然找不到内容。

解决方法

  1. 添加请求头模拟浏览器
    给请求加上浏览器的User-Agent信息,让请求看起来更像正常用户访问:
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36'
}
response = requests.get(url, headers=headers)
  1. 提取目标网站链接并逐个爬取
    先从Google搜索结果中提取每个结果的真实网址(注意Google的链接是/url?q=真实地址&...的形式,需要解析提取),再对每个网址发送请求,在目标网站内查找邮箱:
import re

# 提取搜索结果中的真实链接
links = []
for a_tag in soup.find_all('a', href=True):
    href = a_tag['href']
    if href.startswith('/url?q='):
        real_url = href.split('/url?q=')[1].split('&')[0]
        links.append(real_url)

# 遍历每个网站爬取邮箱
email_addresses = []
email_pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
for link in links:
    try:
        res = requests.get(link, headers=headers)
        page_emails = re.findall(email_pattern, res.text)
        email_addresses.extend(page_emails)
    except Exception as e:
        print(f"无法访问 {link}: {e}")
  1. 用正则匹配所有邮箱格式内容
    不管是mailto:里的还是纯文本显示的邮箱,都可以用正则表达式统一提取,避免遗漏纯文本形式的邮箱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:37:33