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:形式显示在页面链接里,邮箱通常藏在目标网站内部,你的代码只在当前搜索页查找,自然找不到内容。
解决方法
- 添加请求头模拟浏览器
给请求加上浏览器的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)
- 提取目标网站链接并逐个爬取
先从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}")
- 用正则匹配所有邮箱格式内容
不管是mailto:里的还是纯文本显示的邮箱,都可以用正则表达式统一提取,避免遗漏纯文本形式的邮箱。
内容的提问来源于stack exchange,提问作者someone
相关产品推荐
相关产品推荐

