PHP 利用 Curl Functions 可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,然而因为php语言本身不支持多线程,所以开发爬虫程序效率并不高,因此经常需要借助Curl Multi Functions 这个功能实现并发多线程的访问多个url地址以实现并发多线程抓取网页或者下载文件,至于具体实现过程,请参考下面几个例子:

(1)下面这段代码是实现抓取多个URL,然后将抓取的URL的页面代码写入指定的文件

$urls = array('http://www.scutephp.com/',

'http://www.google.com/',

'http://www.example.com/'

); // 设置要抓取的页面URL

$save_to='/test.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)下面这段代码和上面差不多意思,只不过这个地方是将获得的代码先放入变量,然后再将获取到的内容写入指定的文件

$urls = array('http://www.scutephp.com/',

'http://www.google.com/',

'http://www.example.com/'

);

$save_to='/test.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 Functions 实现并发多线程下载文件

$urls=array('http://www.scutephp.com/5w.zip',

'http://www.scutephp.com/5w.zip',

'http://www.scutephp.com/5w.zip'

);

$save_to='./home/';

$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);$urls=array(

'http://www.scutephp.com/5w.zip',

'http://www.scutephp.com/5w.zip',

'http://www.scutephp.com/5w.zip'

);

$save_to='./home/';

$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);

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

php抓取curl下载文件,PHP 利用 Curl 函数实现多线程抓取网页和下载文件相关推荐

  1. 利用自定义函数实现批量爬取多家公司的新闻

    1 需求 利用自定义函数实现批量爬取多家公司的新闻. 2 代码实现 from selenium import webdriver import redef dongfang(company):chro ...

  2. 设计一个程序,要求新建一个名为“hello”的文件并利用write函数向其写入“linux下的c软件设计”。

    问题描述 设计一个程序,要求新建一个名为"hello"的文件并利用write函数向其写入"linux下的c软件设计". 大致思路 首先,新建文件使用到函数fop ...

  3. php curl登陆邮箱,php利用CURL函数登入163邮箱并获取自己的通讯录

    我们使用phpmailer登录邮件发邮件也是使用了curl原理来实现模仿用户发邮件了,今天看了两个利用CURL函数登入163邮箱并获取自己的通讯录的例子,希望对各位有帮助. 学习了一些CURL的基础知 ...

  4. windows ssh传文件linux,利用SSH secure Shell实现windows与linux之间传输文件

    在windows下安装SSH secure Shell.默认安装后有两个快捷方式. linux下需要安装openssh-server utuntu默认安装了opens是-client,所以不需要安装, ...

  5. php header保存文件,php利用header函数实现文件下载时直接提示保存

    复制代码 代码如下: 下面是网上常用的方法 复制代码 代码如下: if (isset($link)) { Header("HTTP/1.1 303 See Other"); Hea ...

  6. python多线程爬取多个网址_【Python爬虫】多线程爬取斗图网站(皮皮虾,我们上车)...

    原标题:[Python爬虫]多线程爬取斗图网站(皮皮虾,我们上车) 斗图我不怕 没有斗图库的程序猿是无助,每次在群里斗图都以惨败而告终,为了能让自己在斗图界立于不败之地,特意去网上爬取了斗图包.在这里 ...

  7. c语言用指针实现打开和关闭文件,我用rewind函数没把指针直到开始,关闭文件然后打开就行。帮忙看看...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 高手啊,我试了,结果是回到文件头了,把123覆盖了,为ABC 但我这个程序就能直接不关闭文件而用rewind函数到开头,你帮忙看看, //二进制文件的输入 ...

  8. python 接入百度地图数据包下载_Python爬虫-利用百度地图API接口爬取数据并保存至MySQL数据库...

    首先,我这里有一份相关城市以及该城市的公园数量的txt文件: 分析-02.png 其次,利用百度地图API提供的接口爬取城市公园的相关信息. 所利用的API接口有两个: 1.http://api.ma ...

  9. curl不通 k8s_如何利用curl命令访问Kubernetes API server

    API 请求必须使用 JSON 格式来发送.kubectl 的作用是将 yaml 转换为 JSON 格式进行 API 请求. 1.我们从查看 kubectl 的配置文件开始,需要:三个证书和 API ...

最新文章

  1. OpenGL和D3D的区别
  2. LAMP源码编译安装配置+wordpress
  3. VTK:相互作用之RubberBand2D
  4. 15-07-10 结构体-输入学生成绩进行排序
  5. eShopOnContainers 看微服务④:Catalog Service
  6. 【QGIS入门实战精品教程】5.1:QGIS地理坐标转火星坐标系(GCJ02)案例教程
  7. java在控制台打印余弦曲线,java打印正弦曲线示例
  8. 面向对象 solid_用简单的英语解释面向对象程序设计的SOLID原理
  9. windows下mysql主从同步_详解windows下mysql的主从同步
  10. Alpha混合(二)Material Alpha
  11. 随机产生13个0~51不同的随机数 -思想(定义参考系)
  12. Ola VS Uber:从印度到伦敦的出行战争
  13. 移动硬盘安装manjaro 20.2以及常用软件安装
  14. 重邮计算机学院艺术团,毕业季 | 重庆邮电大学2019届 “邮梦青春,毕业季”文艺晚会...
  15. 树莓派使用USB摄像头和motion实现监控
  16. 苹果MacBook电脑应用优化利器CleanMyMac X
  17. 推荐(笔记软件、日程安排软件)
  18. cad捕捉不到标注线上的点_CAD为什么捕捉不到正在绘制的多段线上的点?
  19. 海外SDK之----------苹果支付
  20. String转int问题分析

热门文章

  1. 多路HDMI编码转RTMP多平台推流直播导播方案
  2. 聚合支付源码怎么选择
  3. Win32 高级编程
  4. python12306买票_自己用python随意写的12306订票代码
  5. 「优知学院」淘宝技术架构的前世今生(上)
  6. 图解红黑树及Java进行红黑二叉树遍历的方法
  7. 白鹭引擎加密算法 - XXTEA -typescript
  8. 【源码】电压控制DC/DC双向变换器仿真
  9. ◆聚会时可以玩的游戏◆
  10. 外接服务器硬盘电源怎么用,多块服务器硬盘与工作机的连接方法