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. Hadoop中JAVA不经过Catch(Exception e)直接到finally或者退出原因

    原来是被变成Throwable抛出来了!而Exception是Throwable的子类,所以无法捕捉到,只有捕捉Throwable的时候,才可以将错误信息打印!

  2. 巧妙的重载魔术方法__call()

    工作半年了,感觉这半年学到的东西比大学四年学到的还要多,主要原因是心静下来了,目标也明确了,不会去整天的和游戏纠缠在一起了.大学时候其实也意识到了玩游戏会影响自己的正常学习和工作的,但是一直控制不了自 ...

  3. div内容上下居中

    今天无聊闲逛技术群,听一哥们说要在div里面居中span内容. 第一印象:vertical-align: middle; 结果失效.因为他只对属于inline的元素或是inline-block.tab ...

  4. linux配置网卡

    我爱折腾.在本地虚拟机里装了linux的环境.要配置linux的网卡文件. 如下: vi /etc/sysconfig/network-script/ifcfg-eth0; 刚装完系统,没有vim , ...

  5. BZOJ1180: [CROATIAN2009]OTOCI

    传送门 一遍AC,开心! $Link-Cut-Tree$最后一题 //BZOJ 1180 //by Cydiater //2016.9.18 #include <iostream> #in ...

  6. JavaWeb---总结(十八)JSP属性范围

    所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以访问的保存范围. 一.JSP属性范围 JSP中提供了四种属性范围,四种属性范围分别指以下四种: 当前页:一个属性只能在一个页面中取得 ...

  7. chown -R命令的使用

    chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID:组可以是组名或者组ID:文件是以空格分开的要改变权限的文件列表,支持通配符.系统管理员经常使用chown命令,在将文件拷贝 ...

  8. mysql使用索引优化查询效率

    索引的概念 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度.在没 ...

  9. 点亮第一个LED灯

    1.代码: #include <reg52.h> //<reg51.h>  包含52单片机寄存器库sbit led = P1^0;    //只有地址可以被8整除的 才可以用s ...

  10. firefox怎么修改tls协议号

    如果目前正在运行火狐26,你可能已经注意到,浏览器仅支持SSL 3.0和TLS 1.0,默认不开启TLS 1.1或TLS 1.2.另外我们知道Firefox 27 已经实现了对TLS 1.2的支持.  ...