我一直在制作一个PHP抓取工具,需要从网站获取所有链接并触发这些链接(而不是手动点击它或做客户端JS)。
我读过这些:
等等,我决定关注1。
到目前为止,它一直在运作,但我对使用file_get_contents
对dom->loadHTMLFile
的方法的不同感到困惑。你能不能用这些以及它可能造成的影响,利弊,或简单与情景来启发我。
答案 0 :(得分:1)
有效地,这些方法也是这样做的。但是,使用file_get_contents()
,您需要将结果(至少是暂时的)存储在字符串变量中,除非您将结果传递给DOMDocument::loadHTML()
。这会导致应用程序中的内存使用量增加。
某些网站可能要求您设置一些特殊标头值,或使用除GET
之外的其他HTTP方法。如果需要,您需要指定一个所谓的流上下文。您可以使用stream_context_create()
:
实施例:
$opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"Accept-language: en\r\n" .
"Cookie: foo=bar\r\n"
)
);
$ctx = stream_context_create($opts);
您可以使用上述两种方式设置此上下文,但它们在如何实现此目的方面有所不同:
// With file_get_contents ...
$file_get_contents($url, false, $ctx);
// With DOM
libxml_set_streams_context($ctx);
$doc = new DOMDocument();
$doc->loadHTMLFile($url);
请注意,使用curl
扩展名可以更好地控制HTTP传输,在某些特殊情况下可能需要这样做。