使用脚本从网站提取电子邮件地址

时间:2012-12-13 10:57:11

标签: bash email web

鉴于一个网站,我想知道什么是最好的程序,以编程方式和/或使用脚本,从该链接和所有网站以XXXX@YYYYY.ZZZZ格式提取纯文本中每个页面上的所有电子邮件地址在下面,递归或直到一些固定的深度。

4 个答案:

答案 0 :(得分:14)

使用shell编程,您可以使用2个管道程序实现目标:

  • wget:将获取所有页面
  • grep:将过滤并仅为您提供电子邮件

一个例子:

wget -q -r -l 5 -O - http://somesite.com/ | grep -E -o "\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b"

wget ,在安静模式下( -q ),以递归方式获取所有页面( -r ),最大深度级别为5(来自somesite.com.br的 -l 5 )并将所有内容打印到stdout( -O - )。

grep 正在使用扩展正则表达式( -E )并仅显示( -o )电子邮件地址。

所有电子邮件都将打印到标准输出,您可以通过将> somefile.txt附加到命令来将它们写入文件。

阅读man页面,了解有关wgetgrep的更多文档。

本例使用GNU bash版本4.2.37(1)-release,GNU grep 2.12和GNU Wget 1.13.4进行测试。

答案 1 :(得分:7)

首先使用wget以递归方式从URL下载页面。 -l选项是回归深度,设置为1以下:

$ mkdir site
$ cd site
$ wget -q -r -l1  http://www.foobar.com

然后运行递归grep以提取电子邮件地址。 (下面的正则表达式并不完美,如果您发现并非所有地址都被接收,可能需要进行调整。)

$ grep -hrio "\b[a-z0-9.-]\+@[a-z0-9.-]\+\.[a-z]\{2,4\}\+\b" *

顺便说一下,wget确实有一个选项(-O -)可以将下载的内容打印到stdout而不是将其保存到磁盘,但遗憾的是,它不能用于递归({{1} })模式。

答案 2 :(得分:0)

我会使用wget递归地获取页面,然后使用正则表达式找到地址(我本来会使用python script,但几乎任何环境都可以提供相同的功能)。

答案 3 :(得分:0)

第1点)。开发人员以HTML实体格式(rish)HTML Entity添加电子邮件ID:

第2点)。电子邮件写在href =" mailto:your@example.com"。 因此,我们可以将此作为常规表达。

<?php
    $str = '<div class="call-to-action ">
    <a title="Email" class="contact contact-main contact-email " 
    href="mailto:info@canberraeyelaser.com.au?subject=Enquiry%2C%20sent%20from%20yellowpages.com.au&amp;
    body=%0A%0A%0A%0A%0A------------------------------------------%0AEnquiry%20via%20yellowpages.com.au%0Ahttp%3A%2F%2Fyellowpages.com.au%2Fact%2Fphillip%2Fcanberra-eye-laser-15333167-listing.html%3Fcontext%3DbusinessTypeSearch" 
    rel="nofollow" data-email="info@canberraeyelaser.com.au">
    <span class="glyph icon-email border border-dark-blue with-text"></span><span class="contact-text">Email</span>
    <a href="mailto:&#114;&#105;&#115;&#104;&#97;&#98;&#104;&#100;&#117;&#98;&#101;&#121;&#50;&#48;&#64;&#103;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;">
    </a>
    </div>';

// $str = file_get_contents(http://example.com) ; (to get emails from URL in place of file_get_contents i use to prefer CURL) .

     $str = html_entity_decode($str);

    $regex = "/mailto:([^?]*)/";
    if ($rex = preg_match_all($regex, $str,$matches_out)) {

        echo "Found a match!";
        echo "<pre>";
        var_dump($matches_out[0]);
    } else {
        echo "The regex pattern does not match. :(";
    }

    ?>