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

至于具体实现过程,请参考下面几个例子:

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

  1. $urls = array(
  2. '路径地址',
  3. '路径地址',
  4. '路径地址'
  5. ); // 设置要抓取的页面URL
  6. $save_to='/test.txt'; // 把抓取的代码写入该文件
  7. $st = fopen($save_to,"a");
  8. $mh = curl_multi_init();
  9. foreach ($urls as $i => $url) {
  10. $conn[$i] = curl_init($url);
  11. curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");
  12. curl_setopt($conn[$i], CURLOPT_HEADER ,0);
  13. curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);
  14. curl_setopt($conn[$i], CURLOPT_FILE,$st); // 将爬取的代码写入文件
  15. curl_multi_add_handle ($mh,$conn[$i]);
  16. } // 初始化
  17. do {
  18. curl_multi_exec($mh,$active);
  19. } while ($active); // 执行
  20. foreach ($urls as $i => $url) {
  21. curl_multi_remove_handle($mh,$conn[$i]);
  22. curl_close($conn[$i]);
  23. } // 结束清理
  24. curl_multi_close($mh);
  25. fclose($st);
复制

2、利用 PHP 的 Curl  实现抓取网页URL并保存内容

下面这段代码和上面差不多意思,只不过这个地方是将获得的代码先放入变量,然后再将获取到的内容写入指定的文件

  1. $urls = array(
  2. '路径地址',
  3. '路径地址',
  4. '路径地址'
  5. );
  6. $save_to='/test.txt'; // 把抓取的代码写入该文件
  7. $st = fopen($save_to,"a");
  8. $mh = curl_multi_init();
  9. foreach ($urls as $i => $url) {
  10. $conn[$i] = curl_init($url);
  11. curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");
  12. curl_setopt($conn[$i], CURLOPT_HEADER ,0);
  13. curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);
  14. curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,true); // 不将爬取代码写到浏览器,而是转化为字符串
  15. curl_multi_add_handle ($mh,$conn[$i]);
  16. }
  17. do {
  18. curl_multi_exec($mh,$active);
  19. } while ($active);
  20. foreach ($urls as $i => $url) {
  21. $data = curl_multi_getcontent($conn[$i]); // 获得爬取的代码字符串
  22. fwrite($st,$data); // 将字符串写入文件
  23. } // 获得数据变量,并写入文件
  24. foreach ($urls as $i => $url) {
  25. curl_multi_remove_handle($mh,$conn[$i]);
  26. curl_close($conn[$i]);
  27. }
  28. curl_multi_close($mh);
  29. fclose($st);
复制

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

  1. $urls=array(
  2. '路径地址5w.zip',
  3. '路径地址5w.zip',
  4. '路径地址5w.zip'
  5. );
  6. $save_to='./home/';
  7. $mh=curl_multi_init();
  8. foreach($urls as $i=>$url){
  9. $g=$save_to.basename($url);
  10. if(!is_file($g)){
  11. $conn[$i]=curl_init($url);
  12. $fp[$i]=fopen($g,"w");
  13. curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");
  14. curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);
  15. curl_setopt($conn[$i],CURLOPT_HEADER ,0);
  16. curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);
  17. curl_multi_add_handle($mh,$conn[$i]);
  18. }
  19. }
  20. do{
  21. $n=curl_multi_exec($mh,$active);
  22. }while($active);
  23. foreach($urls as $i=>$url){
  24. curl_multi_remove_handle($mh,$conn[$i]);
  25. curl_close($conn[$i]);
  26. fclose($fp[$i]);
  27. }
  28. curl_multi_close($mh);$urls=array(
  29. '路径地址5w.zip',
  30. '路径地址5w.zip',
  31. '路径地址5w.zip'
  32. );
  33. $save_to='./home/';
  34. $mh=curl_multi_init();
  35. foreach($urls as $i=>$url){
  36. $g=$save_to.basename($url);
  37. if(!is_file($g)){
  38. $conn[$i]=curl_init($url);
  39. $fp[$i]=fopen($g,"w");
  40. curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");
  41. curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);
  42. curl_setopt($conn[$i],CURLOPT_HEADER ,0);
  43. curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);
  44. curl_multi_add_handle($mh,$conn[$i]);
  45. }
  46. }
  47. do{
  48. $n=curl_multi_exec($mh,$active);
  49. }while($active);
  50. foreach($urls as $i=>$url){
  51. curl_multi_remove_handle($mh,$conn[$i]);
  52. curl_close($conn[$i]);
  53. fclose($fp[$i]);
  54. }
  55. curl_multi_close($mh);
复制

