如何使用Python从任何网站提取电子邮件?

1,241 阅读15分钟

文章首先提出了一个关于如何使用Python从任何网站提取电子邮件的问题,给你一个解决方案的概述,然后为初学者详细介绍了每个解决方案。

在本文的最后,你将知道比较从网站上提取电子邮件的方法的结果。继续阅读,找出答案。

你可能想在这里读出关于网络搜刮的免责声明。

问题的提出

营销人员建立电子邮件列表以产生线索。

统计显示,33%的营销人员每周发送一次电子邮件,26%的营销人员每月发送多次电子邮件。电子邮件列表是公司和工作搜索的绝佳工具。

例如,要想了解招聘信息,你可以猎取你想要的公司的员工的电子邮件地址。

然而,手动查找、复制和粘贴电子邮件到CSV文件需要时间,花费金钱,而且容易出错。网上有很多关于建立电子邮件提取机器人的教程。

当试图从一个网站上提取电子邮件时,这些机器人会遇到一些困难。这些问题包括冗长的数据提取时间和出现意外错误。

那么,如何以最有效的方式从公司网站获取电子邮件地址?如何使用强大的编程Python来提取数据?

方法总结

这篇文章将提供两种从网站提取电子邮件的方法。它们分别被称为 直接提取电子邮件间接提取电子邮件,分别是。

💡 当使用直接电子邮件提取方法时,我们的Python代码将在一个给定的公司或特定网站的目标页面上搜索电子邮件。

例如,当用户在屏幕上输入"www.scrapingbee.com"时,我们的Python电子邮件提取机器人就会刮取该网站的URLs。然后,它使用一个重词库来寻找电子邮件,然后将它们保存在CSV文件中。

💡 第二种方法,即间接提取电子邮件的方法,利用Google.com的搜索引擎结果页(SERP)来提取电子邮件地址,而不是使用一个特定的网站。

例如,一个用户可以输入 "scrapingbee.com "作为网站名称。电子邮件提取器机器人将根据这个词进行搜索,并将结果返回给系统。然后,该机器人将使用重码提取的电子邮件地址从这些搜索结果中存储到一个CSV文件中。

👉 在下一节中,你将更详细地了解这些方法。

这两种技术是优秀的电子邮件列表建立工具。

正如已经说过的,网上发布的其他电子邮件提取技术的主要问题是,它们提取了数百个不包含电子邮件的不相关网站的URL。通过这些方法的编程运行需要几个小时。

通过继续阅读,发现我们的两种优秀方法。

解决方案

方法1 直接提取电子邮件

这种方法将概述从特定网站获取电子邮件地址的逐步过程。

第1步:安装库

