php抓取curl下载文件,PHP 利用 Curl 函数实现多线程抓取网页和下载文件
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 需求 利用自定义函数实现批量爬取多家公司的新闻. 2 代码实现 from selenium import webdriver import redef dongfang(company):chro ...
- 设计一个程序,要求新建一个名为“hello”的文件并利用write函数向其写入“linux下的c软件设计”。
问题描述 设计一个程序,要求新建一个名为"hello"的文件并利用write函数向其写入"linux下的c软件设计". 大致思路 首先,新建文件使用到函数fop ...
- php curl登陆邮箱,php利用CURL函数登入163邮箱并获取自己的通讯录
我们使用phpmailer登录邮件发邮件也是使用了curl原理来实现模仿用户发邮件了,今天看了两个利用CURL函数登入163邮箱并获取自己的通讯录的例子,希望对各位有帮助. 学习了一些CURL的基础知 ...
- windows ssh传文件linux,利用SSH secure Shell实现windows与linux之间传输文件
在windows下安装SSH secure Shell.默认安装后有两个快捷方式. linux下需要安装openssh-server utuntu默认安装了opens是-client,所以不需要安装, ...
- php header保存文件,php利用header函数实现文件下载时直接提示保存
复制代码 代码如下: 下面是网上常用的方法 复制代码 代码如下: if (isset($link)) { Header("HTTP/1.1 303 See Other"); Hea ...
- python多线程爬取多个网址_【Python爬虫】多线程爬取斗图网站(皮皮虾,我们上车)...
原标题:[Python爬虫]多线程爬取斗图网站(皮皮虾,我们上车) 斗图我不怕 没有斗图库的程序猿是无助,每次在群里斗图都以惨败而告终,为了能让自己在斗图界立于不败之地,特意去网上爬取了斗图包.在这里 ...
- c语言用指针实现打开和关闭文件,我用rewind函数没把指针直到开始,关闭文件然后打开就行。帮忙看看...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 高手啊,我试了,结果是回到文件头了,把123覆盖了,为ABC 但我这个程序就能直接不关闭文件而用rewind函数到开头,你帮忙看看, //二进制文件的输入 ...
- python 接入百度地图数据包下载_Python爬虫-利用百度地图API接口爬取数据并保存至MySQL数据库...
首先,我这里有一份相关城市以及该城市的公园数量的txt文件: 分析-02.png 其次,利用百度地图API提供的接口爬取城市公园的相关信息. 所利用的API接口有两个: 1.http://api.ma ...
- curl不通 k8s_如何利用curl命令访问Kubernetes API server
API 请求必须使用 JSON 格式来发送.kubectl 的作用是将 yaml 转换为 JSON 格式进行 API 请求. 1.我们从查看 kubectl 的配置文件开始,需要:三个证书和 API ...
最新文章
- OpenGL和D3D的区别
- LAMP源码编译安装配置+wordpress
- VTK:相互作用之RubberBand2D
- 15-07-10 结构体-输入学生成绩进行排序
- eShopOnContainers 看微服务④:Catalog Service
- 【QGIS入门实战精品教程】5.1:QGIS地理坐标转火星坐标系(GCJ02)案例教程
- java在控制台打印余弦曲线,java打印正弦曲线示例
- 面向对象 solid_用简单的英语解释面向对象程序设计的SOLID原理
- windows下mysql主从同步_详解windows下mysql的主从同步
- Alpha混合(二)Material Alpha
- 随机产生13个0~51不同的随机数 -思想(定义参考系)
- Ola VS Uber:从印度到伦敦的出行战争
- 移动硬盘安装manjaro 20.2以及常用软件安装
- 重邮计算机学院艺术团,毕业季 | 重庆邮电大学2019届 “邮梦青春,毕业季”文艺晚会...
- 树莓派使用USB摄像头和motion实现监控
- 苹果MacBook电脑应用优化利器CleanMyMac X
- 推荐(笔记软件、日程安排软件)
- cad捕捉不到标注线上的点_CAD为什么捕捉不到正在绘制的多段线上的点?
- 海外SDK之----------苹果支付
- String转int问题分析