PHP利用Curl实现多线程抓取网页和下载文件的更多相关文章

  1. 通过curl模拟多线程抓取网页(curl_multi_*)

    curl请求多个url,以前都是使用循环来处理.最近发现可以通过curl_multi_*系列函数来模拟多线程.比对一下,发现如果请求的url只有几个,2种方案耗时差不多,但是url比较多,差距就非常明 ...

  2. curl模拟多线程抓取网页(优化)

    通过上篇文章清楚了通过curl_multi_*函数可以一次请求多个url,但是也留下了问题,就是结果要等所有数据请求结束一起返回,才能逐个处理数据.优化代码,使先成功请求的url先返回处理结果,而不是 ...

  3. php curl_multi系列函数实现多线程抓取网页

    最近几天在做一个多搜索引擎关键字排名查询工具,用于及时方便的了解关键词在各大搜索引擎的排名. 在抓取360搜索的时候,发现360搜索每页只支持显示10个搜索结果,如果想获取100个搜索结果数据,就得搜 ...

  4. PHP的cURL库:抓取网页,POST数据及其他,HTTP认证 抓取数据

    From : http://developer.51cto.com/art/200904/121739.htm 下面是一个小例程: ﹤?php// 初始化一个 cURL 对象$curl = curl_ ...

  5. php curl多线程抓取网页

    PHP 利用 Curl Functions 可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,受限于php语言本身不支持多线程,所以开发爬虫程序效率并不高,这时候往往需 要借助Cu ...

  6. 简单的使用php多线程抓取网页

    PHP 利用 Curl Functions 可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,受限于php语言本身不支持多线程,所以开发爬虫程序效率并不高,这时候往往需 要借助Cu ...

  7. 使用Python3爬虫抓取网页来下载小说

    很多时候想看小说但是在网页上找不到资源,即使找到了资源也没有提供下载,小说当然是下载下来用手机看才爽快啦! 于是程序员的思维出来了,不能下载我就直接用爬虫把各个章节爬下来,存入一个txt文件中,这样, ...

  8. python多线程抓取网页信息

    #!/usr/env  python #-*- coding: utf-8  -*- import urllib  import urllib2  import random  import requ ...

  9. 抓取网页数据C#文件

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mv ...

随机推荐

  1. 【BZOJ-4278】Tasowanie 后缀数组 + 归并

    4278: [ONTAK2015]Tasowanie Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 164  Solved: 80[Submit][S ...

  2. 使用Chrome或Fiddler抓取WebSocket包

    首先,HTTP是建立在TCP协议基础上的,而WebSocket通常也是建立在TCP上,所以说为什么有些网页游戏抓不到包而有些又可以,这仅是因为你使用的抓包工具是针对了HTTP的通信协议. 我先从抽象的 ...

  3. PHP的几个常用加密函数

    在php的开发过程中,常常需要对部分数据(如用户密码)进行加密 一.加密类型: 1.单向散列加密 就是把任意长度的信息进行散列计算,得到固定长度的输出,这个散列计算过程是单向的,即不能对固定长度的输出 ...

  4. <转>iOS9 Day-by-Day:iOS开发者必须了解的iOS 9新技术与API

    iOS9 Day-by-Day是作者Chris Grant新开的一个系列博客,覆盖了iOS开发者必须知道的关于iOS 9的新技术与API,并且还进行了实际操作演练,每篇文章中相关的代码Chris都会将 ...

  5. vs 2012 + OPenCV 2.4.8 配置

    一:安装Opencv 下载opencv-2.4.8.exe,然后安装在目录D:\opencv-2.4.8. 二:配置vs 2012 1.打开vs创建项目 2.下一步,选择dll ,空项目,然后完成.后 ...

  6. 本地仓库 同步到 bitbucket 远程git库

    http://blog.csdn.net/lue2009/article/details/46553829 配置ssh连接: http://blog.csdn.net/lue2009/article/ ...

  7. java编程思想-java中的并发(二)

    二.共享受限资源 有了并发就可以同时做多件事情了.但是,两个或多个线程彼此互相干涉的问题也就出现了.如果不防范这种冲突,就可能发生两个线程同时试图访问同一个银行账户,或向同一个打印机打印,改变同一个值 ...

  8. Java 性能优化技巧集锦

    摘要: =================================== 可供程序利用的资源(内存.CPU时间.网络带宽等)是有限的,优化的目的就是让程序用尽可能少的资源完成预定的任务.优化通常 ...

  9. Oracle开发常用函数与存储过程

    create or replace function Fuc_Get_AuthorName(RecID_In in varchar2, AdmID_In in varchar2) return var ...

  10. Tomcat配置并启用HTTPS

    参考文献:http://www.cnblogs.com/xdp-gacl/p/3744053.html#blogTitle2 概述:用sun公司提供的keytool(位置为<JAVA_HOME& ...