PHP单线程实现并行抓取网页

   本PHP教程将模拟并行抓取多个页面信息的过程,关键在于单线程的并行处理。

  一般情况下,大家写抓取多个页面信息的程序都采用串行方案,但获取周期过长,不实用。于是我想到用curl 去并行抓取。但是,最后发现,那个虚拟服务器上没有curl,这真是让人纠结。于是,我决定改变思路,用单个线程也实现多个线程的效果。我想对网络编程有点

  了解的人肯定知道IO复用这个概念,当然PHP上也是支持的,而且,内部支持,不需要任何扩展。

  可能有很多年编程经验的人对PHP的stream 函数可能不太了解。PHP的压缩文件流,文件流,tcp 协议下的应用 都封装成一个stream。所以,读本地文件

  和读网络文件没有任何的差别。说了这样多,我想大家都基本上明白了,直接贴上代码吧:

  代码比较的粗糙,如果大家要实际用的话,还是要处理一些细节问题。

  代码

  

  function http_get_open($url)

  {

  $url = parse_url($url);

  if (empty($url['host'])) {

  return false;

  }

  $host = $url['host'];

  if (empty($url['path'])) {

  $url['path'] = "/";

  }

  $get = $url['path'] . "?" . @$url['query'];

  $fp = stream_socket_client("tcp://{$host}:80", $errno, $errstr, 30);

  if (!$fp) {

  echo "$errstr ($errno)
n";

  return false;

  } else {

  fwrite($fp, "GET {$get} HTTP/1.0rnHost: {$host}rnAccept: */*rnrn");

  }

  return $fp;

  }

  function http_multi_get($urls)

  {

  $result = array();

  $fps = array();

  foreach ($urls as $key => $url)

  {

  $fp = http_get_open($url);

  if ($fp === false) {

  $result[$key] = false;

  } else {

  $result[$key] = '';

  $fps[$key] = $fp;

  }

  }

  while (1)

  {

  $reads = $fps;

  if (empty($reads)) {

  break;

  }

  if (($num = stream_select($reads, $w = null, $e = null, 30)) === false ) {

  echo "error";

  return false;

  } else if ($num > 0) {//can read

  foreach ($reads as $value)

  {

  $key = array_search($value, $fps);

  if (!feof($value)) {

  $result[$key] .= fread($value, 128);

  } else {

  unset($fps[$key]);

  }

  }

  } else {//time out

  echo "timeout";

  return false;

  }

  }

  foreach ($result as $key => &$value)

  {

  if ($value) {

  $value = explode("rnrn", $value, 2);

  }

  }

  return $result;

  }

  $urls = array();

  $urls[] = "http://www.qq.com";

  $urls[] = "http://www.sina.com.cn";

  $urls[] = "http://www.sohu.com";

  $urls[] = "http://www.blue1000.com";

  //并行的抓取

  $t1 = microtime(true);

  $result = http_multi_get($urls);

  $t1 = microtime(true) - $t1;

  var_dump("cost: " . $t1);

  //串行的抓取

  $t1 = microtime(true);

  foreach ($urls as $value)

  {

  file_get_contents($value);

  }

  $t1 = microtime(true) - $t1;

  var_dump("cost: " . $t1);

  ?>

  最后运行的结果:

  string 'cost: 3.2403128147125' (length=21)

  string 'cost: 6.2333900928497' (length=21)

  基本上是两倍的效率,当然,发现新浪非常的慢,要2.5s 左右,

  基本上是被他给拖累了,360只要 0.2s

  如果,所有网站都差不多的速度,并行的数目更大,那么差的倍数也就越大。

时间: 2025-01-01 04:19:56

PHP单线程实现并行抓取网页的相关文章

PHP抓取网页、解析HTML常用的方法总结

  这篇文章主要介绍了PHP抓取网页.解析HTML常用的方法总结,本文只是对可以实现这两个需求的方法作了总结,只介绍方法,不介绍如何实现,需要的朋友可以参考下 概述 爬虫是我们在做程序时经常会遇到的一种功能.PHP有许多开源的爬虫工具,如snoopy,这些开源的爬虫工具,通常能帮我们完成大部分功能,但是在某种情况下,我们需要自己实现一个爬虫,本篇文章对PHP实现爬虫的方式做个总结. PHP实现爬虫主要方法 1.file()函数 2.file_get_contents()函数 3.fopen()-

