首页 > 解决方案 > 如何从公司名称中提取电子邮件 ID

问题描述

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

例如,如果我搜索 google manzoor export here 就是结果 在此处输入图像描述

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

标签: pythonweb-scrapingdata-mininginformation-extraction

解决方案


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

  1. 构建请求

Postman是一个有用的工具,用于测试您对预期目标的请求并验证它是否按预期工作。在我看来,它提供了比 Web 浏览器的网络选项卡更好的环境。

在这种情况下,我将manzoor 导出的搜索结果 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。一旦你熟悉了它的语法,你就会体会到它的强大。

另一个有用的工具是像这样的 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 

PS 如果您投入的时间比我多,您可以大幅改进此功能。

  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 格式并通过模块加载。
  • 谷歌肯定会阻止您一次发送许多查询。这就是为什么最好使用该time模块来限制您的请求。

推荐阅读