【问题标题】:Universal website crawler using PHP [duplicate]使用 PHP 的通用网站爬虫 [重复]
【发布时间】:2023-04-06 15:02:01
【问题描述】:

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

通过使用我的 Web 应用程序,用户将输入任何 URL,将提供有关他需要从给定站点获取的内容的输入,然后单击“开始”按钮。

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

我在 iframe 中加载页面并使用 jQuery 从用户那里获取特定区域的类和标签名称。

但是当我加载 ebay 或 amazon 等外部网站时,它不起作用,因为这些网站受到限制。有没有办法解决这个问题,所以我可以在 iFrame 中加载任何网站?或者有什么替代我想要实现的目标?

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

他们在浏览器控件中加载网站,这几乎是一样的。

【问题讨论】:

  • @mc10 谢谢。如果该用户继续尝试通过客户端功能抓取该站点,那么这是一个非常相关的链接,但它并没有真正回答他们的核心问题:构建网站爬虫。所以,出于这个原因,我真的不认为它是重复的。

标签: javascript php jquery html iframe


【解决方案1】:

如果目标网站返回 "X-Frame-Options: SAMEORIGIN" 响应标头,则您无法在客户端抓取网站(请参阅问题 cmets 中的 @mc10 重复链接)。您必须使用服务器端功能抓取目标站点。

如果wget 具有您需要的所有选项,则以下解决方案可能适用。 wget -r 将递归地爬取站点并下载文档。它有许多有用的选项,例如将绝对嵌入的 url 翻译成相对的、本地的。

注意:wget 必须安装在您的系统中才能正常工作。我不知道你在哪个操作系统上运行它,但是在 Ubuntu 上,安装 wget 是 sudo apt-get install wget

请参阅:wget --help 了解其他选项。

<?php

    $website_url = $_GET['user_input_url'];

    //doesn't work for ipv6 addresses
    //http://php.net/manual/en/function.filter-var.php
    if( filter_var($website_url, FILTER_VALIDATE_URL) !== false ){

        $command = "wget -r " + escapeshellarg( $website_url );
        system( $command );

        //iterate through downloaded files and folders

    }else{
        //handle invalid url        

    }

【讨论】:

    【解决方案2】:

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

    只需将 $pre、$base 和 $post 变量更改为您要抓取的任何 url!我这样分开它们是为了更快地通过常见的网站进行更改。

    <?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);
    ?>
    

    【讨论】:

    • 我只是在抓取之前想要更多的东西..从用户示例中获取信息:用户输入站点 url 并且站点将加载到 iframe 用户选择价格和产品标题等空间区域,因此我将获得课程该spacified选择的名称和标签名称并将它们保存在一个文件中并使用该信息来爬取整个站点....
    • 我只是在抓取之前想要更多的东西..从用户示例中获取信息:用户输入站点 url 并且站点将加载到 iframe 用户选择价格和产品标题等空间区域,因此我将获得课程该spacified选择的名称和标签名称并将它们保存在一个文件中并使用该信息来爬取整个站点....
    【解决方案3】:

    看看在 PHP 中使用file_get_contents 函数。

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

    $html = file_get_contents('http://www.ebay.com');
    

    【讨论】:

      猜你喜欢
      • 2011-08-03
      • 2012-09-24
      • 1970-01-01
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      • 2014-06-21
      • 1970-01-01
      • 2011-06-07
      相关资源
      最近更新 更多