📜  用于根据关键字和区域提取电子邮件的 Web 抓取工具

📅  最后修改于: 2022-05-13 01:55:09.134000             🧑  作者: Mango

用于根据关键字和区域提取电子邮件的 Web 抓取工具

网络抓取是一项通常执行的任务,从网站上抓取结构化数据,然后相应地存储,这种数据的价值足以为从数据挖掘相关的东西到数据挖掘相关的各种领域打开大门。 数据科学相关的应用程序,需要大量数据来做出业务决策。

至于本文,我们将讨论如何使用网络抓取工具根据关键字和位置提取电子邮件。

那么问题来了,为什么我们需要这样的东西?好吧,基于特定主题和地区提取的电子邮件可以是一种非常有效的广告和产品推广方式,尽管有人会说这可以用于黑帽 SEO,但实际上取决于您如何使用它。

要求:

  • Scrapy 模块:它用作 Web 抓取的Python框架。从普通网站获取数据更容易,只需提取网站的 HTML 并通过过滤标签获取数据即可实现。可以使用以下命令安装它。
pip install scrapy
  • Selenium模块:它是通过程序控制 Web 浏览器的强大工具。它适用于所有浏览器,适用于所有主要操作系统,其脚本是用各种语言编写的,例如Python、 Java、C# 等。它可以使用以下命令安装。
pip install selenium
  • Scrapy-Selenium 模块:它是一个使用selenium处理 JavaScript 页面的scrapy中间件。可以使用以下命令安装它。
pip install scrapy-selenium
  • Google 模块:使用Python包google我们可以从Python脚本中获取 google 搜索的结果。可以使用以下命令安装它。
pip install google

循序渐进的方法:

步骤1:使用以下命令创建scrapy项目:

scrapy startproject email_extraction

执行上述命令后,您将看到一个带有树的文件夹,如下所示

├── email_extraction
│   ├── __init__.py
│   ├── items.py
│   ├── middlewares.py
│   ├── pipelines.py
│   ├── __pycache__
│   ├── settings.py
│   └── spiders
│       ├── email_extractor.py
│       ├── __init__.py
│       └── __pycache__
└── scrapy.cfg

4 directories, 8 files

spiders目录中创建一个Python文件并在任何编辑器中打开它。

第 2 步:导入所需的库 

Python3
# import required modules
import scrapy
from scrapy.spiders import CrawlSpider, Request
from googlesearch import search
import re
from scrapy_selenium import SeleniumRequest
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC


Python3
# create class to extract email ids
class email_extractor(CrawlSpider):
     
    # adjusting parameters
    name = 'email_ex'
 
    def __init__(self, *args, **kwargs):
        super(email_extractor, self).__init__(*args, **kwargs)
        self.email_list = []
        self.query = " 'market places'.gmail.com "


Python3
# sending requests
    def start_requests(self):
        for results in search(self.query, num=10, stop=None, pause=2):
            yield SeleniumRequest(
                url=results,
                callback=self.parse,
                wait_until=EC.presence_of_element_located(
                    (By.TAG_NAME, "html")),
                dont_filter=True
            )


Python3
# extracting emails
def parse(self, response):
    EMAIL_REGEX = r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+'
    emails = re.finditer(EMAIL_REGEX, str(response.text))
    for email in emails:
        self.email_list.append(email.group())
 
    for email in set(self.email_list):
        yield{
            "emails": email
        }
 
    self.email_list.clear()


Python3
# import required modules
import scrapy
from scrapy.spiders import CrawlSpider, Request
from googlesearch import search
import re
from scrapy_selenium import SeleniumRequest
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
 
 
# create class to extract email ids
class email_extractor(CrawlSpider):
     
    # adjusting parameters
    name = 'email_ex'
 
    def __init__(self, *args, **kwargs):
        super(email_extractor, self).__init__(*args, **kwargs)
        self.email_list = []
        self.query = " 'market places'.gmail.com "
 
    # sending requests
    def start_requests(self):
        for results in search(self.query, num=10, stop=None, pause=2):
            yield SeleniumRequest(
                url=results,
                callback=self.parse,
                wait_until=EC.presence_of_element_located(
                    (By.TAG_NAME, "html")),
                dont_filter=True
            )
 
    # extracting emails
    def parse(self, response):
        EMAIL_REGEX = r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+'
        emails = re.finditer(EMAIL_REGEX, str(response.text))
        for email in emails:
            self.email_list.append(email.group())
 
        for email in set(self.email_list):
            yield{
                "emails": email
            }
 
        self.email_list.clear()



