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 ...
随机推荐
- CCNET+ProGet+Windows Batch搭建全自动的内部包打包和推送及管理平台
所要用的工具: 1.CCNET(用于检测SVN有改动提交时自动构建,并运行nuget的自动打包和推送批处理) 2.ProGet(目前见到最好用的nuget内部包管理平台) 3.Windows Batc ...
- django makemigrations的一个特性
Migrations will run the same way on the same dataset and produce consistent results, meaning that wh ...
- JavaScript制作时钟特效
需求说明:制作显示年.月.日.星期几并且显示上午(AM)和下午(PM)的 12进制的时钟,具体效果如下所示: 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C// ...
- 解决Eclipse 项目报错:Unbound classpath container
Eclipse出现下面两条报错: The project cannot be built until build path errors are resolved HelloWord Unknown ...
- Thenao tutorial – indexing
Theano和numpy一样,支持基本的下标取值方法和高级的下标取值方法. 因为theano中没有boolean类型,所以不支持boolean类型的masks. # head file support ...
- 【Alpha】Phylab2.0: Postmortem
设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 主要解决同学们写物理实验报告时,处理数据的困难--巨大的计算量和不规范的物理报告数据处理格式.典型 ...
- StringBuilder 和 StringBuffer
这两者唯一的不同就在于,StringBuffer是线程安全的,而StringBuilder不是.当然线程安全是有成本的,影响性能,而字符串对象及操作,大部分情况下,没有线程安全的问题,适合使用Stri ...
- 开发板ping不通主机和虚拟机的看过来(转载)!
前几天在做uboot下用tftp下载文件到开发板的实验时,为了能解决开发板ping不通主机和虚拟机的问题,可谓绞尽脑汁,正所谓久病成医,虽然为了这一小问题废了我那么长时间,但我在解决问题的同时也学到了 ...
- PHP 基本语法,字符串处理,正则
<?php //注释语法 /*多行注释*/ 输出语法 Echo "hello","worle"; //可以输出多个字符串 Print ...
- ASP------ActioinResult之多种返回值
转载: http://www.cnblogs.com/jiagoushi/archive/2013/01/24/2875454.html http://www.cnblogs.com/lvcha/ar ...