如何从公司名称中提取电子邮件ID
How to extract email-id from company name
我有一个 excel 文件,其中包含公司名称和公司地址(大约 7 万家公司)。我想在 python 中使用网络抓取工具提取该公司的电子邮件 ID。例如,如果我们在 google 中搜索 APPLE 公司,我们可以找到该公司的电子邮件 ID,这样我就可以找到文件中列出的公司的电子邮件 ID。
那么是否有可用的库或是否有任何库可以提取电子邮件 ID?
例如,如果我搜索 google manzoor export 这是结果
您可以在搜索页面中看到电子邮件 ID,我想使用 python 提取它。
这里有一些从头开始构建网络抓取工具的快速指南,以您的为例:
- 构建请求
Postman 是一个有用的工具,用于测试您对预期目标的请求并验证它是否按预期工作。在我看来,它提供了比 Web 浏览器的网络选项卡更好的环境。
在这种情况下,我将 manzoor export 的搜索结果 URL 复制粘贴到 Postman 中,删除了不必要的参数并发出了 GET 请求。确认它有效后,我在 Requests 语法中构建了请求:
session = Session()
session.head('https://www.google.com/')
def google_search(input_string):
response = session.get(
url = 'https://www.google.com/search',
params = {
"q": input_string
}
)
return response
- 解析请求输出
Beautiful Soup 是一个流行的 Python 库,它使解析变得非常容易 HTML(实际上我已经在我的第一个抓取工具中使用了它)。我在这里避免使用它的原因是,如今,我更喜欢一种更高效的基本替代方案:lxml。一旦你熟悉了它的语法,你就会体会到它的强大。
另一个有用的工具是像 this one 这样的 HTML 格式化程序,它可以帮助您更快地找到感兴趣的属性。
def get_email(response):
tree = html.fromstring(response.content)
search_results = tree.xpath("//div[@class='BNeawe s3v9rd AP7Wnd']")
for index, search_result in enumerate(search_results):
headings = search_result.xpath("./text()")
for idx, heading in enumerate(headings):
if "\nEmail: " == heading:
r = re.compile(".*@.*")
text = tree.xpath("//div[@class='BNeawe s3v9rd AP7Wnd']['+index+']/span['+idx+']/text()")
return list(filter(r.match, text))[0]
return None
P.S。如果你比我投入更多的时间,你可以大大改进这个功能。
- 最后润色
下面是完整的代码。我添加了几行,以 Google 可以处理它们的方式格式化搜索查询字符串,以及一个将电子邮件地址保存在 .csv 文件中的函数。
from requests import Session
from lxml import html
import re
import csv
import os
session = Session()
session.head('https://www.google.com/')
def google_search(input_string):
response = session.get(
url = 'https://www.google.com/search',
params = {
"q": input_string
}
)
return response
def get_email(response):
tree = html.fromstring(response.content)
search_results = tree.xpath("//div[@class='BNeawe s3v9rd AP7Wnd']")
for index, search_result in enumerate(search_results):
headings = search_result.xpath("./text()")
for idx, heading in enumerate(headings):
if "\nEmail: " == heading:
r = re.compile(".*@.*")
text = tree.xpath("//div[@class='BNeawe s3v9rd AP7Wnd']['+index+']/span['+idx+']/text()")
return list(filter(r.match, text))[0]
return None
def save_email(email):
with open("output.csv", 'a+') as f:
csv_columns = ["Company name", "Email"]
writer = csv.writer(f)
if os.stat("output.csv").st_size == 0:
writer.writerow(csv_columns)
writer.writerow([company_name, email])
company_name = "manzoor exports"
input_string = company_name.replace(' ', '+')
response = google_search(input_string)
if response.status_code == 200:
email = get_email(response)
save_email(email)
还有两件事要做:
- 您必须设置一个函数来加载您的 Excel 数据集。我的建议是以 CSV 格式保存您的 Excel 文件并通过
csv
模块加载它。
- Google 肯定会阻止您一次发送许多查询。这就是为什么最好使用
time
模块来限制您的请求。
我有一个 excel 文件,其中包含公司名称和公司地址(大约 7 万家公司)。我想在 python 中使用网络抓取工具提取该公司的电子邮件 ID。例如,如果我们在 google 中搜索 APPLE 公司,我们可以找到该公司的电子邮件 ID,这样我就可以找到文件中列出的公司的电子邮件 ID。 那么是否有可用的库或是否有任何库可以提取电子邮件 ID?
例如,如果我搜索 google manzoor export 这是结果
您可以在搜索页面中看到电子邮件 ID,我想使用 python 提取它。
这里有一些从头开始构建网络抓取工具的快速指南,以您的为例:
- 构建请求
Postman 是一个有用的工具,用于测试您对预期目标的请求并验证它是否按预期工作。在我看来,它提供了比 Web 浏览器的网络选项卡更好的环境。
在这种情况下,我将 manzoor export 的搜索结果 URL 复制粘贴到 Postman 中,删除了不必要的参数并发出了 GET 请求。确认它有效后,我在 Requests 语法中构建了请求:
session = Session()
session.head('https://www.google.com/')
def google_search(input_string):
response = session.get(
url = 'https://www.google.com/search',
params = {
"q": input_string
}
)
return response
- 解析请求输出
Beautiful Soup 是一个流行的 Python 库,它使解析变得非常容易 HTML(实际上我已经在我的第一个抓取工具中使用了它)。我在这里避免使用它的原因是,如今,我更喜欢一种更高效的基本替代方案:lxml。一旦你熟悉了它的语法,你就会体会到它的强大。
另一个有用的工具是像 this one 这样的 HTML 格式化程序,它可以帮助您更快地找到感兴趣的属性。
def get_email(response):
tree = html.fromstring(response.content)
search_results = tree.xpath("//div[@class='BNeawe s3v9rd AP7Wnd']")
for index, search_result in enumerate(search_results):
headings = search_result.xpath("./text()")
for idx, heading in enumerate(headings):
if "\nEmail: " == heading:
r = re.compile(".*@.*")
text = tree.xpath("//div[@class='BNeawe s3v9rd AP7Wnd']['+index+']/span['+idx+']/text()")
return list(filter(r.match, text))[0]
return None
P.S。如果你比我投入更多的时间,你可以大大改进这个功能。
- 最后润色
下面是完整的代码。我添加了几行,以 Google 可以处理它们的方式格式化搜索查询字符串,以及一个将电子邮件地址保存在 .csv 文件中的函数。
from requests import Session
from lxml import html
import re
import csv
import os
session = Session()
session.head('https://www.google.com/')
def google_search(input_string):
response = session.get(
url = 'https://www.google.com/search',
params = {
"q": input_string
}
)
return response
def get_email(response):
tree = html.fromstring(response.content)
search_results = tree.xpath("//div[@class='BNeawe s3v9rd AP7Wnd']")
for index, search_result in enumerate(search_results):
headings = search_result.xpath("./text()")
for idx, heading in enumerate(headings):
if "\nEmail: " == heading:
r = re.compile(".*@.*")
text = tree.xpath("//div[@class='BNeawe s3v9rd AP7Wnd']['+index+']/span['+idx+']/text()")
return list(filter(r.match, text))[0]
return None
def save_email(email):
with open("output.csv", 'a+') as f:
csv_columns = ["Company name", "Email"]
writer = csv.writer(f)
if os.stat("output.csv").st_size == 0:
writer.writerow(csv_columns)
writer.writerow([company_name, email])
company_name = "manzoor exports"
input_string = company_name.replace(' ', '+')
response = google_search(input_string)
if response.status_code == 200:
email = get_email(response)
save_email(email)
还有两件事要做:
- 您必须设置一个函数来加载您的 Excel 数据集。我的建议是以 CSV 格式保存您的 Excel 文件并通过
csv
模块加载它。 - Google 肯定会阻止您一次发送许多查询。这就是为什么最好使用
time
模块来限制您的请求。