PHP利用Curl实现多线程抓取网页和下载文件
PHP 利用 Curl 可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,然而因为php语言本身不支持多线程,所以开发爬虫程序效率并不高,一般采集 数据可以利用 PHPquery类来采集数据库,在此之外也可以用 Curl ,借助Curl 这个功能实现并发多线程的访问多个url地址以实现并发多线程抓取网页或者下载文件.
至于具体实现过程,请参考下面几个例子:
1、实现抓取多个URL并将内容写入指定的文件
- $urls = array(
- '路径地址',
- '路径地址',
- '路径地址'
- ); // 设置要抓取的页面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、利用 PHP 的 Curl 实现抓取网页URL并保存内容
下面这段代码和上面差不多意思,只不过这个地方是将获得的代码先放入变量,然后再将获取到的内容写入指定的文件
- $urls = array(
- '路径地址',
- '路径地址',
- '路径地址'
- );
- $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 实现并发多线程下载文件
- $urls=array(
- '路径地址5w.zip',
- '路径地址5w.zip',
- '路径地址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(
- '路径地址5w.zip',
- '路径地址5w.zip',
- '路径地址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利用Curl实现多线程抓取网页和下载文件的更多相关文章
- 通过curl模拟多线程抓取网页(curl_multi_*)
curl请求多个url,以前都是使用循环来处理.最近发现可以通过curl_multi_*系列函数来模拟多线程.比对一下,发现如果请求的url只有几个,2种方案耗时差不多,但是url比较多,差距就非常明 ...
- curl模拟多线程抓取网页(优化)
通过上篇文章清楚了通过curl_multi_*函数可以一次请求多个url,但是也留下了问题,就是结果要等所有数据请求结束一起返回,才能逐个处理数据.优化代码,使先成功请求的url先返回处理结果,而不是 ...
- php curl_multi系列函数实现多线程抓取网页
最近几天在做一个多搜索引擎关键字排名查询工具,用于及时方便的了解关键词在各大搜索引擎的排名. 在抓取360搜索的时候,发现360搜索每页只支持显示10个搜索结果,如果想获取100个搜索结果数据,就得搜 ...
- PHP的cURL库:抓取网页,POST数据及其他,HTTP认证 抓取数据
From : http://developer.51cto.com/art/200904/121739.htm 下面是一个小例程: ﹤?php// 初始化一个 cURL 对象$curl = curl_ ...
- php curl多线程抓取网页
PHP 利用 Curl Functions 可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,受限于php语言本身不支持多线程,所以开发爬虫程序效率并不高,这时候往往需 要借助Cu ...
- 简单的使用php多线程抓取网页
PHP 利用 Curl Functions 可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,受限于php语言本身不支持多线程,所以开发爬虫程序效率并不高,这时候往往需 要借助Cu ...
- 使用Python3爬虫抓取网页来下载小说
很多时候想看小说但是在网页上找不到资源,即使找到了资源也没有提供下载,小说当然是下载下来用手机看才爽快啦! 于是程序员的思维出来了,不能下载我就直接用爬虫把各个章节爬下来,存入一个txt文件中,这样, ...
- python多线程抓取网页信息
#!/usr/env python #-*- coding: utf-8 -*- import urllib import urllib2 import random import requ ...
- 抓取网页数据C#文件
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mv ...
随机推荐
- Hadoop中JAVA不经过Catch(Exception e)直接到finally或者退出原因
原来是被变成Throwable抛出来了!而Exception是Throwable的子类,所以无法捕捉到,只有捕捉Throwable的时候,才可以将错误信息打印!
- 巧妙的重载魔术方法__call()
工作半年了,感觉这半年学到的东西比大学四年学到的还要多,主要原因是心静下来了,目标也明确了,不会去整天的和游戏纠缠在一起了.大学时候其实也意识到了玩游戏会影响自己的正常学习和工作的,但是一直控制不了自 ...
- div内容上下居中
今天无聊闲逛技术群,听一哥们说要在div里面居中span内容. 第一印象:vertical-align: middle; 结果失效.因为他只对属于inline的元素或是inline-block.tab ...
- linux配置网卡
我爱折腾.在本地虚拟机里装了linux的环境.要配置linux的网卡文件. 如下: vi /etc/sysconfig/network-script/ifcfg-eth0; 刚装完系统,没有vim , ...
- BZOJ1180: [CROATIAN2009]OTOCI
传送门 一遍AC,开心! $Link-Cut-Tree$最后一题 //BZOJ 1180 //by Cydiater //2016.9.18 #include <iostream> #in ...
- JavaWeb---总结(十八)JSP属性范围
所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以访问的保存范围. 一.JSP属性范围 JSP中提供了四种属性范围,四种属性范围分别指以下四种: 当前页:一个属性只能在一个页面中取得 ...
- chown -R命令的使用
chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID:组可以是组名或者组ID:文件是以空格分开的要改变权限的文件列表,支持通配符.系统管理员经常使用chown命令,在将文件拷贝 ...
- mysql使用索引优化查询效率
索引的概念 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度.在没 ...
- 点亮第一个LED灯
1.代码: #include <reg52.h> //<reg51.h> 包含52单片机寄存器库sbit led = P1^0; //只有地址可以被8整除的 才可以用s ...
- firefox怎么修改tls协议号
如果目前正在运行火狐26,你可能已经注意到,浏览器仅支持SSL 3.0和TLS 1.0,默认不开启TLS 1.1或TLS 1.2.另外我们知道Firefox 27 已经实现了对TLS 1.2的支持. ...