首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PHP的通用网站爬虫

使用PHP的通用网站爬虫
EN

Stack Overflow用户
提问于 2014-01-02 05:30:47
回答 2查看 2K关注 0票数 0

我想创建一个通用的网站爬虫使用PHP。

通过使用我的web应用程序,用户将输入任何URL,提供从给定站点获取所需内容的输入,并单击“开始”按钮。

然后我的web应用程序将开始从源网站获取数据。

我在iframe中加载页面,并使用jQuery从用户获得特定区域的类和标记名称。

但当我加载外部网站,如易趣或亚马逊等,它不工作,因为这些网站是受限制的。有没有办法解决这个问题,这样我就可以在iFrame中加载任何站点了吗?或者,除了我想要达到的目标之外,还有其他选择吗?

我实际上是受到mozenda的启发,这是一个在.NET,http://www.mozenda.com/video01-overview/中开发的软件。

他们在浏览器控件中加载站点,这几乎是一回事。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-02 05:50:22

您可以在下面的脚本中的第二个foreach循环中加入您要寻找的元素。脚本将收集cnn首页上的前100个链接,并将它们放在一个名为"cnnLinks.txt“的文本文件中,该文件位于该文件所在的文件夹中。

只需将$pre、$base和$post变量更改为您希望爬行的任何url即可!我把它们分开,这样就能更快地通过普通的网站进行改变。

代码语言:javascript
复制
<?php
    set_time_limit(0);
    $pre = "http://www.";
    $base = "cnn";
    $post = ".com";
    $domain = $pre.$base.$post;
    $content = "google-analytics.com/ga.js";
    $content_tag = "script";
    $output_file = "cnnLinks.txt";
    $max_urls_to_check = 100;
    $rounds = 0;
    $domain_stack = array();
    $max_size_domain_stack = 1000;
    $checked_domains = array();
    while ($domain != "" && $rounds < $max_urls_to_check) {
        $doc = new DOMDocument();
        @$doc->loadHTMLFile($domain);
        $found = false;
        foreach($doc->getElementsByTagName($content_tag) as $tag) {
            if (strpos($tag->nodeValue, $content)) {
                $found = true;
                break;
            }
        }
        $checked_domains[$domain] = $found;
        foreach($doc->getElementsByTagName('a') as $link) {
            $href = $link->getAttribute('href');
            if (strpos($href, 'http://') !== false && strpos($href, $domain) === false) {
                $href_array = explode("/", $href);
                if (count($domain_stack) < $max_size_domain_stack &&
                    $checked_domains["http://".$href_array[2]] === null) {
                    array_push($domain_stack, "http://".$href_array[2]);
                }
            };
        }
        $domain_stack = array_unique($domain_stack);
        $domain = $domain_stack[0];
        unset($domain_stack[0]);
        $domain_stack = array_values($domain_stack);
        $rounds++;
    }

    $found_domains = "";
    foreach ($checked_domains as $key => $value) {
        if ($value) {
            $found_domains .= $key."\n";
        }
    }
    file_put_contents($output_file, $found_domains);
?>
票数 1
EN

Stack Overflow用户

发布于 2014-01-02 05:35:20

看看如何在PHP中使用目录函数。

在检索给定站点的HTML时,您可能会获得更好的成功,如下所示:

代码语言:javascript
复制
$html = file_get_contents('http://www.ebay.com');
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20876901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档