使用pip 命令,安装以下 Python 库。

  1. 你可以使用正则表达式(re)来匹配一个电子邮件地址的格式。
  2. 你可以使用 [request](https://blog.finxter.com/python-requests-library/)模块来发送HTTP请求。
  3. bs4 是一个用于网页提取的漂亮的汤
  4. collections 包中的deque 模块允许将数据存储在容器中。
  5. urlib 包中的urlsplit 模块将一个 URL 拆成四个部分。
  6. 这些邮件可以保存在一个DataFrame中,以便将来使用 [pandas](https://blog.finxter.com/pandas-quickstart/)模块。
  7. 你可以使用tld 库来获取相关的电子邮件。
pip install re
pip install request
pip install bs4
pip install python-collections
pip install urlib
pip install pandas
pip install tld

第2步导入库

如下图所示,导入库。

import re
import requests
from bs4 import BeautifulSoup
from collections import deque
from urllib.parse import urlsplit
import pandas as pd
from tld import get_fld

第3步创建用户输入

要求用户输入所需的网站以提取电子邮件,用 [input()](https://blog.finxter.com/python-input-function/)函数,并将其存储在变量user_url

user_url = input("Enter the website url to extract emails: ")
if "https://" in user_url:
    user_url = user_url
else:
    user_url = "https://"+ user_url

第4步设置变量

在我们开始写代码之前,让我们定义一些变量。

使用下面的命令创建两个变量,以存储被搜刮和未被搜刮网站的URL。

unscraped_url = deque([user_url])
scraped_url = set()

你可以使用deque 容器保存未被搜刮的网站的URL。此外,被搜刮的网站的URL会以设定的数据格式保存。

如下图所示,变量list_emails 包含检索到的电子邮件。

list_emails = set()

利用集合数据类型主要是为了消除重复的电子邮件,只保留唯一的电子邮件。

让我们继续进行我们的主程序的下一步,从网站中提取电子邮件。

第5步为内容提取添加Urls。

网页的URLs从变量unscraped_url 转移到scrapped_url ,开始从用户输入的URLs中提取内容的过程。

while len(unscraped_url):
    url = unscraped_url.popleft()
    scraped_url.add(url)

popleft() 方法从deque 容器的左侧移除网页URLs,并将其保存在url 变量中。

然后用url ,存储在scraped_url[add()](https://blog.finxter.com/python-set-add/)方法。

第6步拆分URL并与基本URL合并。

该网站包含相对链接,你不能直接访问。

因此,我们必须将相对链接与基本URL合并。我们需要urlsplit() 函数来做这件事。

parts = urlsplit(url)

创建一个parts 变量来分割URL,如下图所示。

SplitResult(scheme='https', netloc='www.scrapingbee.com', path='/', query='', fragment='')

如上图所示的例子,URLwww.scrapingbee.com/被分割成scheme,netloc,path, 和其他元素。

分割结果的netloc 变量包含网站的名称。继续阅读以了解这个程序如何有利于我们的编程。

base_url = "{0.scheme}://{0.netloc}".format(parts)

接下来,我们通过合并schemenetloc 来创建基本URL。

基本URL意味着主网站的URL是你在浏览器的地址栏中输入时的内容。

如果用户在程序要求时输入了相对的URL,我们就必须把它们转换回基本URL。我们可以通过使用命令来完成这个任务。

if '/' in parts.path:
    part = url.rfind("/")
    path = url[0:part + 1]
else:
    path = url

让我们了解上述命令的每一行是如何工作的。

假设用户输入了以下URL。

这个URL是一个相对链接,上面的一组命令将把它转换为一个基本的URL (https://www.scrapingbee.com).让 我们来看看它是如何工作的。

如果条件发现URL的路径中有一个 "/",那么命令将使用方法找到最后一个斜线 "/"所在的位置。 [rfind()](https://blog.finxter.com/python-string-rfind/)方法找到最后一个斜杠""的位置。"/" 位于第27个位置。

下一行代码存储了从0到27+1的URL,即第28项位置,即www.scrapingbee.com/。 因此,它转换为基本URL。

在最后一条命令中,如果没有来自URL的相对链接,它就与基本URL相同。该链接在path 变量中。

下面的命令打印了程序正在搜刮的URL。

print("Searching for Emails in  %s" % url)

第7步从URLs中提取电子邮件

HTML获取请求命令访问用户输入的网站。

response = requests.get(url)

然后,使用正则表达式从响应变量中提取所有电子邮件地址,并将其更新到list_emails 集。

new_emails = ((re.findall(r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b", response.text, re.I)))
list_emails.update(new_emails)

回归的建立是为了匹配新的电子邮件变量中显示的电子邮件地址语法。回归格式用response.text 方法从网站URL的内容中提取电子邮件地址。 而re.I 标志方法忽略了字体大小写。list_emails 集被更新为新的电子邮件。

接下来是找到所有网站的URL链接并提取它们,以便检索出当前可用的电子邮件地址。你可以利用一个强大的、美丽的汤模块来执行这个程序。

soup = BeautifulSoup(response.text, 'lxml')

beautiful soup函数解析用户所输入的网页的HTML文档,如上面的命令所示。

你可以通过下面的命令来了解有多少邮件被提取出来。

print("Email Extracted: " + str(len(list_emails)))

与网站相关的URL可以通过"a href"锚标签找到。

for tag in soup.find_all("a"):
    if "href" in tag.attrs:
        weblink = tag.attrs["href"]
    else:
        weblink = ""

美丽汤从网站上找到所有的锚标签 "a" 。

然后,如果href 在标签的属性中,那么soup在weblink变量中获取URL,否则就是一个空字符串。

if weblink.startswith('/'):
    weblink = base_url + weblink
elif not weblink.startswith('https'):
    weblink = path + weblink

href 只包含一个以 "/" 开头的特定页面的链接,页面名称,而没有基本的URL。

例如,你可以在搜刮蜂网站上看到下面的URL。

  • <a **href="/#pricing"** class="block hover:underline">Pricing</a>
  • <a **href="/#faq**" class="block hover:underline">FAQ</a>
  • <a **href="/documentation"** class="text-white hover:underline">Documentation</a>

因此,上述命令结合了提取的href 链接和基本URL。

例如,在定价的情况下,网络链接变量如下。

Weblink = "https://www.scrapingbee.com/#pricing"

在某些情况下,href 没有以 "/" 或 "https" 开头;在这种情况下,该命令将路径与该链接结合起来。

例如,href ,就像下面这样。

<a href="mailto:support@scrapingbee.com?subject=Enterprise plan&amp;body=Hi there, I'd like to discuss the Enterprise plan." class="btn btn-sm btn-black-o w-full mt-13">1-click quote</a>

现在让我们用下面的命令完成代码。

if not weblink in unscraped_url and not weblink in scraped_url:
    unscraped_url.append(weblink)

print(list_emails)

上述命令将未被搜刮的URL追加到未被搜刮的url 变量中。要查看结果,请打印list_emails。

运行该程序。

如果程序不工作怎么办?

你是否遇到了模式缺失、连接错误或无效URL等错误或异常?

有些网站你由于某种原因无法访问。

不要担心!让我们看看如何打击这些错误。

使用Try Exception命令来绕过这些错误,如下所示。

try:
    response = requests.get(url)
except (requests.exceptions.MissingSchema, requests.exceptions.ConnectionError, requests.exceptions.InvalidURL):
    continue

在电子邮件重码命令之前插入该命令。准确地说,把这个命令放在new_emails 变量之上。

现在运行该程序。

程序工作了吗?

它是否一直运行了几个小时也没有完成?

该程序从给定的网站中搜索并提取所有的URLs。同时,它也在提取其他域名网站的链接。例如,Scraping Bee网站的URLs有:seekwell.io/[。、](seekwell.io/) codesubmit.io/,等等。

一个建好的网站,一个网站的单页有多达100个链接。因此,该程序将需要几个小时来提取链接。

对此,我很抱歉。你必须面对这个问题,才能得到你的目标邮件。

再见,文章到此结束........

不,我只是在开玩笑!

别担心!我将在下一步给你最好的解决方案。

第8步修复代码问题

下面是给你的解决代码。

if base_url in weblink: # code1
    if ("contact" in weblink or "Contact" in weblink or "About" in weblink or "about" in weblink or 'CONTACT' in weblink or 'ABOUT' in weblink or 'contact-us' in weblink): #code2
        if not weblink in unscraped_url and not weblink in scraped_url:
            unscraped_url.append(weblink)

首先,应用代码1,它规定你只包括来自链接网络链接的基本URL网站,以防止从一个特定的网站刮取其他域名网站。

由于大多数电子邮件是在 "联系我们 "和 "关于 "网页上提供的,因此只有那些来自这些网站的链接将被提取(参考代码2)。其他网页不在考虑之列。

最后,未被抓取的URL被添加到unscrapped_url 变量中。

第9步将电子邮件地址导出到CSV文件。

最后,我们可以通过数据框pandas将电子邮件地址保存在CSV文件中(email2.csv)。

url_name = "{0.netloc}".format(parts)
col = "List of Emails " + url_name
df = pd.DataFrame(list_emails, columns=[col])
s = get_fld(base_url)
df = df[df[col].str.contains(s) == True]
df.to_csv('email2.csv', index=False)

我们使用get_fld 来保存属于基本URL的一级域名的电子邮件。s 变量包含基础URL的第一级域名。例如,一级域名是scrapingbee.com。

我们在数据框中只包括以网站的一级域名结尾的电子邮件。其他不属于基本URL的域名则被忽略。最后,数据框将电子邮件传输到CSV文件中。

如前所述,一个网站管理员可以在每个页面维护多达100个链接。

因为对于一个正常的网站来说,每页都有超过30个超链接,所以还是需要一些时间来完成这个程序。如果你认为软件已经提取了足够的邮件,你可以使用try except KeyboardInterruptraise SystemExit 命令手动停止它,如下图所示。

try:
while len(unscraped_url):
…
    if base_url in weblink:
        if ("contact" in weblink or "Contact" in weblink or "About" in weblink or "about" in weblink or 'CONTACT' in weblink or 'ABOUT' in weblink or 'contact-us' in weblink):
            if not weblink in unscraped_url and not weblink in scraped_url:
                unscraped_url.append(weblink)
    url_name = "{0.netloc}".format(parts)
    col = "List of Emails " + url_name
    df = pd.DataFrame(list_emails, columns=[col])
    s = get_fld(base_url)
    df = df[df[col].str.contains(s) == True]
    df.to_csv('email2.csv', index=False) 
except KeyboardInterrupt:
    url_name = "{0.netloc}".format(parts)
    col = "List of Emails " + url_name
    df = pd.DataFrame(list_emails, columns=[col])
    s = get_fld(base_url)
    df = df[df[col].str.contains(s) == True]
    df.to_csv('email2.csv', index=False)
    print("Program terminated manually!")
    raise SystemExit

运行该程序并享受它...

让我们看看我们神奇的电子邮件搜刮程序产生了什么。我输入的网站是www.abbott.com。

输出。

方法2 间接提取电子邮件

你将学习使用第二种方法从Google.com提取电子邮件地址的步骤。

第1步:安装库

使用pip 命令,安装以下Python库。

  1. bs4 是一个用于提取google网页的美丽汤。
  2. pandas 模块可以将电子邮件保存在一个DataFrame中,以便将来处理。
  3. 你可以使用正则表达式 (re) 来匹配电子邮件地址的格式。
  4. request 库发送 HTTP 请求。
  5. 你可以使用tld 库来获取相关的电子邮件。
  6. time 库来延迟网页的搜刮。
pip install bs4
pip install pandas
pip install re
pip install request
pip install time

第2步:导入库

导入库的内容。

from bs4 import BeautifulSoup
import pandas as pd
import re
import requests
from tld import get_fld
import time

第3步:构造搜索查询

搜索查询以 "@websitename.com" 的格式编写。

创建一个输入,让用户输入网站的URL。

user_keyword = input("Enter the Website Name: ")
user_keyword = str('"@') + user_keyword +' " '

搜索查询的格式是"@websitename.com ,"如上面user_keyword 变量的代码所示。该搜索查询有开头和结尾的双引号。

第4步:定义变量

在进入程序的核心部分之前,让我们首先设置变量。

page = 0
list_email = set()

你可以使用page 这个变量在多个谷歌搜索结果页面中移动。而list_email ,用于提取的电子邮件集。

第5步请求谷歌页面

在这一步,你将学习如何使用用户的关键字词创建一个Google URL链接,并请求相同的内容。

编码的主要部分开始如下。

while page <= 100:
    print("Searching Emails in page No " + str(page))
    time.sleep(20.00)
    google = "https://www.google.com/search?q=" + user_keyword + "&ei=dUoTY-i9L_2Cxc8P5aSU8AI&start=" + str(page)
    response = requests.get(google)
    print(response)

让我们研究一下每行代码的作用。

  • while 循环使电子邮件提取机器人能够检索到特定页数的电子邮件,在本例中是10页。
  • 该代码打印出被提取的谷歌页面的页码。第一个页面用页码0表示,第二个用页码10表示,第三个用页码20表示,以此类推。
  • 为了防止让谷歌的IP被屏蔽,我们把编程速度放慢了20秒,并更慢地请求URL。

在创建google变量之前,让我们多了解一下google的搜索URL。

假设你在google.com上搜索关键词 "德国"。那么google搜索的URL将是这样的

  • https://www.google.com/search?q=germany

如果你点击谷歌搜索结果的第二页,那么链接将如下所示。

  • https://www.google.com/search?q=germany&ei=dUoTY-i9L_2Cxc8P5aSU8AI&start=10

这个链接是如何工作的?

  • 用户关键词被插入到 "q=" 符号之后,而页码则被添加到 "start=" 之后,如上图中的google变量。
  • 之后请求一个谷歌网页,然后打印结果。来测试是否正常运行。如果你收到一个200的响应代码,网站就被成功访问。如果你收到的是429,这意味着你已经达到了请求限制,必须等待两个小时才能再提出请求。

第6步提取电子邮件地址

在这一步,你将学习如何从谷歌搜索结果内容中提取电子邮件地址。

soup = BeautifulSoup(response.text, 'html.parser')
new_emails = ((re.findall(r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b", soup.text, re.I)))
list_email.update(new_emails)
page = page + 10

美丽汤解析网页并提取html网页的内容。

使用regex [findall()](https://blog.finxter.com/python-re-findall/)函数,你可以获得电子邮件地址,如上所示。然后,新的电子邮件被更新到list_email 集。该页面被添加到10,用于导航下一个页面。

n = len(user_keyword)-1
base_url = "https://www." + user_keyword[2:n]
col = "List of Emails " + user_keyword[2:n]
df = pd.DataFrame(list_email, columns=[col])
s = get_fld(base_url)
df = df[df[col].str.contains(s) == True]
df.to_csv('email3.csv', index=False)

最后,从上述几行代码中把目标邮件保存到CSV文件中。user_keyword 中的列表项从第二个位置开始,直到域名。

运行该程序,看看输出结果。

方法1与方法2

我们能否确定哪种方法对建立电子邮件列表更有效。 方法1 直接提取电子邮件方法2 间接提取电子邮件?输出的电子邮件列表是由网站abbot.com生成的。

让我们对比一下用方法1和方法2提取的两个电子邮件列表。

  • 从方法1中,提取器已经提取了60封电子邮件。
  • 从方法2中,提取器检索到了19封电子邮件。
  • 方法2中的17封电子邮件列表不包括在方法1中。
  • 这些电子邮件是针对员工的,而不是全公司的。此外,在方法1中,有更多的员工电子邮件。

因此,我们无法推荐一种程序而不是另一种。这两种技术都能提供新鲜的电子邮件名单。因此,这两种方法都会增加你的电子邮件列表。

总结

建立一个电子邮件列表对企业和自由职业者来说都是至关重要的,可以增加销售和线索。

本文提供了关于使用Python从网站上获取电子邮件地址的说明。

文章中提供了获取电子邮件地址的两种最佳方法。

为了提供一个建议,最后对这两种技术进行了比较。

第一种方法是直接从任何网站提取电子邮件,第二种方法是使用Google.com提取电子邮件地址。