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. WPF强制更新

    ,更新的时候选择最小版本号,就是强制更新

  2. HNOI2016(BZOJ4542) 大数

    HNOI2016 Day2 T3 大数 Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P ...

  3. Jenkins配置MSBuild编译.net4.6的项目

    经过测试,如果用原始的msbuild,会出现语法无法识别的问题,"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe&qu ...

  4. lua的corroutine学习

    lua的corroutine学习 function receive (prod) local status, value = coroutine.resume(prod) return value e ...

  5. Scala implicit

    Scala implicit implicit基本含义 在Scala中有一个关键字是implicit, 之前一直不知道这个货是干什么的,今天整理了一下. 我们先来看一个例子: def display( ...

  6. 数据结构作业——brothers(二叉树)

    brothers Description 给你一棵节点编号从 1 到 n 的,根节点为 1 的二叉树.然后有 q 个询问,每个询问给出一个整数表示树的节点,要求这个节点的兄弟节点数目和堂兄弟节点的数目 ...

  7. Python的设计哲学探究

    在Python shell中输入import this就会在屏幕上打印出来Python的设计哲学,如下: In [25]: import this The Zen of Python, by Tim ...

  8. 【Alpha阶段】第二次Scrum例会

    燃尽图软件存在bug,正在排查修复:(已修复)由于时区设置到了美国,图表显示有问题. 会议信息 时间:2016.10.18 22:00 时长:1h 地点:大运村1号公寓5楼楼道 类型:设计阶段阶段性会 ...

  9. TreeMap按照key排序

    package test.tool.gui.common; import java.util.Comparator; import java.util.TreeMap; public class Te ...

  10. segmentfault.com mongo出识以及对数组的操作

    https://segmentfault.com/a/1190000003951602 首先推荐个工具,no-sql-manager-for-mongodb-professional,虽然收费,但是每 ...