现在所需的库已经导入,我们可以进入脚本的下一步。

第三步:设置爬虫所需的参数

蟒蛇3

# create class to extract email ids
class email_extractor(CrawlSpider):
     
    # adjusting parameters
    name = 'email_ex'
 
    def __init__(self, *args, **kwargs):
        super(email_extractor, self).__init__(*args, **kwargs)
        self.email_list = []
        self.query = " 'market places'.gmail.com "


在此我们创建类email_extractor并从scrapy模块继承CrawlSpider类,在下一行我们为我们的爬虫提供一个唯一的名称,我们稍后将使用它来运行我们的蜘蛛,我们不需要将允许的域参数设置为我们将从一个网站域跳转到另一个网站域以提取电子邮件,然后我们创建一个Python构造函数并声明一个列表和一个字符串变量,这里给出的字符串值将被提供给谷歌搜索引擎,这是我们的实际查询定义关键字(健康)、位置(美国)和.gmail.com以获取面向电子邮件的搜索结果。

第 4 步:获取结果并发送请求

蟒蛇3

# sending requests
    def start_requests(self):
        for results in search(self.query, num=10, stop=None, pause=2):
            yield SeleniumRequest(
                url=results,
                callback=self.parse,
                wait_until=EC.presence_of_element_located(
                    (By.TAG_NAME, "html")),
                dont_filter=True
            )


在这里,我们正在创建我们的方法start_requests然后我们使用来自googlesearch模块的search()方法和参数

  • 查询变量,它具有我们之前声明的实际搜索查询。
  • 每暂停 2 秒后有 10 个结果。
  • 我们正在获取所有存在的查询结果,并将stop参数设置为None。

之后,我们使用来自scrapy_selenium模块的方法SeleniumRequest产生一个请求,其参数为:

  • 从搜索结果中顺序获取第一个 URL。
  • 为每个 URL 回调一个方法以进行进一步处理,我们将在一分钟内看到。
  • 使用wait_until参数检查网页上是否出现了名为html的标签,它会一直检查直到出现在网页上。
  • 设置为Truedon't_filter将允许重新访问具有相同域名的网站。

第 5 步:从每个网站的主页中提取电子邮件

蟒蛇3

# extracting emails
def parse(self, response):
    EMAIL_REGEX = r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+'
    emails = re.finditer(EMAIL_REGEX, str(response.text))
    for email in emails:
        self.email_list.append(email.group())
 
    for email in set(self.email_list):
        yield{
            "emails": email
        }
 
    self.email_list.clear()


在这一步中,我们将创建一个名为parse()的方法 使用用于从start_request方法获取请求对象的参数response ,在下一行中,我们将创建正则表达式系统以解析响应 HTML 中的电子邮件,然后我们将电子邮件附加到我们在构造函数中声明的email_list列表变量中方法,然后我们迭代集合并产生一个字典,其中电子邮件是键或列标题,电子邮件是迭代器或相对电子邮件值,最后我们清除列表,以便没有重复值写入文件当我们启动爬虫时。

以下是基于上述方法的完整程序:

蟒蛇3

# import required modules
import scrapy
from scrapy.spiders import CrawlSpider, Request
from googlesearch import search
import re
from scrapy_selenium import SeleniumRequest
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
 
 
# create class to extract email ids
class email_extractor(CrawlSpider):
     
    # adjusting parameters
    name = 'email_ex'
 
    def __init__(self, *args, **kwargs):
        super(email_extractor, self).__init__(*args, **kwargs)
        self.email_list = []
        self.query = " 'market places'.gmail.com "
 
    # sending requests
    def start_requests(self):
        for results in search(self.query, num=10, stop=None, pause=2):
            yield SeleniumRequest(
                url=results,
                callback=self.parse,
                wait_until=EC.presence_of_element_located(
                    (By.TAG_NAME, "html")),
                dont_filter=True
            )
 
    # extracting emails
    def parse(self, response):
        EMAIL_REGEX = r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+'
        emails = re.finditer(EMAIL_REGEX, str(response.text))
        for email in emails:
            self.email_list.append(email.group())
 
        for email in set(self.email_list):
            yield{
                "emails": email
            }
 
        self.email_list.clear()

现在是运行代码的时候了,打开终端并进入scrapy.cfg文件所在项目的根目录并运行以下命令:

scrapy crawl email_ex -o emails.csv

Scraper 将开始抓取所有电子邮件并将其存储到自动创建的文件emails.csv中。

结果是:

提取的电子邮件存储在一个 csv 文件中