linux-Linux c socket抓取网页保存到文件一直是乱码

问题描述 Linux c socket抓取网页保存到文件一直是乱码 如题,建立连接后发送请求后,保存到文件的代码如下: while(recvSize=recv(sockfdrecvBufBUF_SIZE0)>0){ fwrite(recvBufsizeof(char)strlen(recvBuf)fp); printf(""%s""recvBuf); memset(recvBuf0sizeof(recvBuf)); } 网页可以在终端上正常显示,但是这样保存到

php抓取网页

用php抓取页面的内容在实际的开发当中是非常有用的,如作一个简单的内容采集器,提取网页中的部分内容等等,抓取到的内容在通过正则表达式做一下过滤就得到了你想要的内容,以下就是几种常用的用php抓取网页中的内容的方法. 1.file_get_contents PHP代码 <?php $url = "http://www.phpzixue.cn"; $contents = file_get_contents($url); //如果出现中文乱码使用下面代码 //$getcontent =

PHP的cURL库功能简介:抓取网页,POST数据及其他

  使用PHP的cURL库可以简单和有效地去抓网页.你只需要运行一个脚本,然后分析一下你所抓取的网页,然后就可以以程序的方式得到你想要的数据了.无论是你想从从一个链接上取部分数据,或是取一个XML文件并把其导入数据库,那怕就是简单的获取网页内容,cURL 是一个功能强大的PHP库.本文主要讲述如果使用这个PHP库. 启用 cURL 设置 首先,我们得先要确定我们的PHP是否开启了这个库,你可以通过使用php_info()函数来得到这一信息. ﹤?php phpinfo(); ?﹥ 如果你可以在网

.NET2.0抓取网页全部链接

效果图 后台代码 以下为引用的内容:using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using

蜘蛛抓取网页过程的四步曲

随着搜索引擎的不断发展与升级,搜索引擎所派出的蜘蛛也变得越来越智能了,所以为了要弄清楚蜘蛛的工作原理,为了更好的优化自己的网站我们就必须不断的去研究蜘蛛.下面,我就和大家简单的聊聊蜘蛛的基本工作原理吧: 蜘蛛工作的第一步:爬行你网站的网页,寻找合适的资源. 蜘蛛它有一个特性,那就是他的运动轨迹通常都是围绕着蜘蛛丝而走的,而我们之所以将搜索引擎的机器人命名为蜘蛛其实就是因为这个特性.当蜘蛛来到你的网站之后,它就会顺着你网站中的链接(蜘蛛丝)不断的进行爬行,因此如何让蜘蛛能够更好的在你的网站中进行爬

PHP实现抓取网页的所有超链接的代码

因为最近要做一个类似专业搜索引擎的东西,需要抓取网页的所有超链接.大家帮忙测试一下子,下面的代码是否可以针对所有的标准超链接. 通用HTML标准超链接参数取得正则表达式测试 因为最近要做一个类似专业搜索引擎的东西,需要抓取网页的所有超链接. 大家帮忙测试一下子,下面的代码是否可以针对所有的标准超链接. 测试代码如下:   <?php  // -------------------------------------------------------------------------- // 

ASP.NET实现抓取网页中的链接

asp.net|链接|网页 输入一个地址,就可以把那个网页中的链接提取出来,下面这段代码可以轻松实现,主要的是用到了正则表达式.      GetUrl.ASPx代码如下:      <%@ Page Language="<a href="http://dev.21tx.com/language/vb/" target="_blank">VB</a>" CodeBehind="GetUrl.aspx.vb&

php中如何抓取网页图片

PHP是一门很容易上手的Web编程语言.PHP学习成本很低,能够迅速开发各种Web应用,是一个很优秀的工具. 尽管很多人觉得PHP缺点很多,quick and dirty 之类的,但是"这个世界上只有两种编程语言,一种是饱受争议的,一种是没人用的",不是吗?只要能够把事情做好的工具,就是好工具.PHP就是这么一个优秀的语言工具. 01.<?php 02.header('content-type:text/html;charset=utf-8');03. set_time_limi