如何从公司名称中提取电子邮件ID

How to extract email-id from company name

我有一个 excel 文件,其中包含公司名称和公司地址(大约 7 万家公司)。我想在 python 中使用网络抓取工具提取该公司的电子邮件 ID。例如,如果我们在 google 中搜索 APPLE 公司,我们可以找到该公司的电子邮件 ID,这样我就可以找到文件中列出的公司的电子邮件 ID。 那么是否有可用的库或是否有任何库可以提取电子邮件 ID?

例如,如果我搜索 google manzoor export 这是结果

您可以在搜索页面中看到电子邮件 ID,我想使用 python 提取它。

这里有一些从头开始构建网络抓取工具的快速指南,以您的为例:

  1. 构建请求

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
  1. 解析请求输出

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。如果你比我投入更多的时间,你可以大大改进这个功能。

  1. 最后润色

下面是完整的代码。我添加了几行,以 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 模块来限制您的请求。