curl 抓取网页(PHPCURL与file_get_contents函数应用例子分析方法)
优采云 发布时间: 2021-11-19 12:07curl 抓取网页(PHPCURL与file_get_contents函数应用例子分析方法)
PHP CURL 和 file_get_contents 函数都可以获取远程服务器上的文件并保存在本地,但在性能上却不是一个级别。这里通过一个例子给大家介绍PHP CURL或者file_get_contents获取页面标题的代码和效率两者的稳定性问题,需要的朋友可以参考
PHP CURL 和 file_get_contents 函数都可以检索远程服务器上的文件并将其保存在本地,但它们在性能方面并不处于同一水平。我先介绍PHP CURL 或file_get_contents 函数应用实例,然后给大家简单介绍一下它们之间的一些小区别。
推荐的获取CURL的方法
使用 file_get_contents
看一下 file_get_contents 性能
1)fopen/file_get_contents 每次请求远程URL中的数据时,都会重新进行DNS查询,不会缓存DNS信息。但是 CURL 会自动缓存 DNS 信息。请求同域名下的网页或图片,只需要进行一次DNS查询。这大大减少了 DNS 查询的数量。所以CURL的性能要比fopen/file_get_contents好很多。
2)fopen/file_get_contents 请求 HTTP 时使用 http_fopen_wrapper,不会保持存活。但是卷曲可以。这样,当多次请求多个链接时,curl 的效率会更高。(应该可以设置标题)
3)fopen/file_get_contents 函数会受到php.ini 文件中allow_url_open 选项配置的影响。如果配置关闭,则该功能无效。并且 curl 不受此配置的影响。
4)curl 可以模拟多种请求,如:POST 数据、表单提交等,用户可以根据自己的需求自定义请求。而 fopen/file_get_contents 只能使用 get 来获取数据。
5)fopen/file_get_contents 无法正确下载二进制文件
6)fopen/file_get_contents 无法正确处理 ssl 请求
7)curl 可以利用多线程
8) 使用file_get_contents时,如果网络有问题,这里很容易积累一些进程
9)如果要进行连续连接,请多次请求多个页面。那么 file_get_contents 就会出错。获取的内容也可能是错误的。所以在做类似采集的事情的时候,肯定有问题。使用curl进行采集爬取,如果你还不相信,我们再做一个测试。
curl和file_get_contents PHP源码性能对比如下:
第182话
测试访问
file_get_contents 速度:4.2404510975 秒
卷曲速度:2.8205530643 秒
curl 比 file_get_contents 快约 30%,最重要的是,服务器负载更低。
ps:php函数file_get_contents和curl的效率和稳定性问题
我习惯使用方便快捷的file_get_contents函数来抓取其他家网站的内容,但总是遇到获取失败的问题。虽然按照手册中的例子设置了超时时间,但大多数时候并不好用:
$config['context'] = stream_context_create(array('http' => array('method' => "GET",'timeout' => 5)));
'timeout' => 5//这个超时时间不稳定,经常难以使用。这时候如果查看服务器的连接池,会发现一堆类似下面的错误,让你头疼:
file_get_contents(***): 无法打开流...
作为最后的手段,我安装了 curl 库并编写了一个函数替换:
function curl_get_contents($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); //设置访问的url地址 //curl_setopt($ch,CURLOPT_HEADER,1); //是否显示头部信息 curl_setopt($ch, CURLOPT_TIMEOUT, 5); //设置超时 curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_); //用户访问代理 User-Agent curl_setopt($ch, CURLOPT_REFERER,_REFERER_); //设置 referer curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1); //跟踪301 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回结果 $r = curl_exec($ch); curl_close($ch); return $r; }
这样,除了真正的网络问题外,没有其他问题了。
这是别人做过的 curl 和 file_get_contents 的测试:
File_get_contents 需要几秒钟才能获取:
2.31319094
2.30374217
2.21512604
3.30553889
2.30124092
curl 使用的时间:
0.68719101
0.64675593
0.64326
0.81983113
0.63956594
是不是差距很大?哈哈,根据我的经验,这两个工具不仅速度不同,稳定性也不同。推荐对网络数据抓取稳定性要求高的朋友使用上面的curl_file_get_contents函数,不仅稳定快速,还能假冒浏览器欺骗目标地址!
以上是PHP CURL或者file_get_contents获取页面标题和详细内容的代码,两者的效率稳定性。更多详情请关注其他相关html中文网站文章!