admin 发表于 2018-11-28 17:37:36

php中使用Curl、socket、file_get_contents三种方法POST提交数据

抓取远程内容,之前一直都在用file_get_content函数,其实早就知道有curl这么一个好东西的存在,但是看了一眼后感觉使用颇有些复杂,没有file_get_content那么简单,再就是需求也不大,所以没有学习使用curl。
直到最近,要做一个网页小偷程序的时候才发现file_get_content已经完全不能满足需求了。我觉得,在读取远程内容的时候,file_get_content除了使用比curl便捷以外,其他都没有curl好。

php中curl和file_get_content的一些比较

主要区别:

学习才发现,curl支持很多协议,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAP,也就是说,它能做到很多file_get_content做不到的事情。curl在php可以实现远程获取和采集内容;实现PHP网页版的FTP上传下载;实现模拟登陆;实现接口对接(API),数据传输;实现模拟Cookie;下载文件断点续传等等,功能十分强大。

了解curl一些基本的使用后,才发现其实并不难,只不过记住里面一些设置参数,难弄一点,但是我们记住几个常用的就可以了。

开启curl:

因为PHP默认是不支持curl功能的,因此如果要用curl的话,首先需要在php.ini中开启该功能,即去掉 ;extension= php_curl.dll 前面的分号,然后保存后重启apache/iis就好了。

基本语法:
代码如下:
<p>$my_curl = curl_init();    //初始化一个curl对象</p><p>curl_setopt($my_curl, CURLOPT_URL, "http://www.51digit.com");    //设置你需要抓取的URL</p><p>curl_setopt($my_curl,CURLOPT_RETURNTRANSFER,1);    //设置是将结果保存到字符串中还是输出到屏幕上,1表示将结果保存到字符串</p><p>$str = curl_exec($curl);    //执行请求</p><p>echo $str;    //输出抓取的结果</p><p>curl_close($curl);    //关闭url请求</p>最近需要获取别人网站上的音乐数据。用了file_get_contents函数,但是总是会遇到获取失败的问题,尽管按照手册中的例子设置了超时,可多数时候不会奏效:

<p>$config['context'] = stream_context_create(array('http' => array('method' => "GET",</p><p>'timeout' => 5//这个超时时间不稳定,经常不奏效</p><p>)</p><p>));</p>
这时候,看一下服务器的连接池,会发现一堆类似的错误,让我头疼万分:
file_get_contents(http://***): failed to open stream…

现在改用了curl库,写了一个函数替换:
<p>function curl_file_get_contents($durl){</p><p>$ch = curl_init();</p><p>curl_setopt($ch, CURLOPT_URL, $durl);</p><p>curl_setopt($ch, CURLOPT_TIMEOUT, 5);</p><p>curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);</p><p>curl_setopt($ch, CURLOPT_REFERER,_REFERER_);</p><p>curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);</p><p>$r = curl_exec($ch);</p><p>curl_close($ch);</p><p>return $r;</p><p>}</p>如此,除了真正的网络问题外,没再出现任何问题。
这是别人做过的关于curl和file_get_contents的测试:
file_get_contents抓取google.com需用秒数:
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函数,不但稳定速度快,还能假冒浏览器欺骗目标地址哦!

方法1: 用file_get_contents 以get方式获取内容
代码如下:
<p><?php</p><p>$url='http://www.domain.com/';</p><p>$html = file_get_contents($url);</p><p>echo $html;</p><p>?></p>
方法2: 用fopen打开url, 以get方式获取内容
代码如下:
<p><?php</p><p>$fp = fopen($url, 'r');</p><p>stream_get_meta_data($fp);</p><p>while(!feof($fp)) {</p><p>$result .= fgets($fp, 1024);</p><p>}</p><p>echo "url body: $result";</p><p>fclose($fp);</p><p>?></p><p></p>
方法3:用file_get_contents函数,以post方式获取url

代码如下:
<p><?php</p><p>$data = array ('foo' => 'bar');</p><p>$data = http_build_query($data);</p><p>$opts = array (</p><p>'http' => array (</p><p>'method' => 'POST',</p><p>'header'=> "Content-type: application/x-www-form-urlencodedrn" .</p><p>"Content-Length: " . strlen($data) . "rn",</p><p>'content' => $data</p><p>)</p><p>);</p><p>$context = stream_context_create($opts);</p><p>$html = file_get_contents('http://localhost/e/admin/test.html', false, $context);</p><p>echo $html;</p><p>?></p>好了就这么多。

页: [1]
查看完整版本: php中使用Curl、socket、file_get_contents三种方法POST提交数据