我想创建一个通用的网站爬虫使用PHP。
通过使用我的web应用程序,用户将输入任何URL,提供从给定站点获取所需内容的输入,并单击“开始”按钮。
然后我的web应用程序将开始从源网站获取数据。
我在iframe中加载页面,并使用jQuery从用户获得特定区域的类和标记名称。
但当我加载外部网站,如易趣或亚马逊等,它不工作,因为这些网站是受限制的。有没有办法解决这个问题,这样我就可以在iFrame中加载任何站点了吗?或者,除了我想要达到的目标之外,还有其他选择吗?
我实际上是受到mozenda的启发,这是一个在.NET,http://www.mozenda.com/video01-overview/中开发的软件。
他们在浏览器控件中加载站点,这几乎是一回事。
发布于 2014-01-02 05:50:22
您可以在下面的脚本中的第二个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);
?>发布于 2014-01-02 05:35:20
看看如何在PHP中使用目录函数。
在检索给定站点的HTML时,您可能会获得更好的成功,如下所示:
$html = file_get_contents('http://www.ebay.com');https://stackoverflow.com/questions/20876901
复制相似问题