`

PHP 利用Curl实现多线程抓取网页和下载文件

阅读更多

PHP 利用 Curl 可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,然而因为php语言本身不支持多线程,所以开发爬虫程序效率并不高,一般采集数据可以利用 PHPquery类来采集数据库,在此之外也可以用 Curl ,借助Curl 这个功能实现并发多线程的访问多个url地址以实现并发多线程抓取网页或者下载文件。

 

1、实现抓取多个URL并将内容写入指定的文件

<?php 
$urls = array(
	'http://test.onestopweb.cn/demo1.php',
	'http://test.onestopweb.cn/demo2.php',
	'http://test.onestopweb.cn/demo3.php'
); // 设置要抓取的页面URL
$save_to='test1.txt'; // 把抓取的代码写入该文件
$st = fopen($save_to,"a");
$mh = curl_multi_init();
foreach ($urls as $i => $url) {
	$conn[$i] = curl_init($url);
	curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");
	curl_setopt($conn[$i], CURLOPT_HEADER ,0);
	curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);
	curl_setopt($conn[$i], CURLOPT_FILE,$st); // 将爬取的代码写入文件
	curl_multi_add_handle ($mh,$conn[$i]);
} // 初始化
do {
	curl_multi_exec($mh,$active);
} while ($active); // 执行
foreach ($urls as $i => $url) {
	curl_multi_remove_handle($mh,$conn[$i]);
	curl_close($conn[$i]);
} // 结束清理
curl_multi_close($mh);
fclose($st);
?>

效果图:

 

2、利用 PHP 的 Curl 实现抓取网页URL并保存内容
下面这段代码和上面差不多意思,只不过这个地方是将获得的代码先放入变量,然后再将获取到的内容写入指定的文件

<?php
$urls = array(
	'http://test.onestopweb.cn/demo1.php',
	'http://test.onestopweb.cn/demo2.php',
	'http://test.onestopweb.cn/demo3.php'
);
$save_to='test2.txt'; // 把抓取的代码写入该文件
$st = fopen($save_to,"a");
$mh = curl_multi_init();
foreach ($urls as $i => $url) {
	$conn[$i] = curl_init($url);
	curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");
	curl_setopt($conn[$i], CURLOPT_HEADER ,0);
	curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);
	curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,true); // 不将爬取代码写到浏览器,而是转化为字符串
	curl_multi_add_handle ($mh,$conn[$i]);
}
do {
	curl_multi_exec($mh,$active);
} while ($active);
foreach ($urls as $i => $url) {
	$data = curl_multi_getcontent($conn[$i]); // 获得爬取的代码字符串
	fwrite($st,$data); // 将字符串写入文件
} // 获得数据变量,并写入文件
foreach ($urls as $i => $url) {
	curl_multi_remove_handle($mh,$conn[$i]);
	curl_close($conn[$i]);
}
curl_multi_close($mh);
fclose($st);
?>

 效果图:

 

3、利用 PHP 的 Curl 实现并发多线程下载文件

<?php
$urls=array(
	'http://test.onestopweb.cn/data.zip',
	'http://test.onestopweb.cn/data2.zip',
	'http://test.onestopweb.cn/data3.zip'
);
$save_to='zip/';
$mh=curl_multi_init();
foreach($urls as $i=>$url){
	$g=$save_to.basename($url);
	if(!is_file($g)){
		$conn[$i]=curl_init($url);
		$fp[$i]=fopen($g,"w");
		curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");
		curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);
		curl_setopt($conn[$i],CURLOPT_HEADER ,0);
		curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);
		curl_multi_add_handle($mh,$conn[$i]);
	}
}
do{
	$n=curl_multi_exec($mh,$active);
}while($active);
foreach($urls as $i=>$url){
	curl_multi_remove_handle($mh,$conn[$i]);
	curl_close($conn[$i]);
	fclose($fp[$i]);
}
curl_multi_close($mh);
?>

 效果图:

 

 

 

 

 

 

  • 大小: 18.9 KB
  • 大小: 18.8 KB
  • 大小: 12.7 KB
2
1
分享到:
评论

相关推荐

    php结合curl实现多线程抓取

    php结合curl实现多线程抓取 &lt;?php /* curl 多线程抓取 */ /** * curl 多线程 * * @param array $array 并行网址 * @param int $timeout 超时时间 * @return array */ function Curl_http($array,$time...

    PHP使用CURL实现多线程抓取网页

    PHP 利用 Curl 可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,然而因为php语言本身不支持多线程,所以开发爬虫程序效率并不高,不过可以用 Curl ,借助Curl 这个功能实现并发多线程的访问多个url...

    php多线程获取网页

    php多线程获取网页,利用curl_multi同时请求多个url,并发请求,缩短执行等待时间

    php中curl模拟并发经典多线程

    这是一个经典的curl模拟多线程操作,缺点是总耗费时间取决于最慢的一个响应,网上有很多,只是用代码实现了一下,这是一个获取搜狗rank的示例

    PHP多线程抓取网页实现代码

    既然 Curl Multi Function如此强大,能否用 Curl Multi Functions 来写并发多线程下载文件呢,当然可以,下面给出我的代码: 代码1:将获得的代码直接写入某个文件 复制代码 代码如下: &lt;?php $urls = array( ...

    php使用curl_init()和curl_multi_init()多线程的速度比较详解

    php中curl_init()的作用很大,尤其是在抓取网页内容或文件信息的时候,例如之前文章《php使用curl获取header检测开启GZip压缩》就介绍到curl_init()的强大。 curl_init()处理事物是单线程模式,如果需要对事务处理走...

    浅谈php使用curl模拟多线程发送请求

    php的curl多线程是通过不断调用curl_multi_exec来获取内容,这里举一个demo来模拟一次curl多线程并发操作。 //设置缓冲为0(也可以去php.ini设置) ini_set('output_buffering', 0); //打开输出缓冲区 ob_start(); /...

    PHP中使用CURL模拟登录并获取数据实例

    cURL 是一个功能强大的PHP库,使用PHP的cURL库可以简单和有效地抓取网页并采集内容,设置cookie完成模拟登录网页,curl提供了丰富的函数,开发者可以从PHP手册中获取更多关于cURL信息。本文以模拟登录开源中国...

    PHP使用CURL_MULTI实现多线程采集的例子

    这两天有一客户定制了一个免登录发布模块,因为在模块中需要涉及到很多图片下载的问题,考虑到性能问题,所以特别写了一个CURL_MULTI远程采集网页的函数,以方便以后使用,估计以后都不会使用原来的单线程curl函数去...

    PHP+Curl远程模拟登录并获取数据

    Curl在抓取网页要比file_get_contents&#40;&#41;效率就要高些,支持多线程,并且curl提供了丰富的函数,你可以很方便的应用到webservice接口调用。

    php与python实现的线程池多线程爬虫功能示例

    本文实例讲述了php与python实现的线程池多线程爬虫功能。分享给大家供大家参考,具体如下: 多线程爬虫可以用于抓取内容了这个可以提升性能了,这里我们来看php与python 线程池多线程爬虫的例子,代码如下: php例子...

    php curl 模拟登录并获取数据实例详解

    PHP的curl()在抓取网页的效率方面是比较高的,而且支持多线程,而file_get_contents&#40;&#41;效率就要稍低些,当然,使用curl时需要开启下curl扩展。 代码实战 先来看登录部分的代码: //模拟登录 function login_...

    PHP使用curl_multi实现并发请求的方法示例

    本文实例讲述了PHP使用curl_multi实现并发请求的方法。分享给大家供大家参考,具体如下: class CurlMultiUtil { /** * 根据url,postData获取curl请求对象,这个比较简单,可以看官方文档 */ private static ...

    phpcrawler:php爬虫,基于swoole扩展的爬虫,php多进程多线程抓取

    PHP多进程/多线程爬虫 1、基于swoole扩展 2、抓取目前可采用curl或者snoopy 3、解析数据目前可使用 dom解析 其余类库会进一步支持 使用说明 1、安装swoole扩展 最新版本即可 sudo pecl install swoole 2、安装...

    PHP多线程之内部多线程实例分析

    本文实例分析了PHP多线程之内部多线程用法。分享给大家供大家参考。具体如下: 复制代码 代码如下:&lt;?php class Http_MultiRequest {  //要并行抓取的url 列表  private $urls = array();  //curl 的选项  ...

Global site tag (gtag.js) - Google Analytics