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

6

给定一个网站,我想知道从该链接和所有下属网站中以纯文本形式出现的形式为XXXX@YYYYY.ZZZZ的所有电子邮件地址的最佳程序化和/或使用脚本的提取方法,递归地或直到某个固定深度。


希望这可以帮到你;http://superuser.com/questions/518736/send-emails-in-a-non-interactive-way-in-os-x - Open the way
1
如果这是您(或您的客户)的网站,您应该有比爬取网页更简单的方法来获取地址。即使数据已经丢失,您也可以像其他帖子中所示那样搜索页面的本地副本。但是,如果这不是您的网站,提取电子邮件似乎非常不道德,对您的业力肯定会产生极其不良的影响。您已经被警告了。 - mivk
4个回答

20

使用Shell编程,您可以使用两个程序通过管道一起实现目标:

  • 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)从somesite.com.br递归获取所有页面(-r),最大深度为5级(-l 5),并将所有内容打印到标准输出流(-O -)。

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

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

阅读wgetgrep的手册以获取更多文档。

此示例已在GNU bash版本4.2.37(1)-release、GNU grep 2.12和GNU Wget 1.13.4上进行了测试。


1
很好的回答 +1,但是为了明确起见,这里提供的正则表达式并不能捕获所有的电子邮件。 - dacwe
@dacwe,您能详细说明一下正则表达式漏掉了哪些电子邮件吗? - Hashim Aziz

10

首先使用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 -)可以将下载的内容打印到标准输出而不是保存到磁盘,但不幸的是,在递归(-r)模式下不起作用。


我尝试使用一个包含3个电子邮件地址的小文件进行测试,但它没有起作用。 - Open the way
你在哪里可以获取有关搜索模式中每个元素含义的信息? - Open the way
请将您文件的内容添加到问题中,以便我们查看为什么它无法工作。 - dogbane
是的,该文件只包含一行;“john@gmail.comblue@hotmail.com - Open the way
@flow: 要查看每个事物的信息,请阅读有关正则表达式搜索的内容(请参见链接)。另一个地方是查看手册页:man grep - jvriesem

0

第一点). 开发人员使用HTML实体格式(rish)HTML Entity添加电子邮件ID:

第二点). 电子邮件写在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. :(";
    }

    ?>

0

我会使用wget递归获取页面,然后使用正则表达式定位地址(我会使用Python脚本进行操作,但几乎任何环境都可以提供相同的功能)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接