我正在做一些与网页抓取工具相关的项目。一个重要的事情是提取发送给每个用户的HTML页面(运行PHP之后)中的URL。由于网页可以是动态的,因此每个用户可以接收不同的HTML页面。我只是想知道是否有一种简单的方法可以在实际发送之前在服务器端提取这些页面(实际上是这些URL)。我在技术上知道作为服务器,我应该能够准确地知道我要发送给用户的页面。我只是不知道该怎么做。有任何想法吗?我在Apache Server上运行PHP + MySQL。谢谢!
更具体地说,我只想保留发送给用户的HTML副本,这样我就可以自己提取HTML页面中的URL进行分析。我希望在飞行中执行此操作,因为发送给用户的HTML是动态的,因此我无法静态存储所有页面。
忘记整个爬虫的故事它实际上与这个问题并不完全相关。
答案 0 :(得分:0)
如果您自己使用PHP生成页面,则可以创建一个函数/方法来生成和捕获链接,例如
class Links {
private static $links = array();
public static function getLinks () {
return self::$links;
}
public static function generateLink ($url, $title) {
// note: you probably want to use htmlspecialchars() for $title
$link = '<a href="' . $url . '">' . $title . '</a>';
self::$links[] = $link;
return $link;
}
}
// now generate some links
...
echo Links::generateLink("http://example.com", "example.com");
echo Links::generateLink("http://domain.com/user-specific-link-goes-here", "whatever");
...
在脚本结束时,您可以通过Links::getLinks()
检索生成的链接并将其存储在某处:
var_dump(Links::getLinks());
如果您无法更改生成链接的代码,则可以选择打开输出缓冲,像往常一样生成HTML代码,并在脚本末尾尝试查找所有链接在输出缓冲区中:
ob_start();
// generate HTML as usual
// ...
// at end of script, capture the generated output and capture links in it
$html = ob_get_clean();
preg_match_all("/<a\s+.*?href=['\"](.*?)['\"].*?>.*?<\/a>/i", $html, $matches);
// captured links are now contained in $matches
var_dump($matches);
// send output buffer to client
echo $html;
请注意,在第二个代码示例中,可能需要调整正则表达式,使其实际匹配代码生成的超链接。另请注意,这是一个强力方法,并且在格式错误的HTML(无效标记嵌套)的情况下不会生成,不考虑HTML注释(例如,它会找到<-- <a href="http://example.com">example.com</a> -->
)等