php多线程抓取网页

php多线程抓取网页

php多线程抓取网页(本文实例讲述php使用pthreadsv3多线程实现抓取新浪新闻信息)

网站优化优采云 发表了文章 • 0 个评论 • 78 次浏览 • 2021-12-25 09:01 • 来自相关话题

  php多线程抓取网页(本文实例讲述php使用pthreadsv3多线程实现抓取新浪新闻信息)
  本文举例说明php如何使用pthreads v3多线程抓取新浪新闻信息。分享给大家,供大家参考,如下:
  我们使用pthreads编写了一个多线程页面爬取小程序,并将结果存入数据库。
  数据表的结构如下:
   CREATE TABLE `tb_sina` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `url` varchar(256) DEFAULT '' COMMENT 'url地址', `title` varchar(128) DEFAULT '' COMMENT '标题', `time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='sina新闻';
  代码如下:
   dsn = $dsn; $this->root = $root; $this->pwd = $pwd; } public function run() { //创建连接对象 self::$db = new PDO($this->dsn, $this->root, $this->pwd); //把require放到worker线程中,不要放到主线程中,不然会报错找不到类 require './vendor/autoload.php'; } //返回一个连接资源 public function getConn() { return self::$db; } } class Sina extends Thread { private $name; private $url; public function __construct($name, $url) { $this->name = $name; $this->url = $url; } public function run() { $db = $this->worker->getConn(); if (empty($db) || empty($this->url)) { return false; } $cOntent= file_get_contents($this->url); if (!empty($content)) { //获取标题,地址,时间 $data = QL\QueryList::Query($content, [ 'tit' => ['.c_tit > a', 'text'], 'url' => ['.c_tit > a', 'href'], 'time' => ['.c_time', 'text'], ], '', 'UTF-8', 'GB2312')->getData(); //把获取的数据插入数据库 if (!empty($data)) { $sql = 'INSERT INTO tb_sina(`url`, `title`, `time`) VALUES'; foreach ($data as $row) { //修改下时间,新浪的时间格式是这样的04-23 15:30 $time = date('Y') . '-' . $row['time'] . ':00'; $sql .= "('{$row['url']}', '{$row['tit']}', '{$time}'),"; } $sql = rtrim($sql, ','); $ret = $db->exec($sql); if ($ret !== false) { echo "线程{$this->name}成功插入{$ret}条数据\n"; } else { var_dump($db->errorInfo()); } } } } } //抓取页面地址 $url = 'http://roll.news.sina.com.cn/s/channel.php?ch=01#col=89&spec=&type=&ch=01&k=&offset_page=0&offset_num=0&num=60&asc=&page='; //创建pool池 $pool = new Pool(5, 'DB', ['mysql:dbname=test;host=192.168.33.226', 'root', '']); //获取100个分页数据 for ($ix = 1; $ix submit(new Sina($ix, $url . $ix)); } //循环收集垃圾,阻塞主线程,等待子线程结束 while ($pool->collect()) ; $pool->shutdown();
  由于使用了QueryList,可以通过composer安装。
   composer require jaeger/querylist
  然而,安装的版本是3.2。我的php7.2下会有问题。由于each()已被弃用,因此修改了源代码,将each()替换为foreach。 ()够了。
  运行结果如下:
  
  数据也保存在数据库中
  
  当然,你也可以再次通过url获取具体的页面内容。这里不做演示,有兴趣的可以自己动手。
  更多对PHP相关内容感兴趣的读者可以查看本站专题:《PHP进程与线程操作技巧总结》、《PHP网络编程技巧总结》、《PHP基本语法介绍》、《 PHP数组(数组)操作技巧大全、php字符串使用总结、php+mysql数据库操作入门教程、php常用数据库操作技巧总结
  希望这篇文章能对你的 PHP 编程有所帮助。
  内容推荐:免费高清PNG素材下载 查看全部

  php多线程抓取网页(本文实例讲述php使用pthreadsv3多线程实现抓取新浪新闻信息)
  本文举例说明php如何使用pthreads v3多线程抓取新浪新闻信息。分享给大家,供大家参考,如下:
  我们使用pthreads编写了一个多线程页面爬取小程序,并将结果存入数据库。
  数据表的结构如下:
   CREATE TABLE `tb_sina` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `url` varchar(256) DEFAULT '' COMMENT 'url地址', `title` varchar(128) DEFAULT '' COMMENT '标题', `time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='sina新闻';
  代码如下:
   dsn = $dsn; $this->root = $root; $this->pwd = $pwd; } public function run() { //创建连接对象 self::$db = new PDO($this->dsn, $this->root, $this->pwd); //把require放到worker线程中,不要放到主线程中,不然会报错找不到类 require './vendor/autoload.php'; } //返回一个连接资源 public function getConn() { return self::$db; } } class Sina extends Thread { private $name; private $url; public function __construct($name, $url) { $this->name = $name; $this->url = $url; } public function run() { $db = $this->worker->getConn(); if (empty($db) || empty($this->url)) { return false; } $cOntent= file_get_contents($this->url); if (!empty($content)) { //获取标题,地址,时间 $data = QL\QueryList::Query($content, [ 'tit' => ['.c_tit > a', 'text'], 'url' => ['.c_tit > a', 'href'], 'time' => ['.c_time', 'text'], ], '', 'UTF-8', 'GB2312')->getData(); //把获取的数据插入数据库 if (!empty($data)) { $sql = 'INSERT INTO tb_sina(`url`, `title`, `time`) VALUES'; foreach ($data as $row) { //修改下时间,新浪的时间格式是这样的04-23 15:30 $time = date('Y') . '-' . $row['time'] . ':00'; $sql .= "('{$row['url']}', '{$row['tit']}', '{$time}'),"; } $sql = rtrim($sql, ','); $ret = $db->exec($sql); if ($ret !== false) { echo "线程{$this->name}成功插入{$ret}条数据\n"; } else { var_dump($db->errorInfo()); } } } } } //抓取页面地址 $url = 'http://roll.news.sina.com.cn/s/channel.php?ch=01#col=89&spec=&type=&ch=01&k=&offset_page=0&offset_num=0&num=60&asc=&page='; //创建pool池 $pool = new Pool(5, 'DB', ['mysql:dbname=test;host=192.168.33.226', 'root', '']); //获取100个分页数据 for ($ix = 1; $ix submit(new Sina($ix, $url . $ix)); } //循环收集垃圾,阻塞主线程,等待子线程结束 while ($pool->collect()) ; $pool->shutdown();
  由于使用了QueryList,可以通过composer安装。
   composer require jaeger/querylist
  然而,安装的版本是3.2。我的php7.2下会有问题。由于each()已被弃用,因此修改了源代码,将each()替换为foreach。 ()够了。
  运行结果如下:
  
  数据也保存在数据库中
  
  当然,你也可以再次通过url获取具体的页面内容。这里不做演示,有兴趣的可以自己动手。
  更多对PHP相关内容感兴趣的读者可以查看本站专题:《PHP进程与线程操作技巧总结》、《PHP网络编程技巧总结》、《PHP基本语法介绍》、《 PHP数组(数组)操作技巧大全、php字符串使用总结、php+mysql数据库操作入门教程、php常用数据库操作技巧总结
  希望这篇文章能对你的 PHP 编程有所帮助。
  内容推荐:免费高清PNG素材下载

php多线程抓取网页(php手册中语焉不详的curl_multi一族的函数头疼不已)

网站优化优采云 发表了文章 • 0 个评论 • 76 次浏览 • 2021-12-21 00:26 • 来自相关话题

  php多线程抓取网页(php手册中语焉不详的curl_multi一族的函数头疼不已)
  让我向您介绍 Curl 多线程示例和原理。请指教
  相信很多人都为php手册中含糊不清的curl_multi系列函数而头疼。它们的文档较少,并且给出的示例很容易让您学习。我也搜索了很多网页,都没有看到一个完整的应用实例。
  curl_multi_add_handle
  curl_multi_close
  curl_multi_exec
  curl_multi_getcontent
  curl_multi_info_read
  curl_multi_init
  curl_multi_remove_handle
  curl_multi_select
  一般来说,在考虑使用这些函数时,目的显然应该是同时请求多个URL,而不是一个一个,否则最好在循环中调整curl_exec。
  步骤总结如下:
  第一步:调用 curl_multi_init
  第二步:循环调用 curl_multi_add_handle
  这一步需要注意的是curl_multi_add_handle的第二个参数是curl_init的子句柄。
  第三步:继续调用curl_multi_exec
  第四步:根据需要调用 curl_multi_getcontent 循环获取结果
  第五步:调用curl_multi_remove_handle,对每个字句柄调用curl_close
  第 6 步:调用 curl_multi_close
  这是 PHP 手册中的一个示例:
  复制代码代码如下:
  整个使用过程差不多就是这样,但是这段简单的代码有个致命的弱点,就是在do循环部分,在整个URL请求过程中都是无限循环,容易造成CPU占用100%。
  现在让我们改进它。这里我们需要使用一个几乎没有文档的函数 curl_multi_select。虽然C的curl库有select的说明,但是PHP中的界面和用法确实和C中的有所不同。
  将上面的段落更改为以下内容:
  复制代码代码如下:
  做 {
  $mrc = curl_multi_exec($mh,$active);
  } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  而($active 和 $mrc == CURLM_OK){
  如果 (curl_multi_select($mh) != -1) {
  做 {
  $mrc = curl_multi_exec($mh, $active);
  } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  }
  }
  因为$active要等到所有url数据都被接受后才会变为false,所以这里用curl_multi_exec的返回值来判断是否有数据。有数据时,会不断调用 curl_multi_exec。如果没有数据,则进入选择阶段。新数据可以唤醒继续执行。这里的优点是没有不必要的 CPU 消耗。
  另外:还有一些细节有时可能会遇到:
  要控制每个请求的超时时间,请在 curl_multi_add_handle 之前通过 curl_setopt 进行:
  curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
  判断是否超时或其他错误,使用 curl_error($conn[$i]); 在 curl_multi_getcontent 之前;
  该类别的特点:
  运行非常稳定。
  设置并发将始终使用此并发数,即使通过回调函数添加任务也是如此。
  CPU占用率极低,大部分CPU消耗在用户的回调函数中。
  内存利用率高,任务量大(15W任务会占用256M以上内存)。可以使用回调函数添加任务,任务数量可以自定义。
  可以最大限度地占用带宽。
  链式任务,例如需要多个不同地址采集的数据的任务,可以通过回调一次完成。
  能够对CURL错误进行多次尝试,次数自行决定(大并发初期容易产生CURL错误,网络条件或者对方服务器的稳定性也可能导致CURL错误)。
  回调函数相当灵活,可以同时执行多种类型的任务(比如下载文件、抓取网页、分析404可以在一个PHP进程中同时执行)。
  自定义任务类型非常容易,比如检查404,获取重定向的最后一个URL等。
  您可以设置缓存来挑战产品纪律。
  不足的:
  不能充分利用多核CPU(可以开多个进程解决,需要自己处理任务划分等逻辑)。
  最大并发数为 500(或 512?)。经过测试,是CURL的内部限制。如果超过最大并发,总是返回失败。
  目前没有可恢复的传递函数。
  目前任务是原子的,一个大文件不能分成几个部分开线程下载。
  trueTechArticle 向您介绍了 Curl 多线程示例和原理。有什么问题,请指教。相信很多人都为php手册中含糊不清的curl_multi系列函数而头疼。他们的文件较少,而且他们提供... 查看全部

  php多线程抓取网页(php手册中语焉不详的curl_multi一族的函数头疼不已)
  让我向您介绍 Curl 多线程示例和原理。请指教
  相信很多人都为php手册中含糊不清的curl_multi系列函数而头疼。它们的文档较少,并且给出的示例很容易让您学习。我也搜索了很多网页,都没有看到一个完整的应用实例。
  curl_multi_add_handle
  curl_multi_close
  curl_multi_exec
  curl_multi_getcontent
  curl_multi_info_read
  curl_multi_init
  curl_multi_remove_handle
  curl_multi_select
  一般来说,在考虑使用这些函数时,目的显然应该是同时请求多个URL,而不是一个一个,否则最好在循环中调整curl_exec。
  步骤总结如下:
  第一步:调用 curl_multi_init
  第二步:循环调用 curl_multi_add_handle
  这一步需要注意的是curl_multi_add_handle的第二个参数是curl_init的子句柄。
  第三步:继续调用curl_multi_exec
  第四步:根据需要调用 curl_multi_getcontent 循环获取结果
  第五步:调用curl_multi_remove_handle,对每个字句柄调用curl_close
  第 6 步:调用 curl_multi_close
  这是 PHP 手册中的一个示例:
  复制代码代码如下:
  整个使用过程差不多就是这样,但是这段简单的代码有个致命的弱点,就是在do循环部分,在整个URL请求过程中都是无限循环,容易造成CPU占用100%。
  现在让我们改进它。这里我们需要使用一个几乎没有文档的函数 curl_multi_select。虽然C的curl库有select的说明,但是PHP中的界面和用法确实和C中的有所不同。
  将上面的段落更改为以下内容:
  复制代码代码如下:
  做 {
  $mrc = curl_multi_exec($mh,$active);
  } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  而($active 和 $mrc == CURLM_OK){
  如果 (curl_multi_select($mh) != -1) {
  做 {
  $mrc = curl_multi_exec($mh, $active);
  } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  }
  }
  因为$active要等到所有url数据都被接受后才会变为false,所以这里用curl_multi_exec的返回值来判断是否有数据。有数据时,会不断调用 curl_multi_exec。如果没有数据,则进入选择阶段。新数据可以唤醒继续执行。这里的优点是没有不必要的 CPU 消耗。
  另外:还有一些细节有时可能会遇到:
  要控制每个请求的超时时间,请在 curl_multi_add_handle 之前通过 curl_setopt 进行:
  curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
  判断是否超时或其他错误,使用 curl_error($conn[$i]); 在 curl_multi_getcontent 之前;
  该类别的特点:
  运行非常稳定。
  设置并发将始终使用此并发数,即使通过回调函数添加任务也是如此。
  CPU占用率极低,大部分CPU消耗在用户的回调函数中。
  内存利用率高,任务量大(15W任务会占用256M以上内存)。可以使用回调函数添加任务,任务数量可以自定义。
  可以最大限度地占用带宽。
  链式任务,例如需要多个不同地址采集的数据的任务,可以通过回调一次完成。
  能够对CURL错误进行多次尝试,次数自行决定(大并发初期容易产生CURL错误,网络条件或者对方服务器的稳定性也可能导致CURL错误)。
  回调函数相当灵活,可以同时执行多种类型的任务(比如下载文件、抓取网页、分析404可以在一个PHP进程中同时执行)。
  自定义任务类型非常容易,比如检查404,获取重定向的最后一个URL等。
  您可以设置缓存来挑战产品纪律。
  不足的:
  不能充分利用多核CPU(可以开多个进程解决,需要自己处理任务划分等逻辑)。
  最大并发数为 500(或 512?)。经过测试,是CURL的内部限制。如果超过最大并发,总是返回失败。
  目前没有可恢复的传递函数。
  目前任务是原子的,一个大文件不能分成几个部分开线程下载。
  trueTechArticle 向您介绍了 Curl 多线程示例和原理。有什么问题,请指教。相信很多人都为php手册中含糊不清的curl_multi系列函数而头疼。他们的文件较少,而且他们提供...

php多线程抓取网页(PHP利用CurlFunctionsFunctions并发多线程地址)

网站优化优采云 发表了文章 • 0 个评论 • 60 次浏览 • 2021-12-18 19:16 • 来自相关话题

  php多线程抓取网页(PHP利用CurlFunctionsFunctions并发多线程地址)
  PHP 可以使用 Curl Functions 完成各种文件传输操作,比如模拟浏览器发送 GET、POST 请求等,但是 PHP 语言本身不支持多线程,所以开发爬虫程序的效率是不高。这时候往往需要Curl Multi Functions来实现对多个URL地址的并发多线程访问。既然Curl Multi Function这么强大,那我可以用Curl Multi Functions来写并发多线程下载文件吗?当然,我的代码如下:
  代码2:将得到的代码先放入变量中,再写入文件
  //上面的do有问题,这样写会报错
  //改变do循环开始
  做{
  $mrc = curl_multi_exec($mh,$active);
  } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  while ($active and $mrc == CURLM_OK) {
  if (curl_multi_select($mh) != -1) {
  做{
  $mrc = curl_multi_exec($mh, $active);
  } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  }
  }
  //改变do循环结束
  因为$active要等到所有url数据被接受后才变为false,这里用curl_multi_exec的返回值来判断是否有数据。有数据时,会不断调用curl_multi_exec,如果没有数据,则进入select阶段。 , 新数据可以被唤醒继续执行。这里的好处是没有了不必要的 CPU 消耗。 查看全部

  php多线程抓取网页(PHP利用CurlFunctionsFunctions并发多线程地址)
  PHP 可以使用 Curl Functions 完成各种文件传输操作,比如模拟浏览器发送 GET、POST 请求等,但是 PHP 语言本身不支持多线程,所以开发爬虫程序的效率是不高。这时候往往需要Curl Multi Functions来实现对多个URL地址的并发多线程访问。既然Curl Multi Function这么强大,那我可以用Curl Multi Functions来写并发多线程下载文件吗?当然,我的代码如下:
  代码2:将得到的代码先放入变量中,再写入文件
  //上面的do有问题,这样写会报错
  //改变do循环开始
  做{
  $mrc = curl_multi_exec($mh,$active);
  } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  while ($active and $mrc == CURLM_OK) {
  if (curl_multi_select($mh) != -1) {
  做{
  $mrc = curl_multi_exec($mh, $active);
  } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  }
  }
  //改变do循环结束
  因为$active要等到所有url数据被接受后才变为false,这里用curl_multi_exec的返回值来判断是否有数据。有数据时,会不断调用curl_multi_exec,如果没有数据,则进入select阶段。 , 新数据可以被唤醒继续执行。这里的好处是没有了不必要的 CPU 消耗。

php多线程抓取网页(中国最强搜索引擎--百度上面行走了好长,我要想骂人了)

网站优化优采云 发表了文章 • 0 个评论 • 53 次浏览 • 2021-12-18 17:03 • 来自相关话题

  php多线程抓取网页(中国最强搜索引擎--百度上面行走了好长,我要想骂人了)
  最近在做一个项目,有一个需求:要从网页中抓取数据,要求是先抓取整个网页的html源代码(用于后期更新)。一开始看到这个简单,然后就稀里糊涂的打了代码(之前用Hadoop平台的分布式爬虫框架Nutch,用起来很方便,但最后因为速度放弃了,但是统计生成用于后续爬取),很快就成功下载了holder.html和finance.html页面,然后在解析holder.html页面后,解析finance.html,然后郁闷的找不到自己需要的在这个页面中的数据不在html源代码中。去浏览器查看源码确实是这样。源代码中确实没有我需要的数据。
  在号称中国最强搜索引擎——百度上走了很久,发现大部分人都在用WebDriver和HttpUnit(其实前者已经收录了后者)。我很高兴,终于找到了解决方案。. 兴奋地使用WebDriver,我想骂人。
  
  以下是对WebDriver的投诉
  WebDriver 是一个测试框架。本来不是为爬虫服务的,但我想说的是:星盘只是有点短,你不能更进一步吗?为什么网上那么多人推荐WebDriver?我觉得这些人并没有从现实出发,甚至有人说WebDriver可以解析完成的页面,返回给想要爬取整个页面(包括动态生成的内容)的人。是的,WebDriver可以完成这个任务,但是看关于作者写的代码,我想说的是:哥们,你的代码限制太多了,解析你写的js代码,js代码很简单,所以当然WebDriver 可以毫无压力地完成任务。WebDriver 对动态内容的分析依赖于 js 代码的复杂性和多样性。
  什么是复杂度?
  先贴一段代码
  WebDriver driver = newInternetExplorerDriver ();
HtmlPage page = driver.get(url);
System.out.println(page.asXml());
  这段代码的意思是大家都明白了。上面使用的IE内核,当然是FirefoxDriver、ChromeDriver、HtmlUnitDriver,这些驱动的使用原理都是一样的,先打开浏览器(这个需要时间),然后加载url并完成动态分析,然后通过page。 asXml() 可以得到完整的html页面,其中HtmlUnitDriver模拟无界面浏览器,java有引擎rhino执行js,HtmlUnitDriver使用rhino解析js,因为它不会启动有界面的浏览器,所以HtmlUnitDriver的速度比前三个都快。不管是什么Driver,都难免要解析js,这需要时间,而且对于没有使用的内核,js的支持程序也不同。例如,HtmlUnitDriver 对带有滚动的 js 代码的支持很差,并且在执行过程中会报错。(亲身体验)。js代码的复杂含义是不同内核支持的js并不完全一样。这个要根据具体情况来确定。好久没研究js了,就不讲各个核心对js的支持了。
  什么是多样性
  前面说过,浏览器解析js需要时间。对于只嵌入少量js代码的页面,通过page.asXml()获取完整页面是没有问题的。但是对于嵌入了大量js代码的页面,解析js需要花费大量的时间(对于jvm),那么大部分时候通过page.asXml()获取的页面并不收录动态生成的内容。问题是,为什么说WebDriver可以获取收录动态内容的html页面呢?网上有人说在driver.get(url)之后,当前线程需要等待一段时间才能获取完成的页面,类似于下面的形式
  WebDriver driver = new InternetExplorerDriver();
HtmlPage page = dirver.get(url);
Thread.sleep(2000);
System.output.println(page.asXml());
  我按照这个想法尝试了以下,是的,确实有可能。但问题不就在那里吗?如何确定等待时间?类似于数据挖掘中使用的经验方法来确定阈值?,或者尽可能长。我觉得这些都不是很好的方法,时间成本也比较高。只是觉得驱动应该可以在js的解析完成后捕捉到状态,于是搜索,搜索,但是根本没有这样的方法,所以我说为什么WebDriver的设计者没有采取措施forward 以便我们可以在程序中获取解析js后驱动的状态。在这种情况下,没有必要使用像Thread.sleep(2000)这样的不确定代码,可惜我找不到它。真的让我感到难过。字段。FirefoxDriver,ChromeDriver,HtmlUnitDriver 也有同样的问题。可以说使用WebDriver辅助爬取动态生成的网页得到的结果是非常不稳定的。我对此有深刻的理解。使用IEDriver时,同一个页面两次爬取的结果会不一样,有时甚至IE直接挂掉。你敢在爬虫程序中使用这种东西吗?我不敢。
  另外,有人推荐使用HttpUnit。其实WebDirver中的HtmlUnitDriver内部使用的是httpUnit,所以在使用HttpUnit的时候也会遇到同样的问题。我也做过一个实验,确实是这样。通过Thread.sleep(2000))等待js解析完成,我觉得不可取,不确定性太大,尤其是大型爬虫工作。
  综上所述,WebDriver 是一个为测试而设计的框架。虽然理论上可以用来辅助爬虫获取动态内容的html页面,但在实际应用中并没有使用,不确定性太大。稳定性太差,速度太慢。让我们让框架发挥最大的作用。不要损害他们的优势。
  我的工作还没有完成,所以我需要想办法上网。这次找到了一个稳定且确定性很强的辅助工具——phantomjs。我还没有完全理解这件事。但是已经用它来实现我想要的功能了。在java中,通过runtime.exec(arg)调用phantomjs来获取解析js后的页面。我会发布代码
  phantomjs端要执行的代码
  system = require(\'system\')
address = system.args[1];//获得命令行第二个参数 接下来会用到
//console.log(\'Loading a web page\');
var page = require(\'webpage\').create();
var url = address;
//console.log(url);
page.open(url, function (status) {
//Page is loaded!
if (status !== \'success\') {
console.log(\'Unable to post!\');
} else {
//此处的打印,是将结果一流的形式output到java中,java通过InputStream可以获取该输出内容
console.log(page.content);
}
phantom.exit();
});
  在java端执行的代码
  public void getParseredHtml(){
String url = "www.bai.com";
Runtime runtime = Runtime.getRuntime();
runtime.exec("F:/phantomjs/phantomjs/phantomjs.exe F:/js/parser.js "+url);
InputStream in = runtime.getInputStream();
//后面的代码省略,得到了InputStream就好说了
}
  这样就可以在java端获取解析后的html页面,而不用像WebDriver中的Thread.sleep()这样不确定的代码来获取可能的代码。有一点需要说明:phantomjs端的js代码一定不能有语法错误,否则如果js代码编译不一样,java端会一直等待,不会抛出异常。而且,在使用phantomjs.exe时,java端每次都要启动一个phantomjs进程,耗费大量时间。但至少,结果是稳定的。当然,我最终没有使用phantomjs。我直接下载了数据,但是没有抓取整个页面,主要是速度问题。(其实我不敢用phantomjs,因为我对phantomjs不熟悉,所以谨慎使用)。
  折腾了几天,虽然我的问题没有解决,但是也长了不少见识。后面的工作熟悉phantomjs,看看速度能不能提高。如果能打破速度框架,以后去网页的时候就方便了。同样,它是 Nutch 框架。我很欣赏使用它时的便利性。后期需要研究如何优化Nutch on Hadoop的爬取速度。另外,Nutch原有的功能不会爬行。动态生成的页面内容,不过你可以用Nutch和WebDirver结合起来,也许爬取的结果是稳定的,哈哈,这些只是想法,不试试怎么知道呢?
  如果大家对使用WebDriver辅助爬虫得到的结果的稳定性有什么想说的,欢迎大家讨论,因为我确实没有找到稳定结果的相关资料。 查看全部

  php多线程抓取网页(中国最强搜索引擎--百度上面行走了好长,我要想骂人了)
  最近在做一个项目,有一个需求:要从网页中抓取数据,要求是先抓取整个网页的html源代码(用于后期更新)。一开始看到这个简单,然后就稀里糊涂的打了代码(之前用Hadoop平台的分布式爬虫框架Nutch,用起来很方便,但最后因为速度放弃了,但是统计生成用于后续爬取),很快就成功下载了holder.html和finance.html页面,然后在解析holder.html页面后,解析finance.html,然后郁闷的找不到自己需要的在这个页面中的数据不在html源代码中。去浏览器查看源码确实是这样。源代码中确实没有我需要的数据。
  在号称中国最强搜索引擎——百度上走了很久,发现大部分人都在用WebDriver和HttpUnit(其实前者已经收录了后者)。我很高兴,终于找到了解决方案。. 兴奋地使用WebDriver,我想骂人。
  
  以下是对WebDriver的投诉
  WebDriver 是一个测试框架。本来不是为爬虫服务的,但我想说的是:星盘只是有点短,你不能更进一步吗?为什么网上那么多人推荐WebDriver?我觉得这些人并没有从现实出发,甚至有人说WebDriver可以解析完成的页面,返回给想要爬取整个页面(包括动态生成的内容)的人。是的,WebDriver可以完成这个任务,但是看关于作者写的代码,我想说的是:哥们,你的代码限制太多了,解析你写的js代码,js代码很简单,所以当然WebDriver 可以毫无压力地完成任务。WebDriver 对动态内容的分析依赖于 js 代码的复杂性和多样性。
  什么是复杂度?
  先贴一段代码
  WebDriver driver = newInternetExplorerDriver ();
HtmlPage page = driver.get(url);
System.out.println(page.asXml());
  这段代码的意思是大家都明白了。上面使用的IE内核,当然是FirefoxDriver、ChromeDriver、HtmlUnitDriver,这些驱动的使用原理都是一样的,先打开浏览器(这个需要时间),然后加载url并完成动态分析,然后通过page。 asXml() 可以得到完整的html页面,其中HtmlUnitDriver模拟无界面浏览器,java有引擎rhino执行js,HtmlUnitDriver使用rhino解析js,因为它不会启动有界面的浏览器,所以HtmlUnitDriver的速度比前三个都快。不管是什么Driver,都难免要解析js,这需要时间,而且对于没有使用的内核,js的支持程序也不同。例如,HtmlUnitDriver 对带有滚动的 js 代码的支持很差,并且在执行过程中会报错。(亲身体验)。js代码的复杂含义是不同内核支持的js并不完全一样。这个要根据具体情况来确定。好久没研究js了,就不讲各个核心对js的支持了。
  什么是多样性
  前面说过,浏览器解析js需要时间。对于只嵌入少量js代码的页面,通过page.asXml()获取完整页面是没有问题的。但是对于嵌入了大量js代码的页面,解析js需要花费大量的时间(对于jvm),那么大部分时候通过page.asXml()获取的页面并不收录动态生成的内容。问题是,为什么说WebDriver可以获取收录动态内容的html页面呢?网上有人说在driver.get(url)之后,当前线程需要等待一段时间才能获取完成的页面,类似于下面的形式
  WebDriver driver = new InternetExplorerDriver();
HtmlPage page = dirver.get(url);
Thread.sleep(2000);
System.output.println(page.asXml());
  我按照这个想法尝试了以下,是的,确实有可能。但问题不就在那里吗?如何确定等待时间?类似于数据挖掘中使用的经验方法来确定阈值?,或者尽可能长。我觉得这些都不是很好的方法,时间成本也比较高。只是觉得驱动应该可以在js的解析完成后捕捉到状态,于是搜索,搜索,但是根本没有这样的方法,所以我说为什么WebDriver的设计者没有采取措施forward 以便我们可以在程序中获取解析js后驱动的状态。在这种情况下,没有必要使用像Thread.sleep(2000)这样的不确定代码,可惜我找不到它。真的让我感到难过。字段。FirefoxDriver,ChromeDriver,HtmlUnitDriver 也有同样的问题。可以说使用WebDriver辅助爬取动态生成的网页得到的结果是非常不稳定的。我对此有深刻的理解。使用IEDriver时,同一个页面两次爬取的结果会不一样,有时甚至IE直接挂掉。你敢在爬虫程序中使用这种东西吗?我不敢。
  另外,有人推荐使用HttpUnit。其实WebDirver中的HtmlUnitDriver内部使用的是httpUnit,所以在使用HttpUnit的时候也会遇到同样的问题。我也做过一个实验,确实是这样。通过Thread.sleep(2000))等待js解析完成,我觉得不可取,不确定性太大,尤其是大型爬虫工作。
  综上所述,WebDriver 是一个为测试而设计的框架。虽然理论上可以用来辅助爬虫获取动态内容的html页面,但在实际应用中并没有使用,不确定性太大。稳定性太差,速度太慢。让我们让框架发挥最大的作用。不要损害他们的优势。
  我的工作还没有完成,所以我需要想办法上网。这次找到了一个稳定且确定性很强的辅助工具——phantomjs。我还没有完全理解这件事。但是已经用它来实现我想要的功能了。在java中,通过runtime.exec(arg)调用phantomjs来获取解析js后的页面。我会发布代码
  phantomjs端要执行的代码
  system = require(\'system\')
address = system.args[1];//获得命令行第二个参数 接下来会用到
//console.log(\'Loading a web page\');
var page = require(\'webpage\').create();
var url = address;
//console.log(url);
page.open(url, function (status) {
//Page is loaded!
if (status !== \'success\') {
console.log(\'Unable to post!\');
} else {
//此处的打印,是将结果一流的形式output到java中,java通过InputStream可以获取该输出内容
console.log(page.content);
}
phantom.exit();
});
  在java端执行的代码
  public void getParseredHtml(){
String url = "www.bai.com";
Runtime runtime = Runtime.getRuntime();
runtime.exec("F:/phantomjs/phantomjs/phantomjs.exe F:/js/parser.js "+url);
InputStream in = runtime.getInputStream();
//后面的代码省略,得到了InputStream就好说了
}
  这样就可以在java端获取解析后的html页面,而不用像WebDriver中的Thread.sleep()这样不确定的代码来获取可能的代码。有一点需要说明:phantomjs端的js代码一定不能有语法错误,否则如果js代码编译不一样,java端会一直等待,不会抛出异常。而且,在使用phantomjs.exe时,java端每次都要启动一个phantomjs进程,耗费大量时间。但至少,结果是稳定的。当然,我最终没有使用phantomjs。我直接下载了数据,但是没有抓取整个页面,主要是速度问题。(其实我不敢用phantomjs,因为我对phantomjs不熟悉,所以谨慎使用)。
  折腾了几天,虽然我的问题没有解决,但是也长了不少见识。后面的工作熟悉phantomjs,看看速度能不能提高。如果能打破速度框架,以后去网页的时候就方便了。同样,它是 Nutch 框架。我很欣赏使用它时的便利性。后期需要研究如何优化Nutch on Hadoop的爬取速度。另外,Nutch原有的功能不会爬行。动态生成的页面内容,不过你可以用Nutch和WebDirver结合起来,也许爬取的结果是稳定的,哈哈,这些只是想法,不试试怎么知道呢?
  如果大家对使用WebDriver辅助爬虫得到的结果的稳定性有什么想说的,欢迎大家讨论,因为我确实没有找到稳定结果的相关资料。

php多线程抓取网页( hebedichPHP利用Curl实现并发多线程下载文件以上就是)

网站优化优采云 发表了文章 • 0 个评论 • 74 次浏览 • 2021-12-15 02:05 • 来自相关话题

  php多线程抓取网页(
hebedichPHP利用Curl实现并发多线程下载文件以上就是)
  PHP结合curl实现多线程爬取
  更新时间:2015-07-09 11:09:13 投稿:hebedich
  PHP可以使用Curl来完成各种文件传输操作,比如模拟浏览器发送GET、POST请求等,但是由于PHP语言本身不支持多线程,开发爬虫程序的效率不高,所以经常需要使用 Curl Multi Functions。实现多线程并发访问多个URL地址的函数,实现多线程并发抓取网页或下载文件
  PHP结合curl实现多线程爬取
  让我们再看几个例子
  (1)下面这段代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  
$urls = array(
'https://www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
); // 设置要抓取的页面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)下面的代码和上面的意思一样,只不过这个地方先把获取的代码放入变量中,然后将获取的内容写入指定的文件
  
$urls = array(
'https://www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
);
$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 Functions实现文件的并发多线程下载
  
$urls=array(
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/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(
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/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多线程抓取网页(
hebedichPHP利用Curl实现并发多线程下载文件以上就是)
  PHP结合curl实现多线程爬取
  更新时间:2015-07-09 11:09:13 投稿:hebedich
  PHP可以使用Curl来完成各种文件传输操作,比如模拟浏览器发送GET、POST请求等,但是由于PHP语言本身不支持多线程,开发爬虫程序的效率不高,所以经常需要使用 Curl Multi Functions。实现多线程并发访问多个URL地址的函数,实现多线程并发抓取网页或下载文件
  PHP结合curl实现多线程爬取
  让我们再看几个例子
  (1)下面这段代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  
$urls = array(
'https://www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
); // 设置要抓取的页面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)下面的代码和上面的意思一样,只不过这个地方先把获取的代码放入变量中,然后将获取的内容写入指定的文件
  
$urls = array(
'https://www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
);
$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 Functions实现文件的并发多线程下载
  
$urls=array(
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/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(
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/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多线程抓取网页(Python多线程爬虫扫描器介绍)

网站优化优采云 发表了文章 • 0 个评论 • 48 次浏览 • 2021-12-10 14:05 • 来自相关话题

  php多线程抓取网页(Python多线程爬虫扫描器介绍)
  Python多线程爬虫扫描程序
  一、Python多线程扫描程序简介
  对于小白来说,这里介绍的扫描仪不是条形码扫描仪
  事实上,多线程扫描程序是Python爬虫程序之一。它可以自动检测安全漏洞,如远程服务器和网站、弱密码、扫描IP、文件、端口和目录的python程序。它能快速准确地发现扫描目标的漏洞,为深入入侵安全检测打下基础。
  
  Python多线程爬虫相关知识也是Python黑客学习渗透技术所必需的
  例如,python黑客工具具有以下功能:
  1.扫描站点漏洞、特洛伊木马和危险程序
  2.扫描对比文件的差异,并监控网站文件
  3.检测网页状态代码(200、403、404、500==)
  4.检查网站是否存在搜索引擎优化欺骗[为用户和搜索引擎返回不同的结果]
  5.网站150个虚拟主机空间连接,例如压力测试中的IIS连接
  6.模拟搜索引擎蜘蛛抓取美国用户代理用户代理
  7.网站程序和版本确认,网站后台扫描
  8.扫描端口等,玩蛇网游戏
  二、黑客多线程扫描仪的功能
  在本次播放snake Python home的图形和视频教程中,Python scanner要实现的简单功能包括:
  1.多线程扫描(更快)
  2.模拟搜索引擎爬虫(用户代理)
  3.使用代理服务器(大量代理IP交换和获取)
  4.扫描状态代码、文件目录等
  5.过滤不必要的文件或目录等
  6.您可以手动更改与扫描匹配的词典
  7.它可以制成一个带有图形界面的黑客工具
  如下图所示:(本教程为终端版本,未来将推出相应的GUI版本)
  
  三、测试多线程爬虫环境的构造
  1.linux\Mac OS X\windows
  2.编辑器IDE,python2.x/python3.x
  3.构建一个开放源代码的web程序或博客程序进行本地测试(play snake教程环境:apache2+PHP5+WordPress)
  4.获取匹配列表字典、目录或漏洞文件字典(WordPress、zblog、Dedecms等)
  5.确保本地网络和扫描服务器之间的连接和稳定性
  6.注意:建议在本地构建测试环境。请勿扫描网络上的其他网站和服务器。这是违法的
  声明:本视频教程仅用于Python学习和测试,不应用于非法方式和行为
  一切后果自负。玩蛇网与斯巴达无关
  四、黑客工具实用代码案例分析
  
# -*- coding:utf-8 -*-
__author__="iplaypython.com"
import os
import urllib2
import threading
import Queue
import time
import random
q = Queue.Queue() # Queue产生一个队列,有3种类型队列 默认用 FIFO队列
threading_num = 5 # 开启5个线程
# 扫描本地IP或域名
domain_name = "http://127.0.0.1"
# 百度蜘蛛UA
Baidu_spider = "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
# 不需要的文件过滤列表
exclude_list = ['.jpg', '.gif', '.css', '.png', '.js', '.scss']
proxy_list = [ # 代理服务器,可能已经失效,换为自己的
{'http': '117.28.254.130:8080'},
{'http': '118.144.177.254:3128'},
{'http': '113.118.211.152:9797'},
]
# 打开字典文件,开始过滤不需要的文件路径
with open("/home/leo/app_txt/wordpress.txt" , "r") as lines:
for line in lines:
line = line.rstrip()
if os.path.splitext(line)[1] not in exclude_list:
q.put(line) #将line传入到队列 q 中
# 扫描器方法
def crawler():
while not q.empty(): # 循环
path = q.get() 将line从队列 q 中取出来
url = "%s%s" % (domain_name, path) # 组合url地址,用于下一步提交
random_proxy = random.choice(proxy_list) # 随机使用一个代理服务器
proxy_support = urllib2.ProxyHandler(random_proxy)
opener = urllib2.build_opener(proxy_support)
urllib2.install_opener(opener)
headers = {}
headers['User-Agent'] = Baidu_spider # 蜘蛛的头部信息
# 玩蛇网 www.iplaypy.com
request = urllib2.Request(url, headers=headers)
try:
response = urllib2.urlopen(request)
content = response.read()
if len(content): # 内容不为空的情况下返回状态码、路径
print "Status [%s] - path: %s" % (response.code, path)
response.close()
time.sleep(1) # 休息一会儿,防止速度过快连接数过大被封掉IP
except urllib2.HTTPError as e:
# print e.code, path
pass # 异常处理,先暂时pass掉
if __name__ == '__main__':
# 创建多线程并指明函数的入口为crawler,以后还可以传参进去
for i in range(threading_num):
t = threading.Thread(target=crawler)
t.start()
  #在上面的代码中,我们总共导入了6个模块,这些模块都是下一步要使用的功能模块
  #操作系统用于过滤我们不需要扫描的后缀文件
  #Urlib2负责抓取,线程是我们的Python多线程模块
  #这次还需要一个线程安全的队列模块Queue
  #另外两个相对简单。一个是随机模块,另一个是时间模块
  五、下载与本文相关的资源
  
  黑客工具\uPython多线程爬虫抓取扫描仪Python完整源代码下载:
  本地高速下载:爬虫扫描程序rar
  源代码大小:1.6KB
  Python多线程爬虫抓取扫描程序
  这是pyhton多线程扫描仪视频课程的内容页,稍后将更新
  提供课程相关资源和python源代码下载,以及详细的图形教程使用
  黑客工具,黑客扫描仪,端口扫描,免费网页网站扫描仪
  百度在线硬盘下载地址:
  由于视频教程持续约50分钟,因此视频分两部分发送
  Python多线程爬虫抓取扫描程序-上一节
  Python多线程爬虫抓取扫描程序-下一节
  任何问题和建议都可以留在评论区供讨论
  [视频播放密码]:qqun20419428 查看全部

  php多线程抓取网页(Python多线程爬虫扫描器介绍)
  Python多线程爬虫扫描程序
  一、Python多线程扫描程序简介
  对于小白来说,这里介绍的扫描仪不是条形码扫描仪
  事实上,多线程扫描程序是Python爬虫程序之一。它可以自动检测安全漏洞,如远程服务器和网站、弱密码、扫描IP、文件、端口和目录的python程序。它能快速准确地发现扫描目标的漏洞,为深入入侵安全检测打下基础。
  
  Python多线程爬虫相关知识也是Python黑客学习渗透技术所必需的
  例如,python黑客工具具有以下功能:
  1.扫描站点漏洞、特洛伊木马和危险程序
  2.扫描对比文件的差异,并监控网站文件
  3.检测网页状态代码(200、403、404、500==)
  4.检查网站是否存在搜索引擎优化欺骗[为用户和搜索引擎返回不同的结果]
  5.网站150个虚拟主机空间连接,例如压力测试中的IIS连接
  6.模拟搜索引擎蜘蛛抓取美国用户代理用户代理
  7.网站程序和版本确认,网站后台扫描
  8.扫描端口等,玩蛇网游戏
  二、黑客多线程扫描仪的功能
  在本次播放snake Python home的图形和视频教程中,Python scanner要实现的简单功能包括:
  1.多线程扫描(更快)
  2.模拟搜索引擎爬虫(用户代理)
  3.使用代理服务器(大量代理IP交换和获取)
  4.扫描状态代码、文件目录等
  5.过滤不必要的文件或目录等
  6.您可以手动更改与扫描匹配的词典
  7.它可以制成一个带有图形界面的黑客工具
  如下图所示:(本教程为终端版本,未来将推出相应的GUI版本)
  
  三、测试多线程爬虫环境的构造
  1.linux\Mac OS X\windows
  2.编辑器IDE,python2.x/python3.x
  3.构建一个开放源代码的web程序或博客程序进行本地测试(play snake教程环境:apache2+PHP5+WordPress)
  4.获取匹配列表字典、目录或漏洞文件字典(WordPress、zblog、Dedecms等)
  5.确保本地网络和扫描服务器之间的连接和稳定性
  6.注意:建议在本地构建测试环境。请勿扫描网络上的其他网站和服务器。这是违法的
  声明:本视频教程仅用于Python学习和测试,不应用于非法方式和行为
  一切后果自负。玩蛇网与斯巴达无关
  四、黑客工具实用代码案例分析
  
# -*- coding:utf-8 -*-
__author__="iplaypython.com"
import os
import urllib2
import threading
import Queue
import time
import random
q = Queue.Queue() # Queue产生一个队列,有3种类型队列 默认用 FIFO队列
threading_num = 5 # 开启5个线程
# 扫描本地IP或域名
domain_name = "http://127.0.0.1"
# 百度蜘蛛UA
Baidu_spider = "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
# 不需要的文件过滤列表
exclude_list = ['.jpg', '.gif', '.css', '.png', '.js', '.scss']
proxy_list = [ # 代理服务器,可能已经失效,换为自己的
{'http': '117.28.254.130:8080'},
{'http': '118.144.177.254:3128'},
{'http': '113.118.211.152:9797'},
]
# 打开字典文件,开始过滤不需要的文件路径
with open("/home/leo/app_txt/wordpress.txt" , "r") as lines:
for line in lines:
line = line.rstrip()
if os.path.splitext(line)[1] not in exclude_list:
q.put(line) #将line传入到队列 q 中
# 扫描器方法
def crawler():
while not q.empty(): # 循环
path = q.get() 将line从队列 q 中取出来
url = "%s%s" % (domain_name, path) # 组合url地址,用于下一步提交
random_proxy = random.choice(proxy_list) # 随机使用一个代理服务器
proxy_support = urllib2.ProxyHandler(random_proxy)
opener = urllib2.build_opener(proxy_support)
urllib2.install_opener(opener)
headers = {}
headers['User-Agent'] = Baidu_spider # 蜘蛛的头部信息
# 玩蛇网 www.iplaypy.com
request = urllib2.Request(url, headers=headers)
try:
response = urllib2.urlopen(request)
content = response.read()
if len(content): # 内容不为空的情况下返回状态码、路径
print "Status [%s] - path: %s" % (response.code, path)
response.close()
time.sleep(1) # 休息一会儿,防止速度过快连接数过大被封掉IP
except urllib2.HTTPError as e:
# print e.code, path
pass # 异常处理,先暂时pass掉
if __name__ == '__main__':
# 创建多线程并指明函数的入口为crawler,以后还可以传参进去
for i in range(threading_num):
t = threading.Thread(target=crawler)
t.start()
  #在上面的代码中,我们总共导入了6个模块,这些模块都是下一步要使用的功能模块
  #操作系统用于过滤我们不需要扫描的后缀文件
  #Urlib2负责抓取,线程是我们的Python多线程模块
  #这次还需要一个线程安全的队列模块Queue
  #另外两个相对简单。一个是随机模块,另一个是时间模块
  五、下载与本文相关的资源
  
  黑客工具\uPython多线程爬虫抓取扫描仪Python完整源代码下载:
  本地高速下载:爬虫扫描程序rar
  源代码大小:1.6KB
  Python多线程爬虫抓取扫描程序
  这是pyhton多线程扫描仪视频课程的内容页,稍后将更新
  提供课程相关资源和python源代码下载,以及详细的图形教程使用
  黑客工具,黑客扫描仪,端口扫描,免费网页网站扫描仪
  百度在线硬盘下载地址:
  由于视频教程持续约50分钟,因此视频分两部分发送
  Python多线程爬虫抓取扫描程序-上一节
  Python多线程爬虫抓取扫描程序-下一节
  任何问题和建议都可以留在评论区供讨论
  [视频播放密码]:qqun20419428

php多线程抓取网页(批量调用过程如下:一系列数量很大数据(一)_官方手册)

网站优化优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2021-12-09 00:19 • 来自相关话题

  php多线程抓取网页(批量调用过程如下:一系列数量很大数据(一)_官方手册)
  从哪儿开始:
  一系列数据量大、不热、希望被大量蜘蛛爬取的页面,在爬虫高峰期会有非常高的响应时间。
  前辈做过这样的事情:将页面分成3个块,提供3个内部接口,入口文件使用curl_multi_*系列函数抓取3个内部接口的内容,放在一起成为一个页面。
  怀疑这可能会影响性能。
  是通过学习来分析的。
  看了php官方手册,批量调用过程总结如下:
  curl_multi_init—返回一个新的 curl 批处理句柄作为 curl_init 生成的单个 curl 句柄的容器
  curl_multi_add_handle - 向 curl 批处理会话添加单个 curl 句柄。
  curl_multi_exec—运行当前cURL句柄的子连接,curl_multi_select()的值
  curl_multi_select—等待 curl 批处理中的所有活动连接
  curl_multi_getcontent——如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出文本流
  curl_multi_remove_handle—删除curl批处理句柄资源中的句柄资源
  curl_multi_close—关闭一组 cURL 句柄
  取PHP官网的示例代码:
  疑惑和想法:
  1.批量请求的原理
  PHP没有多线程,是通过操作系统的多线程来实现的(看网上)
  2. 批量请求是基于操作系统的多线程机制,理论上会消耗大量机器的cpu
  一种。开发机上验证,大批量请求时cpu调用确实会急剧上升
  湾 对比线上前端机的负载情况和页面响应时间加长的时间点,发现线上前端机的负载并没有明显增加(维持在0.3左右)
  C。我在网上看到有人curl_multi_select()的返回值不是-1时(表示一个请求没有被处理过) usleep(100), sleep 避免不读取处理状态造成不必要的cpu​​压力.
  注意:
  2中的a和b存在矛盾,目前还没有找到根本原因
  2中的c没有实际测试过
  欢迎广大读者批评指正
  作者:小帅将军 查看全部

  php多线程抓取网页(批量调用过程如下:一系列数量很大数据(一)_官方手册)
  从哪儿开始:
  一系列数据量大、不热、希望被大量蜘蛛爬取的页面,在爬虫高峰期会有非常高的响应时间。
  前辈做过这样的事情:将页面分成3个块,提供3个内部接口,入口文件使用curl_multi_*系列函数抓取3个内部接口的内容,放在一起成为一个页面。
  怀疑这可能会影响性能。
  是通过学习来分析的。
  看了php官方手册,批量调用过程总结如下:
  curl_multi_init—返回一个新的 curl 批处理句柄作为 curl_init 生成的单个 curl 句柄的容器
  curl_multi_add_handle - 向 curl 批处理会话添加单个 curl 句柄。
  curl_multi_exec—运行当前cURL句柄的子连接,curl_multi_select()的值
  curl_multi_select—等待 curl 批处理中的所有活动连接
  curl_multi_getcontent——如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出文本流
  curl_multi_remove_handle—删除curl批处理句柄资源中的句柄资源
  curl_multi_close—关闭一组 cURL 句柄
  取PHP官网的示例代码:
  疑惑和想法:
  1.批量请求的原理
  PHP没有多线程,是通过操作系统的多线程来实现的(看网上)
  2. 批量请求是基于操作系统的多线程机制,理论上会消耗大量机器的cpu
  一种。开发机上验证,大批量请求时cpu调用确实会急剧上升
  湾 对比线上前端机的负载情况和页面响应时间加长的时间点,发现线上前端机的负载并没有明显增加(维持在0.3左右)
  C。我在网上看到有人curl_multi_select()的返回值不是-1时(表示一个请求没有被处理过) usleep(100), sleep 避免不读取处理状态造成不必要的cpu​​压力.
  注意:
  2中的a和b存在矛盾,目前还没有找到根本原因
  2中的c没有实际测试过
  欢迎广大读者批评指正
  作者:小帅将军

php多线程抓取网页(PHP5.3以上版本,使用pthreads抓取信息测试例子)

网站优化优采云 发表了文章 • 0 个评论 • 68 次浏览 • 2021-12-04 19:04 • 来自相关话题

  php多线程抓取网页(PHP5.3以上版本,使用pthreads抓取信息测试例子)
  只有在php5.3及以后的版本中才能真正使用多线程程序。以前是fake curl实现的多线程工作。给大家介绍几个多线程爬取的资料。测试例子,希望对大家有帮助。
  PHP 5.3 及以上,使用pthreads PHP扩展,可以让PHP真正支持多线程。多线程是处理重复的循环任务,可以大大缩短程序的执行时间。
  PHP 扩展下载:
  PHP 手册文档:
  1、Linux的扩展编译安装,编辑参数--enable-maintainer-zts为必选项:
  cd /Data/tgz/php-5.3.8
./configure --prefix=/Data/apps/php --with-config-file-path=/Data/apps/php/etc --with-mysql=/Data/apps/mysql --with-mysqli=/Data/apps/mysql/bin/mysql_config --with-iconv-dir --with-freetype-dir=/Data/apps/libs --with-jpeg-dir=/Data/apps/libs --with-png-dir=/Data/apps/libs --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt=/Data/apps/libs --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --enable-opcache --with-pdo-mysql --enable-maintainer-zts
make clean
make
make install

unzip pthreads-master.zip
cd pthreads-master
/Data/apps/php/bin/phpize
./configure --with-php-config=/Data/apps/php/bin/php-config
make
make install
  添加扩展:
  vi /Data/apps/php/etc/php.ini
  extension = "pthreads.so"
  一段PHP多线程的代码示例,以及For循环,抓取百度搜索页面,代码如下:
  以采集数据为例,代码如下:
  教程链接:
  欢迎转载~但请保留教程地址 查看全部

  php多线程抓取网页(PHP5.3以上版本,使用pthreads抓取信息测试例子)
  只有在php5.3及以后的版本中才能真正使用多线程程序。以前是fake curl实现的多线程工作。给大家介绍几个多线程爬取的资料。测试例子,希望对大家有帮助。
  PHP 5.3 及以上,使用pthreads PHP扩展,可以让PHP真正支持多线程。多线程是处理重复的循环任务,可以大大缩短程序的执行时间。
  PHP 扩展下载:
  PHP 手册文档:
  1、Linux的扩展编译安装,编辑参数--enable-maintainer-zts为必选项:
  cd /Data/tgz/php-5.3.8
./configure --prefix=/Data/apps/php --with-config-file-path=/Data/apps/php/etc --with-mysql=/Data/apps/mysql --with-mysqli=/Data/apps/mysql/bin/mysql_config --with-iconv-dir --with-freetype-dir=/Data/apps/libs --with-jpeg-dir=/Data/apps/libs --with-png-dir=/Data/apps/libs --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt=/Data/apps/libs --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --enable-opcache --with-pdo-mysql --enable-maintainer-zts
make clean
make
make install

unzip pthreads-master.zip
cd pthreads-master
/Data/apps/php/bin/phpize
./configure --with-php-config=/Data/apps/php/bin/php-config
make
make install
  添加扩展:
  vi /Data/apps/php/etc/php.ini
  extension = "pthreads.so"
  一段PHP多线程的代码示例,以及For循环,抓取百度搜索页面,代码如下:
  以采集数据为例,代码如下:
  教程链接:
  欢迎转载~但请保留教程地址

php多线程抓取网页(推荐手册:php完全自学手册(pthreads)(组图))

网站优化优采云 发表了文章 • 0 个评论 • 46 次浏览 • 2021-12-04 08:04 • 来自相关话题

  php多线程抓取网页(推荐手册:php完全自学手册(pthreads)(组图))
  php中可以实现多线程,是利用老的exec函数通过异步处理实现多线程的一种方式。exec 函数本身是一个执行外部程序的php 函数。下面我们来详细看看php多线程的实现。
  推荐手册:php完全自学手册
  
  我们先来看一个例子
  当执行上述操作时,甚至在耗时处理结束之前显示处理完成。
  exec("php static_massive.php > /dev/null &");
  由于 ">/dev/null&" 返回的值缺失,我们不会等待响应。
  因此,处理完成指示比耗时处理更快。
  但是,这种方法不知道耗时的过程何时结束。
  不要忘记考虑日志的执行、登录DB等方式将执行结果交付给用户。
  多线程方法(pthreads)
  最后介绍了PHP扩展模块pthreads的使用方法。
  它可以比使用exec的上述方法更简单。
  ①配置环境并安装php
  请使用 vagrant 准备自己喜欢的环境。
  php需要使用线程安全的版本,是多线程和安全的实现。
  从官方网站下载线程安全版本的 PHP。
  访问下面的内容并从图片中的红色框中下载。
  
  此外,对于线程安全安装,您需要使用配置选项指定 -enable-maintainer-zts。
  ./configure --enable-maintainer-zts
  根据需要,您还可以安装 Apache 和 mysql 的选项。
  使用以下命令确认 php 版本。
  php -v
  ②pthreads的安装
  让我们下载zip格式。
  解压zip,移动到解压文件,执行phpize。
  如果您在 PHP 模块列表上运行 pthreads,您可以执行以下操作。
  php -m
  根据环境的不同,此块的设置会有所不同。可以用环境名+pthreads等方式搜索信息。
  ③尝试使用多线程
  例子如下
  因为 sleep(5) 被调用两次,需要10秒,但实际上会是5秒。 查看全部

  php多线程抓取网页(推荐手册:php完全自学手册(pthreads)(组图))
  php中可以实现多线程,是利用老的exec函数通过异步处理实现多线程的一种方式。exec 函数本身是一个执行外部程序的php 函数。下面我们来详细看看php多线程的实现。
  推荐手册:php完全自学手册
  
  我们先来看一个例子
  当执行上述操作时,甚至在耗时处理结束之前显示处理完成。
  exec("php static_massive.php > /dev/null &");
  由于 ">/dev/null&" 返回的值缺失,我们不会等待响应。
  因此,处理完成指示比耗时处理更快。
  但是,这种方法不知道耗时的过程何时结束。
  不要忘记考虑日志的执行、登录DB等方式将执行结果交付给用户。
  多线程方法(pthreads)
  最后介绍了PHP扩展模块pthreads的使用方法。
  它可以比使用exec的上述方法更简单。
  ①配置环境并安装php
  请使用 vagrant 准备自己喜欢的环境。
  php需要使用线程安全的版本,是多线程和安全的实现。
  从官方网站下载线程安全版本的 PHP。
  访问下面的内容并从图片中的红色框中下载。
  
  此外,对于线程安全安装,您需要使用配置选项指定 -enable-maintainer-zts。
  ./configure --enable-maintainer-zts
  根据需要,您还可以安装 Apache 和 mysql 的选项。
  使用以下命令确认 php 版本。
  php -v
  ②pthreads的安装
  让我们下载zip格式。
  解压zip,移动到解压文件,执行phpize。
  如果您在 PHP 模块列表上运行 pthreads,您可以执行以下操作。
  php -m
  根据环境的不同,此块的设置会有所不同。可以用环境名+pthreads等方式搜索信息。
  ③尝试使用多线程
  例子如下
  因为 sleep(5) 被调用两次,需要10秒,但实际上会是5秒。

php多线程抓取网页( PHPCurlFunctions例子(一)-上海怡健医学)

网站优化优采云 发表了文章 • 0 个评论 • 68 次浏览 • 2021-11-26 12:13 • 来自相关话题

  php多线程抓取网页(
PHPCurlFunctions例子(一)-上海怡健医学)
  PHP结合curl实现多线程爬取
  PHP结合curl实现多线程爬取
  让我们再看几个例子
  (1)下面这段代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  
$urls = array(
'/',
'http://www.google.com/',
'http://www.example.com/'
); // 设置要抓取的页面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)下面的代码和上面的意思一样,只不过这个地方先把获取的代码放入变量中,然后将获取的内容写入指定的文件
  
$urls = array(
'/',
'http://www.google.com/',
'http://www.example.com/'
);
$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 Functions实现文件的并发多线程下载
  
$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多线程抓取网页(
PHPCurlFunctions例子(一)-上海怡健医学)
  PHP结合curl实现多线程爬取
  PHP结合curl实现多线程爬取
  让我们再看几个例子
  (1)下面这段代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  
$urls = array(
'/',
'http://www.google.com/',
'http://www.example.com/'
); // 设置要抓取的页面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)下面的代码和上面的意思一样,只不过这个地方先把获取的代码放入变量中,然后将获取的内容写入指定的文件
  
$urls = array(
'/',
'http://www.google.com/',
'http://www.example.com/'
);
$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 Functions实现文件的并发多线程下载
  
$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多线程抓取网页(PHP5.3以上版本,使用pthreads抓取信息测试例子)

网站优化优采云 发表了文章 • 0 个评论 • 54 次浏览 • 2021-11-26 12:11 • 来自相关话题

  php多线程抓取网页(PHP5.3以上版本,使用pthreads抓取信息测试例子)
  只有在php5.3及以后的版本中才能真正使用多线程程序。以前是fake curl实现的多线程工作。给大家介绍几个多线程爬取的资料。测试例子,希望对大家有帮助。
  PHP 5.3 及以上,使用pthreads PHP扩展,可以让PHP真正支持多线程。多线程是处理重复的循环任务,可以大大缩短程序的执行时间。
  PHP 扩展下载:
  PHP 手册文档:
  1、Linux的扩展编译安装,编辑参数--enable-maintainer-zts为必选项:
  cd /Data/tgz/php-5.3.8
./configure --prefix=/Data/apps/php --with-config-file-path=/Data/apps/php/etc --with-mysql=/Data/apps/mysql --with-mysqli=/Data/apps/mysql/bin/mysql_config --with-iconv-dir --with-freetype-dir=/Data/apps/libs --with-jpeg-dir=/Data/apps/libs --with-png-dir=/Data/apps/libs --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt=/Data/apps/libs --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --enable-opcache --with-pdo-mysql --enable-maintainer-zts
make clean
make
make install

unzip pthreads-master.zip
cd pthreads-master
/Data/apps/php/bin/phpize
./configure --with-php-config=/Data/apps/php/bin/php-config
make
make install
  添加扩展:
  vi /Data/apps/php/etc/php.ini
  extension = "pthreads.so"
  一段PHP多线程的代码示例,以及For循环,抓取百度搜索页面,代码如下:
  以采集数据为例,代码如下:
  教程链接:
  欢迎转载~但请保留教程地址 查看全部

  php多线程抓取网页(PHP5.3以上版本,使用pthreads抓取信息测试例子)
  只有在php5.3及以后的版本中才能真正使用多线程程序。以前是fake curl实现的多线程工作。给大家介绍几个多线程爬取的资料。测试例子,希望对大家有帮助。
  PHP 5.3 及以上,使用pthreads PHP扩展,可以让PHP真正支持多线程。多线程是处理重复的循环任务,可以大大缩短程序的执行时间。
  PHP 扩展下载:
  PHP 手册文档:
  1、Linux的扩展编译安装,编辑参数--enable-maintainer-zts为必选项:
  cd /Data/tgz/php-5.3.8
./configure --prefix=/Data/apps/php --with-config-file-path=/Data/apps/php/etc --with-mysql=/Data/apps/mysql --with-mysqli=/Data/apps/mysql/bin/mysql_config --with-iconv-dir --with-freetype-dir=/Data/apps/libs --with-jpeg-dir=/Data/apps/libs --with-png-dir=/Data/apps/libs --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt=/Data/apps/libs --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --enable-opcache --with-pdo-mysql --enable-maintainer-zts
make clean
make
make install

unzip pthreads-master.zip
cd pthreads-master
/Data/apps/php/bin/phpize
./configure --with-php-config=/Data/apps/php/bin/php-config
make
make install
  添加扩展:
  vi /Data/apps/php/etc/php.ini
  extension = "pthreads.so"
  一段PHP多线程的代码示例,以及For循环,抓取百度搜索页面,代码如下:
  以采集数据为例,代码如下:
  教程链接:
  欢迎转载~但请保留教程地址

php多线程抓取网页(PHP利用CurlFunctions实现并发多线程抓取网页或者下载文件操作)

网站优化优采云 发表了文章 • 0 个评论 • 54 次浏览 • 2021-11-23 14:23 • 来自相关话题

  php多线程抓取网页(PHP利用CurlFunctions实现并发多线程抓取网页或者下载文件操作)
  PHP可以使用Curl Functions完成各种文件传输操作,比如模拟浏览器发送GET、POST请求等,但是由于PHP语言本身不支持多线程,开发爬虫程序的效率不高,所以卷曲多功能是经常需要的。该功能可以实现多线程并发访问多个URL地址,实现多线程并发抓取网页或下载文件。具体实现过程请参考以下示例:
  (1)下面这段代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  <p>$urls = array( 'http://www.scutephp.com/', <br />'http://www.google.com/', <br />'http://www.example.com/' <br />); // 设置要抓取的页面URL <br />$save_to='/test.txt'; // 把抓取的代码写入该文件 <br />$st = fopen($save_to,"a"); <br />$mh = curl_multi_init(); <br />foreach ($urls as $i => $url) { <br />$conn[$i] = curl_init($url); <br />curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"); <br />curl_setopt($conn[$i], CURLOPT_HEADER ,0); <br />curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60); <br />curl_setopt($conn[$i], CURLOPT_FILE,$st); // 将爬取的代码写入文件 <br />curl_multi_add_handle ($mh,$conn[$i]); <br />} // 初始化 <br />do { <br />curl_multi_exec($mh,$active); <br />} while ($active); // 执行 <br />foreach ($urls as $i => $url) { <br />curl_multi_remove_handle($mh,$conn[$i]); <br />curl_close($conn[$i]); <br />} // 结束清理 <br />curl_multi_close($mh); <br />
  fclose($st);
  (2)下面的代码和上面的意思一样,只不过这个地方先把获取的代码放入变量中,然后将获取的内容写入指定的文件
  <p>$urls = array( 'http://www.scutephp.com/', <br />'http://www.google.com/', <br />'http://www.example.com/' <br />); <br />$save_to='/test.txt'; // 把抓取的代码写入该文件 <br />$st = fopen($save_to,"a"); <br />$mh = curl_multi_init(); <br />foreach ($urls as $i => $url) { <br />$conn[$i] = curl_init($url); <br />curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"); <br />curl_setopt($conn[$i], CURLOPT_HEADER ,0); <br />curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60); <br />curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,true); // 不将爬取代码写到浏览器,而是转化为字符串 <br />curl_multi_add_handle ($mh,$conn[$i]); <br />} <br />do { <br />curl_multi_exec($mh,$active); <br />} while ($active); <br />foreach ($urls as $i => $url) { <br />$data = curl_multi_getcontent($conn[$i]); // 获得爬取的代码字符串 <br />fwrite($st,$data); // 将字符串写入文件<br />} // 获得数据变量,并写入文件 <br />foreach ($urls as $i => $url) { <br />curl_multi_remove_handle($mh,$conn[$i]); <br />curl_close($conn[$i]); <br />}<br />curl_multi_close($mh); <br />
  fclose($st);
  (3) 下面一段代码实现了使用PHP的Curl Functions实现文件的并发多线程下载
  <p>$urls=array( 'http://www.scutephp.com/5w.zip',<br /> 'http://www.scutephp.com/5w.zip',<br /> 'http://www.scutephp.com/5w.zip'<br />);<br />$save_to='./home/';<br />$mh=curl_multi_init();<br />foreach($urls as $i=>$url){<br /> $g=$save_to.basename($url);<br /> if(!is_file($g)){<br /> $conn[$i]=curl_init($url);<br /> $fp[$i]=fopen($g,"w");<br /> curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");<br /> curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);<br /> curl_setopt($conn[$i],CURLOPT_HEADER ,0);<br /> curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);<br /> curl_multi_add_handle($mh,$conn[$i]);<br /> }<br />}<br />do{<br /> $n=curl_multi_exec($mh,$active);<br />}while($active);<br />foreach($urls as $i=>$url){<br /> curl_multi_remove_handle($mh,$conn[$i]);<br /> curl_close($conn[$i]);<br /> fclose($fp[$i]);<br />}<br />curl_multi_close($mh);$urls=array(<br /> 'http://www.scutephp.com/5w.zip',<br /> 'http://www.scutephp.com/5w.zip',<br /> 'http://www.scutephp.com/5w.zip'<br />);<br />$save_to='./home/';<br />$mh=curl_multi_init();<br />foreach($urls as $i=>$url){<br /> $g=$save_to.basename($url);<br /> if(!is_file($g)){<br /> $conn[$i]=curl_init($url);<br /> $fp[$i]=fopen($g,"w");<br /> curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");<br /> curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);<br /> curl_setopt($conn[$i],CURLOPT_HEADER ,0);<br /> curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);<br /> curl_multi_add_handle($mh,$conn[$i]);<br /> }<br />}<br />do{<br /> $n=curl_multi_exec($mh,$active);<br />}while($active);<br />foreach($urls as $i=>$url){<br /> curl_multi_remove_handle($mh,$conn[$i]);<br /> curl_close($conn[$i]);<br /> fclose($fp[$i]);<br />}<br />curl_multi_close($mh);</p>
  
  免责声明:本文原创发表于php中文网。转载请注明出处。感谢您的尊重!如果您有任何疑问,请与我们联系 查看全部

  php多线程抓取网页(PHP利用CurlFunctions实现并发多线程抓取网页或者下载文件操作)
  PHP可以使用Curl Functions完成各种文件传输操作,比如模拟浏览器发送GET、POST请求等,但是由于PHP语言本身不支持多线程,开发爬虫程序的效率不高,所以卷曲多功能是经常需要的。该功能可以实现多线程并发访问多个URL地址,实现多线程并发抓取网页或下载文件。具体实现过程请参考以下示例:
  (1)下面这段代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  <p>$urls = array( 'http://www.scutephp.com/', <br />'http://www.google.com/', <br />'http://www.example.com/' <br />); // 设置要抓取的页面URL <br />$save_to='/test.txt'; // 把抓取的代码写入该文件 <br />$st = fopen($save_to,"a"); <br />$mh = curl_multi_init(); <br />foreach ($urls as $i => $url) { <br />$conn[$i] = curl_init($url); <br />curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"); <br />curl_setopt($conn[$i], CURLOPT_HEADER ,0); <br />curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60); <br />curl_setopt($conn[$i], CURLOPT_FILE,$st); // 将爬取的代码写入文件 <br />curl_multi_add_handle ($mh,$conn[$i]); <br />} // 初始化 <br />do { <br />curl_multi_exec($mh,$active); <br />} while ($active); // 执行 <br />foreach ($urls as $i => $url) { <br />curl_multi_remove_handle($mh,$conn[$i]); <br />curl_close($conn[$i]); <br />} // 结束清理 <br />curl_multi_close($mh); <br />
  fclose($st);
  (2)下面的代码和上面的意思一样,只不过这个地方先把获取的代码放入变量中,然后将获取的内容写入指定的文件
  <p>$urls = array( 'http://www.scutephp.com/', <br />'http://www.google.com/', <br />'http://www.example.com/' <br />); <br />$save_to='/test.txt'; // 把抓取的代码写入该文件 <br />$st = fopen($save_to,"a"); <br />$mh = curl_multi_init(); <br />foreach ($urls as $i => $url) { <br />$conn[$i] = curl_init($url); <br />curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"); <br />curl_setopt($conn[$i], CURLOPT_HEADER ,0); <br />curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60); <br />curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,true); // 不将爬取代码写到浏览器,而是转化为字符串 <br />curl_multi_add_handle ($mh,$conn[$i]); <br />} <br />do { <br />curl_multi_exec($mh,$active); <br />} while ($active); <br />foreach ($urls as $i => $url) { <br />$data = curl_multi_getcontent($conn[$i]); // 获得爬取的代码字符串 <br />fwrite($st,$data); // 将字符串写入文件<br />} // 获得数据变量,并写入文件 <br />foreach ($urls as $i => $url) { <br />curl_multi_remove_handle($mh,$conn[$i]); <br />curl_close($conn[$i]); <br />}<br />curl_multi_close($mh); <br />
  fclose($st);
  (3) 下面一段代码实现了使用PHP的Curl Functions实现文件的并发多线程下载
  <p>$urls=array( 'http://www.scutephp.com/5w.zip',<br /> 'http://www.scutephp.com/5w.zip',<br /> 'http://www.scutephp.com/5w.zip'<br />);<br />$save_to='./home/';<br />$mh=curl_multi_init();<br />foreach($urls as $i=>$url){<br /> $g=$save_to.basename($url);<br /> if(!is_file($g)){<br /> $conn[$i]=curl_init($url);<br /> $fp[$i]=fopen($g,"w");<br /> curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");<br /> curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);<br /> curl_setopt($conn[$i],CURLOPT_HEADER ,0);<br /> curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);<br /> curl_multi_add_handle($mh,$conn[$i]);<br /> }<br />}<br />do{<br /> $n=curl_multi_exec($mh,$active);<br />}while($active);<br />foreach($urls as $i=>$url){<br /> curl_multi_remove_handle($mh,$conn[$i]);<br /> curl_close($conn[$i]);<br /> fclose($fp[$i]);<br />}<br />curl_multi_close($mh);$urls=array(<br /> 'http://www.scutephp.com/5w.zip',<br /> 'http://www.scutephp.com/5w.zip',<br /> 'http://www.scutephp.com/5w.zip'<br />);<br />$save_to='./home/';<br />$mh=curl_multi_init();<br />foreach($urls as $i=>$url){<br /> $g=$save_to.basename($url);<br /> if(!is_file($g)){<br /> $conn[$i]=curl_init($url);<br /> $fp[$i]=fopen($g,"w");<br /> curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");<br /> curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);<br /> curl_setopt($conn[$i],CURLOPT_HEADER ,0);<br /> curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);<br /> curl_multi_add_handle($mh,$conn[$i]);<br /> }<br />}<br />do{<br /> $n=curl_multi_exec($mh,$active);<br />}while($active);<br />foreach($urls as $i=>$url){<br /> curl_multi_remove_handle($mh,$conn[$i]);<br /> curl_close($conn[$i]);<br /> fclose($fp[$i]);<br />}<br />curl_multi_close($mh);</p>
  
  免责声明:本文原创发表于php中文网。转载请注明出处。感谢您的尊重!如果您有任何疑问,请与我们联系

php多线程抓取网页( PHPCurlFunctions例子(一)-上海怡健医学)

网站优化优采云 发表了文章 • 0 个评论 • 71 次浏览 • 2021-11-20 11:09 • 来自相关话题

  php多线程抓取网页(
PHPCurlFunctions例子(一)-上海怡健医学)
  PHP结合curl实现多线程爬取
  让我们再看几个例子
  (1)下面这段代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  
$urls = array(
'http://www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
); // 设置要抓取的页面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)下面的代码和上面的意思一样,只不过这个地方是先把获取到的代码放入变量中,再将获取到的内容写入指定文件
  
$urls = array(
'http://www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
);
$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 Functions实现文件的并发多线程下载
  
$urls=array(
'http://www.jb51.net/5w.zip',
'http://www.jb51.net/5w.zip',
'http://www.jb51.net/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(
'http://www.jb51.net/5w.zip',
'http://www.jb51.net/5w.zip',
'http://www.jb51.net/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多线程抓取网页(
PHPCurlFunctions例子(一)-上海怡健医学)
  PHP结合curl实现多线程爬取
  让我们再看几个例子
  (1)下面这段代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  
$urls = array(
'http://www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
); // 设置要抓取的页面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)下面的代码和上面的意思一样,只不过这个地方是先把获取到的代码放入变量中,再将获取到的内容写入指定文件
  
$urls = array(
'http://www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
);
$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 Functions实现文件的并发多线程下载
  
$urls=array(
'http://www.jb51.net/5w.zip',
'http://www.jb51.net/5w.zip',
'http://www.jb51.net/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(
'http://www.jb51.net/5w.zip',
'http://www.jb51.net/5w.zip',
'http://www.jb51.net/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多线程抓取网页(php多线程抓取网页程序:1.程序设计模式+反射+动态代理)

网站优化优采云 发表了文章 • 0 个评论 • 82 次浏览 • 2021-11-13 14:05 • 来自相关话题

  php多线程抓取网页(php多线程抓取网页程序:1.程序设计模式+反射+动态代理)
  php多线程抓取网页程序:1.程序设计模式+反射+动态代理+序列化+枚举2.搜索引擎结构化数据处理+html自动提取+格式化处理+json处理3.大数据可视化+函数式编程+smarty&jsonwrap+ifactory注释
  关于单线程,要使用windows下shell脚本,或者linux下kickstart脚本,还要知道对应的编程语言是什么,以及是怎么联系的。以下是一些个人经验。linux下面,最好使用kickstart编程语言。他拥有命令行操作的超级vim。不过他本身跟命令行编程也没什么关系,都是linux底层的东西。
  bash的话写些脚本可以这么玩。windows下面,常见的是php,java开发的thinkphp,以及eclipse之类的。然后可以学习linux内核来控制linux服务器。想要好玩,在线网页抓取?。
  单线程就用,多线程就是多线程实现呗,
  首先你要清楚你要在单线程还是多线程下编程。大多数语言都支持多线程编程,所以不用太担心线程的问题。最后,你至少需要掌握php,java这种语言才能开发出一个完整的php或java程序,才能明白如何使用单线程与多线程编程。个人觉得nodejs等不是很稳定的语言在解决编程上的问题上就不是很理想,而php则相对更好些。
  不过,如果你想做出功能比较强大的php或java程序,并且在编程时比较注重面向对象或函数式编程。那你可以考虑nodejs,其实现效率会比java或php好很多的。 查看全部

  php多线程抓取网页(php多线程抓取网页程序:1.程序设计模式+反射+动态代理)
  php多线程抓取网页程序:1.程序设计模式+反射+动态代理+序列化+枚举2.搜索引擎结构化数据处理+html自动提取+格式化处理+json处理3.大数据可视化+函数式编程+smarty&jsonwrap+ifactory注释
  关于单线程,要使用windows下shell脚本,或者linux下kickstart脚本,还要知道对应的编程语言是什么,以及是怎么联系的。以下是一些个人经验。linux下面,最好使用kickstart编程语言。他拥有命令行操作的超级vim。不过他本身跟命令行编程也没什么关系,都是linux底层的东西。
  bash的话写些脚本可以这么玩。windows下面,常见的是php,java开发的thinkphp,以及eclipse之类的。然后可以学习linux内核来控制linux服务器。想要好玩,在线网页抓取?。
  单线程就用,多线程就是多线程实现呗,
  首先你要清楚你要在单线程还是多线程下编程。大多数语言都支持多线程编程,所以不用太担心线程的问题。最后,你至少需要掌握php,java这种语言才能开发出一个完整的php或java程序,才能明白如何使用单线程与多线程编程。个人觉得nodejs等不是很稳定的语言在解决编程上的问题上就不是很理想,而php则相对更好些。
  不过,如果你想做出功能比较强大的php或java程序,并且在编程时比较注重面向对象或函数式编程。那你可以考虑nodejs,其实现效率会比java或php好很多的。

php多线程抓取网页( DOM树结构的解析资源地址保存到文件中的文件地址)

网站优化优采云 发表了文章 • 0 个评论 • 55 次浏览 • 2021-11-12 13:02 • 来自相关话题

  php多线程抓取网页(
DOM树结构的解析资源地址保存到文件中的文件地址)
  #解析首页
def CrawIndexPage(starturl):
print "正在爬取首页"
page = __getpage(starturl)
if page=="error":
return
page = page.decode(&#39;gbk&#39;, &#39;ignore&#39;)
tree = etree.HTML(page)
Nodes = tree.xpath("//p[@id=&#39;menu&#39;]//a")
print "首页解析出地址",len(Nodes),"条"
for node in Nodes:
CrawledURLs = []
CrawledURLs.append(starturl)
url=node.xpath("@href")[0]
if re.match(r&#39;/html/[A-Za-z0-9_/]+/index.html&#39;, url):
if __isexit(host + url,CrawledURLs):
pass
else:
try:
catalog = node.xpath("text()")[0].encode("utf-8")
newdir = "E:/电影资源/" + catalog
os.makedirs(newdir.decode("utf-8"))
print "创建分类目录成功------"+newdir
thread = myThread(host + url, newdir,CrawledURLs)
thread.start()
except:
pass
  在这个函数中,首先下载网页的源代码,通过XPath解析菜单分类信息。并创建相应的文件目录。一个需要注意的地方是编码问题,但是被这个编码纠缠了很久。通过查看网页源代码,我们可以发现网页的编码使用的是GB2312。这里,需要文本信息通过XPath 构造Tree 对象。解码操作,将gb2312改成Unicode编码,使DOM树结构正确,否则后面解析会出问题。
  ②分析各个品类的首页
  # 解析分类文件
def CrawListPage(indexurl,filedir,CrawledURLs):
print "正在解析分类主页资源"
print indexurl
page = __getpage(indexurl)
if page=="error":
return
CrawledURLs.append(indexurl)
page = page.decode(&#39;gbk&#39;, &#39;ignore&#39;)
tree = etree.HTML(page)
Nodes = tree.xpath("//p[@class=&#39;co_content8&#39;]//a")
for node in Nodes:
url=node.xpath("@href")[0]
if re.match(r&#39;/&#39;, url):
# 非分页地址 可以从中解析出视频资源地址
if __isexit(host + url,CrawledURLs):
pass
else:
#文件命名是不能出现以下特殊符号
filename=node.xpath("text()")[0].encode("utf-8").replace("/"," ")\
.replace("\\"," ")\
.replace(":"," ")\
.replace("*"," ")\
.replace("?"," ")\
.replace("\""," ")\
.replace("", " ")\
.replace("|", " ")
CrawlSourcePage(host + url,filedir,filename,CrawledURLs)
pass
else:
# 分页地址 从中嵌套再次解析
print "分页地址 从中嵌套再次解析",url
index = indexurl.rfind("/")
baseurl = indexurl[0:index + 1]
pageurl = baseurl + url
if __isexit(pageurl,CrawledURLs):
pass
else:
print "分页地址 从中嵌套再次解析", pageurl
CrawListPage(pageurl,filedir,CrawledURLs)
pass
pass
  打开每个分类的首页,你会发现都是一样的结构(点击打开例子)。首先解析收录资源 URL 的节点,然后提取名称和 URL。这部分有两点需要注意。一个是因为你想把资源保存在一个txt文件中,但是命名的时候有些特殊符号不能出现,所以需要处理掉。其次,必须处理分页。网站中的数据是以分页的形式显示的,所以如何识别和捕获分页也是很重要的。通过观察发现分页地址前面没有“/”,所以只需要通过正则表达式找出分页地址链接,然后嵌套调用就可以解决分页问题。
  ③解析资源地址并保存到文件中
  #处理资源页面 爬取资源地址
def CrawlSourcePage(url,filedir,filename,CrawledURLs):
print url
page = __getpage(url)
if page=="error":
return
CrawledURLs.append(url)
page = page.decode(&#39;gbk&#39;, &#39;ignore&#39;)
tree = etree.HTML(page)
Nodes = tree.xpath("//p[@align=&#39;left&#39;]//table//a")
try:
source = filedir + "/" + filename + ".txt"
f = open(source.decode("utf-8"), &#39;w&#39;)
for node in Nodes:
sourceurl = node.xpath("text()")[0]
f.write(sourceurl.encode("utf-8")+"\n")
f.close()
except:
print "!!!!!!!!!!!!!!!!!"
  这一段比较简单,把提取的内容写入文件
  为了提高程序的效率,采用了多线程爬取。这里我为每个分类首页都开了一个线程,大大加快了爬虫的效率。一开始只是用单线程跑,结果等了一下午,最后因为一个没有处理的异常跑掉了。!!!疲劳的
  class myThread (threading.Thread): #继承父类threading.Thread
def __init__(self, url, newdir,CrawledURLs):
threading.Thread.__init__(self)
self.url = url
self.newdir = newdir
self.CrawledURLs=CrawledURLs
def run(self): #把要执行的代码写到run函数里面 线程在创建后会直接运行run函数
CrawListPage(self.url, self.newdir,self.CrawledURLs)
  以上只是部分代码,所有代码都可以在GitHub上下载(点我跳转)
  最终的爬取结果如下。
  
  
  
  以上就是小编为大家使用Python多线程爬虫对电影天堂资源进行爬取的介绍。我希望它会对你有所帮助。如果您有任何问题,请给我留言。小编会及时回复您。非常感谢您对PHP中文网站的支持!
  更多Python多线程爬虫爬取电影天堂资源相关文章请关注PHP中文网!
  
  免责声明:本文原创发表于php中文网。转载请注明出处。感谢您的尊重!如果您有任何疑问,请与我们联系 查看全部

  php多线程抓取网页(
DOM树结构的解析资源地址保存到文件中的文件地址)
  #解析首页
def CrawIndexPage(starturl):
print "正在爬取首页"
page = __getpage(starturl)
if page=="error":
return
page = page.decode(&#39;gbk&#39;, &#39;ignore&#39;)
tree = etree.HTML(page)
Nodes = tree.xpath("//p[@id=&#39;menu&#39;]//a")
print "首页解析出地址",len(Nodes),"条"
for node in Nodes:
CrawledURLs = []
CrawledURLs.append(starturl)
url=node.xpath("@href")[0]
if re.match(r&#39;/html/[A-Za-z0-9_/]+/index.html&#39;, url):
if __isexit(host + url,CrawledURLs):
pass
else:
try:
catalog = node.xpath("text()")[0].encode("utf-8")
newdir = "E:/电影资源/" + catalog
os.makedirs(newdir.decode("utf-8"))
print "创建分类目录成功------"+newdir
thread = myThread(host + url, newdir,CrawledURLs)
thread.start()
except:
pass
  在这个函数中,首先下载网页的源代码,通过XPath解析菜单分类信息。并创建相应的文件目录。一个需要注意的地方是编码问题,但是被这个编码纠缠了很久。通过查看网页源代码,我们可以发现网页的编码使用的是GB2312。这里,需要文本信息通过XPath 构造Tree 对象。解码操作,将gb2312改成Unicode编码,使DOM树结构正确,否则后面解析会出问题。
  ②分析各个品类的首页
  # 解析分类文件
def CrawListPage(indexurl,filedir,CrawledURLs):
print "正在解析分类主页资源"
print indexurl
page = __getpage(indexurl)
if page=="error":
return
CrawledURLs.append(indexurl)
page = page.decode(&#39;gbk&#39;, &#39;ignore&#39;)
tree = etree.HTML(page)
Nodes = tree.xpath("//p[@class=&#39;co_content8&#39;]//a")
for node in Nodes:
url=node.xpath("@href")[0]
if re.match(r&#39;/&#39;, url):
# 非分页地址 可以从中解析出视频资源地址
if __isexit(host + url,CrawledURLs):
pass
else:
#文件命名是不能出现以下特殊符号
filename=node.xpath("text()")[0].encode("utf-8").replace("/"," ")\
.replace("\\"," ")\
.replace(":"," ")\
.replace("*"," ")\
.replace("?"," ")\
.replace("\""," ")\
.replace("", " ")\
.replace("|", " ")
CrawlSourcePage(host + url,filedir,filename,CrawledURLs)
pass
else:
# 分页地址 从中嵌套再次解析
print "分页地址 从中嵌套再次解析",url
index = indexurl.rfind("/")
baseurl = indexurl[0:index + 1]
pageurl = baseurl + url
if __isexit(pageurl,CrawledURLs):
pass
else:
print "分页地址 从中嵌套再次解析", pageurl
CrawListPage(pageurl,filedir,CrawledURLs)
pass
pass
  打开每个分类的首页,你会发现都是一样的结构(点击打开例子)。首先解析收录资源 URL 的节点,然后提取名称和 URL。这部分有两点需要注意。一个是因为你想把资源保存在一个txt文件中,但是命名的时候有些特殊符号不能出现,所以需要处理掉。其次,必须处理分页。网站中的数据是以分页的形式显示的,所以如何识别和捕获分页也是很重要的。通过观察发现分页地址前面没有“/”,所以只需要通过正则表达式找出分页地址链接,然后嵌套调用就可以解决分页问题。
  ③解析资源地址并保存到文件中
  #处理资源页面 爬取资源地址
def CrawlSourcePage(url,filedir,filename,CrawledURLs):
print url
page = __getpage(url)
if page=="error":
return
CrawledURLs.append(url)
page = page.decode(&#39;gbk&#39;, &#39;ignore&#39;)
tree = etree.HTML(page)
Nodes = tree.xpath("//p[@align=&#39;left&#39;]//table//a")
try:
source = filedir + "/" + filename + ".txt"
f = open(source.decode("utf-8"), &#39;w&#39;)
for node in Nodes:
sourceurl = node.xpath("text()")[0]
f.write(sourceurl.encode("utf-8")+"\n")
f.close()
except:
print "!!!!!!!!!!!!!!!!!"
  这一段比较简单,把提取的内容写入文件
  为了提高程序的效率,采用了多线程爬取。这里我为每个分类首页都开了一个线程,大大加快了爬虫的效率。一开始只是用单线程跑,结果等了一下午,最后因为一个没有处理的异常跑掉了。!!!疲劳的
  class myThread (threading.Thread): #继承父类threading.Thread
def __init__(self, url, newdir,CrawledURLs):
threading.Thread.__init__(self)
self.url = url
self.newdir = newdir
self.CrawledURLs=CrawledURLs
def run(self): #把要执行的代码写到run函数里面 线程在创建后会直接运行run函数
CrawListPage(self.url, self.newdir,self.CrawledURLs)
  以上只是部分代码,所有代码都可以在GitHub上下载(点我跳转)
  最终的爬取结果如下。
  
  
  
  以上就是小编为大家使用Python多线程爬虫对电影天堂资源进行爬取的介绍。我希望它会对你有所帮助。如果您有任何问题,请给我留言。小编会及时回复您。非常感谢您对PHP中文网站的支持!
  更多Python多线程爬虫爬取电影天堂资源相关文章请关注PHP中文网!
  
  免责声明:本文原创发表于php中文网。转载请注明出处。感谢您的尊重!如果您有任何疑问,请与我们联系

php多线程抓取网页(比较,结合实例形式详细分析了curl_init()和curl)

网站优化优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2021-11-11 19:11 • 来自相关话题

  php多线程抓取网页(比较,结合实例形式详细分析了curl_init()和curl)
  本文文章主要介绍php使用curl_init()和curl_multi_init()多线程的速度对比。结合示例形式,详细分析了 curl_init() 和 curl_multi_init() 的具体使用方法和相关效率对比。有需要的朋友可以参考
  本文介绍了 PHP 使用 curl_init() 和 curl_multi_init() 多线程的速度对比。分享给大家,供大家参考,如下:
  php中curl_init()的作用很棒,尤其是在爬取网页内容或者文件信息的时候。比如之前的文章《》介绍了curl_init()的强大。
  curl_init() 以单线程模式处理事情。如果需要使用多线程模式进行事务处理,那么php为我们提供了一个函数curl_multi_init(),就是多线程模式处理事务的功能。
  curl_init() 和 curl_multi_init() 速度对比
  curl_multi_init() 多线程可以提高网页的处理速度吗?今天我将通过实验来验证这个问题。
  我今天的测试很简单,就是抓取网页内容,连续抓取5次,分别使用curl_init()和curl_multi_init()函数来完成,记录下两者的耗时,将它们比较得出结论。
  首先,使用 curl_init() 在单个线程中抓取网页内容 5 次。
  程序代码如下:
  然后,使用 curl_multi_init() 多线程连续抓取网页内容 5 次。
  代码显示如下:
<p> 查看全部

  php多线程抓取网页(比较,结合实例形式详细分析了curl_init()和curl)
  本文文章主要介绍php使用curl_init()和curl_multi_init()多线程的速度对比。结合示例形式,详细分析了 curl_init() 和 curl_multi_init() 的具体使用方法和相关效率对比。有需要的朋友可以参考
  本文介绍了 PHP 使用 curl_init() 和 curl_multi_init() 多线程的速度对比。分享给大家,供大家参考,如下:
  php中curl_init()的作用很棒,尤其是在爬取网页内容或者文件信息的时候。比如之前的文章《》介绍了curl_init()的强大。
  curl_init() 以单线程模式处理事情。如果需要使用多线程模式进行事务处理,那么php为我们提供了一个函数curl_multi_init(),就是多线程模式处理事务的功能。
  curl_init() 和 curl_multi_init() 速度对比
  curl_multi_init() 多线程可以提高网页的处理速度吗?今天我将通过实验来验证这个问题。
  我今天的测试很简单,就是抓取网页内容,连续抓取5次,分别使用curl_init()和curl_multi_init()函数来完成,记录下两者的耗时,将它们比较得出结论。
  首先,使用 curl_init() 在单个线程中抓取网页内容 5 次。
  程序代码如下:
  然后,使用 curl_multi_init() 多线程连续抓取网页内容 5 次。
  代码显示如下:
<p>

php多线程抓取网页(PHP利用CurlFunctions实现并发多线程抓取网页或者下载文件操作 )

网站优化优采云 发表了文章 • 0 个评论 • 54 次浏览 • 2021-11-08 15:19 • 来自相关话题

  php多线程抓取网页(PHP利用CurlFunctions实现并发多线程抓取网页或者下载文件操作
)
  PHP可以使用Curl Functions来完成各种文件传输操作,比如模拟浏览器发送GET、POST请求等,但是由于PHP语言本身不支持多线程,开发爬虫程序的效率不高,所以经常需要卷曲多功能。该功能可以实现多线程并发访问多个URL地址,实现多线程并发抓取网页或下载文件。具体实现过程请参考以下示例:
  (1)下面这段代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  $urls = array(
&#39;http://www.lefts.cn/&#39;,
&#39;http://www.google.com/&#39;,
&#39;http://www.example.com/&#39;
); // 设置要抓取的页面URL
$save_to=&#39;/test.txt&#39;; // 把抓取的代码写入该文件
$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)下面的代码和上面的意思一样,只不过这个地方先把获取到的代码放入变量中,然后将获取到的内容写入指定文件
  (3)下面这段代码实现了使用PHP的Curl Functions实现文件的并发多线程下载
  $urls=array(
&#39;http://www.lefts.cn/5w.zip&#39;,
&#39;http://www.lefts.cn/5w.zip&#39;,
&#39;http://www.lefts.cn/5w.zip&#39;
);
$save_to=&#39;./home/&#39;;
$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(
&#39;http://www.lefts.cn/5w.zip&#39;,
&#39;http://www.lefts.cn/5w.zip&#39;,
&#39;http://www.lefts.cn/5w.zip&#39;
);
$save_to=&#39;./home/&#39;;
$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多线程抓取网页(PHP利用CurlFunctions实现并发多线程抓取网页或者下载文件操作
)
  PHP可以使用Curl Functions来完成各种文件传输操作,比如模拟浏览器发送GET、POST请求等,但是由于PHP语言本身不支持多线程,开发爬虫程序的效率不高,所以经常需要卷曲多功能。该功能可以实现多线程并发访问多个URL地址,实现多线程并发抓取网页或下载文件。具体实现过程请参考以下示例:
  (1)下面这段代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  $urls = array(
&#39;http://www.lefts.cn/&#39;,
&#39;http://www.google.com/&#39;,
&#39;http://www.example.com/&#39;
); // 设置要抓取的页面URL
$save_to=&#39;/test.txt&#39;; // 把抓取的代码写入该文件
$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)下面的代码和上面的意思一样,只不过这个地方先把获取到的代码放入变量中,然后将获取到的内容写入指定文件
  (3)下面这段代码实现了使用PHP的Curl Functions实现文件的并发多线程下载
  $urls=array(
&#39;http://www.lefts.cn/5w.zip&#39;,
&#39;http://www.lefts.cn/5w.zip&#39;,
&#39;http://www.lefts.cn/5w.zip&#39;
);
$save_to=&#39;./home/&#39;;
$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(
&#39;http://www.lefts.cn/5w.zip&#39;,
&#39;http://www.lefts.cn/5w.zip&#39;,
&#39;http://www.lefts.cn/5w.zip&#39;
);
$save_to=&#39;./home/&#39;;
$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多线程抓取网页( PHP中文网Functions例子(1)--代码的尊重)

网站优化优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2021-11-07 03:26 • 来自相关话题

  php多线程抓取网页(
PHP中文网Functions例子(1)--代码的尊重)
  PHP结合curl实现多线程爬取
  让我们再看几个例子
  (1)下面这段代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  $urls = array(
&#39;http://www.php.cn/&#39;,
&#39;http://www.google.com/&#39;,
&#39;http://www.example.com/&#39;
); // 设置要抓取的页面URL
$save_to=&#39;/test.txt&#39;; // 把抓取的代码写入该文件
$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)下面的代码和上面的意思一样,只不过这个地方是先把获取到的代码放入变量中,再将获取到的内容写入指定文件
  $urls = array(
&#39;http://www.php.cn/&#39;,
&#39;http://www.google.com/&#39;,
&#39;http://www.example.com/&#39;
);
$save_to=&#39;/test.txt&#39;; // 把抓取的代码写入该文件
$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 Functions实现文件的并发多线程下载
  $urls=array(
&#39;http://www.php.cn/5w.zip&#39;,
&#39;http://www.jb51.net/5w.zip&#39;,
&#39;http://www.jb51.net/5w.zip&#39;
);
$save_to=&#39;./home/&#39;;
$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(
&#39;http://www.php.cn/5w.zip&#39;,
&#39;http://www.php.cn/5w.zip&#39;,
&#39;http://www.php.cn/5w.zip&#39;
);
$save_to=&#39;./home/&#39;;
$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实现多线程爬取相关文章请关注PHP中文网!
  
  免责声明:本文原创发表于php中文网。转载请注明出处。感谢您的尊重!如果您有任何疑问,请与我们联系 查看全部

  php多线程抓取网页(
PHP中文网Functions例子(1)--代码的尊重)
  PHP结合curl实现多线程爬取
  让我们再看几个例子
  (1)下面这段代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  $urls = array(
&#39;http://www.php.cn/&#39;,
&#39;http://www.google.com/&#39;,
&#39;http://www.example.com/&#39;
); // 设置要抓取的页面URL
$save_to=&#39;/test.txt&#39;; // 把抓取的代码写入该文件
$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)下面的代码和上面的意思一样,只不过这个地方是先把获取到的代码放入变量中,再将获取到的内容写入指定文件
  $urls = array(
&#39;http://www.php.cn/&#39;,
&#39;http://www.google.com/&#39;,
&#39;http://www.example.com/&#39;
);
$save_to=&#39;/test.txt&#39;; // 把抓取的代码写入该文件
$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 Functions实现文件的并发多线程下载
  $urls=array(
&#39;http://www.php.cn/5w.zip&#39;,
&#39;http://www.jb51.net/5w.zip&#39;,
&#39;http://www.jb51.net/5w.zip&#39;
);
$save_to=&#39;./home/&#39;;
$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(
&#39;http://www.php.cn/5w.zip&#39;,
&#39;http://www.php.cn/5w.zip&#39;,
&#39;http://www.php.cn/5w.zip&#39;
);
$save_to=&#39;./home/&#39;;
$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实现多线程爬取相关文章请关注PHP中文网!
  
  免责声明:本文原创发表于php中文网。转载请注明出处。感谢您的尊重!如果您有任何疑问,请与我们联系

php多线程抓取网页(ip多线程变化,定位网站缓存区和log区,ip变化)

网站优化优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2021-10-29 16:02 • 来自相关话题

  php多线程抓取网页(ip多线程变化,定位网站缓存区和log区,ip变化)
  php多线程抓取网页得到wap和html代码
  我也刚刚入门,见过的抓包问题就是ip多线程变化,定位网站缓存区和log区,ip变化的话,可以尝试从127.0.0.1抓包,后台一定要留痕迹,比如抓取com的值
  打开终端输入如下命令:php--header-list=,抓取com的session,因为其它端口都是动态改变的
  我在安卓上也遇到这个问题,不知道你是在哪抓取的,
  不用修改原来的,php和http协议栈上,
  原来是没有封tcp协议通道导致请求异常
  看看封没封tcp
  看看底部那个缓存的拦截,那里没拦截的话就能在该域名返回时使用开发者工具抓包了。看下是不是没弄sessionfilename(一般会有)之类的,或者在url分发上没弄重点,
  发现wap页在抓取失败的情况下,无法生成请求到相应的html文件。试了好多方法还是不行。
  最新情况:1.将你这个wap链接通过114导出(所有的公开数据都可以导出)2.把最近出现的wap链接全都加上时间戳,用mongodb保存,这样就可以永久保存了3.插到wap开发者模式(首页的一个地方,在你的浏览器中,可以显示链接所有之前已经抓取到的数据),可以更新排名(在chrome中)4.使用公共http2开发的wap抓包工具(比如阿里妈妈抓包王之类的)进行抓包。用户体验应该是最好的。 查看全部

  php多线程抓取网页(ip多线程变化,定位网站缓存区和log区,ip变化)
  php多线程抓取网页得到wap和html代码
  我也刚刚入门,见过的抓包问题就是ip多线程变化,定位网站缓存区和log区,ip变化的话,可以尝试从127.0.0.1抓包,后台一定要留痕迹,比如抓取com的值
  打开终端输入如下命令:php--header-list=,抓取com的session,因为其它端口都是动态改变的
  我在安卓上也遇到这个问题,不知道你是在哪抓取的,
  不用修改原来的,php和http协议栈上,
  原来是没有封tcp协议通道导致请求异常
  看看封没封tcp
  看看底部那个缓存的拦截,那里没拦截的话就能在该域名返回时使用开发者工具抓包了。看下是不是没弄sessionfilename(一般会有)之类的,或者在url分发上没弄重点,
  发现wap页在抓取失败的情况下,无法生成请求到相应的html文件。试了好多方法还是不行。
  最新情况:1.将你这个wap链接通过114导出(所有的公开数据都可以导出)2.把最近出现的wap链接全都加上时间戳,用mongodb保存,这样就可以永久保存了3.插到wap开发者模式(首页的一个地方,在你的浏览器中,可以显示链接所有之前已经抓取到的数据),可以更新排名(在chrome中)4.使用公共http2开发的wap抓包工具(比如阿里妈妈抓包王之类的)进行抓包。用户体验应该是最好的。

php多线程抓取网页( 【每日一题】几个例子(1)代码)

网站优化优采云 发表了文章 • 0 个评论 • 76 次浏览 • 2021-10-28 17:09 • 来自相关话题

  php多线程抓取网页(
【每日一题】几个例子(1)代码)
  PHP结合curl实现多线程爬取
  让我们再看几个例子
  (1)下面的代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  
$urls = array(
'//www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
); // 设置要抓取的页面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)下面的代码和上面的意思一样,只不过这个地方先把获取到的代码放入变量中,然后将获取到的内容写入指定文件
  
$urls = array(
'//www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
);
$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(
'//www.jb51.net/5w.zip',
'//www.jb51.net/5w.zip',
'//www.jb51.net/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(
'//www.jb51.net/5w.zip',
'//www.jb51.net/5w.zip',
'//www.jb51.net/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多线程抓取网页(
【每日一题】几个例子(1)代码)
  PHP结合curl实现多线程爬取
  让我们再看几个例子
  (1)下面的代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  
$urls = array(
'//www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
); // 设置要抓取的页面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)下面的代码和上面的意思一样,只不过这个地方先把获取到的代码放入变量中,然后将获取到的内容写入指定文件
  
$urls = array(
'//www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
);
$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(
'//www.jb51.net/5w.zip',
'//www.jb51.net/5w.zip',
'//www.jb51.net/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(
'//www.jb51.net/5w.zip',
'//www.jb51.net/5w.zip',
'//www.jb51.net/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多线程抓取网页(本文实例讲述php使用pthreadsv3多线程实现抓取新浪新闻信息)

网站优化优采云 发表了文章 • 0 个评论 • 78 次浏览 • 2021-12-25 09:01 • 来自相关话题

  php多线程抓取网页(本文实例讲述php使用pthreadsv3多线程实现抓取新浪新闻信息)
  本文举例说明php如何使用pthreads v3多线程抓取新浪新闻信息。分享给大家,供大家参考,如下:
  我们使用pthreads编写了一个多线程页面爬取小程序,并将结果存入数据库。
  数据表的结构如下:
   CREATE TABLE `tb_sina` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `url` varchar(256) DEFAULT '' COMMENT 'url地址', `title` varchar(128) DEFAULT '' COMMENT '标题', `time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='sina新闻';
  代码如下:
   dsn = $dsn; $this->root = $root; $this->pwd = $pwd; } public function run() { //创建连接对象 self::$db = new PDO($this->dsn, $this->root, $this->pwd); //把require放到worker线程中,不要放到主线程中,不然会报错找不到类 require './vendor/autoload.php'; } //返回一个连接资源 public function getConn() { return self::$db; } } class Sina extends Thread { private $name; private $url; public function __construct($name, $url) { $this->name = $name; $this->url = $url; } public function run() { $db = $this->worker->getConn(); if (empty($db) || empty($this->url)) { return false; } $cOntent= file_get_contents($this->url); if (!empty($content)) { //获取标题,地址,时间 $data = QL\QueryList::Query($content, [ 'tit' => ['.c_tit > a', 'text'], 'url' => ['.c_tit > a', 'href'], 'time' => ['.c_time', 'text'], ], '', 'UTF-8', 'GB2312')->getData(); //把获取的数据插入数据库 if (!empty($data)) { $sql = 'INSERT INTO tb_sina(`url`, `title`, `time`) VALUES'; foreach ($data as $row) { //修改下时间,新浪的时间格式是这样的04-23 15:30 $time = date('Y') . '-' . $row['time'] . ':00'; $sql .= "('{$row['url']}', '{$row['tit']}', '{$time}'),"; } $sql = rtrim($sql, ','); $ret = $db->exec($sql); if ($ret !== false) { echo "线程{$this->name}成功插入{$ret}条数据\n"; } else { var_dump($db->errorInfo()); } } } } } //抓取页面地址 $url = 'http://roll.news.sina.com.cn/s/channel.php&#63;ch=01#col=89&spec=&type=&ch=01&k=&offset_page=0&offset_num=0&num=60&asc=&page='; //创建pool池 $pool = new Pool(5, 'DB', ['mysql:dbname=test;host=192.168.33.226', 'root', '']); //获取100个分页数据 for ($ix = 1; $ix submit(new Sina($ix, $url . $ix)); } //循环收集垃圾,阻塞主线程,等待子线程结束 while ($pool->collect()) ; $pool->shutdown();
  由于使用了QueryList,可以通过composer安装。
   composer require jaeger/querylist
  然而,安装的版本是3.2。我的php7.2下会有问题。由于each()已被弃用,因此修改了源代码,将each()替换为foreach。 ()够了。
  运行结果如下:
  
  数据也保存在数据库中
  
  当然,你也可以再次通过url获取具体的页面内容。这里不做演示,有兴趣的可以自己动手。
  更多对PHP相关内容感兴趣的读者可以查看本站专题:《PHP进程与线程操作技巧总结》、《PHP网络编程技巧总结》、《PHP基本语法介绍》、《 PHP数组(数组)操作技巧大全、php字符串使用总结、php+mysql数据库操作入门教程、php常用数据库操作技巧总结
  希望这篇文章能对你的 PHP 编程有所帮助。
  内容推荐:免费高清PNG素材下载 查看全部

  php多线程抓取网页(本文实例讲述php使用pthreadsv3多线程实现抓取新浪新闻信息)
  本文举例说明php如何使用pthreads v3多线程抓取新浪新闻信息。分享给大家,供大家参考,如下:
  我们使用pthreads编写了一个多线程页面爬取小程序,并将结果存入数据库。
  数据表的结构如下:
   CREATE TABLE `tb_sina` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `url` varchar(256) DEFAULT '' COMMENT 'url地址', `title` varchar(128) DEFAULT '' COMMENT '标题', `time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='sina新闻';
  代码如下:
   dsn = $dsn; $this->root = $root; $this->pwd = $pwd; } public function run() { //创建连接对象 self::$db = new PDO($this->dsn, $this->root, $this->pwd); //把require放到worker线程中,不要放到主线程中,不然会报错找不到类 require './vendor/autoload.php'; } //返回一个连接资源 public function getConn() { return self::$db; } } class Sina extends Thread { private $name; private $url; public function __construct($name, $url) { $this->name = $name; $this->url = $url; } public function run() { $db = $this->worker->getConn(); if (empty($db) || empty($this->url)) { return false; } $cOntent= file_get_contents($this->url); if (!empty($content)) { //获取标题,地址,时间 $data = QL\QueryList::Query($content, [ 'tit' => ['.c_tit > a', 'text'], 'url' => ['.c_tit > a', 'href'], 'time' => ['.c_time', 'text'], ], '', 'UTF-8', 'GB2312')->getData(); //把获取的数据插入数据库 if (!empty($data)) { $sql = 'INSERT INTO tb_sina(`url`, `title`, `time`) VALUES'; foreach ($data as $row) { //修改下时间,新浪的时间格式是这样的04-23 15:30 $time = date('Y') . '-' . $row['time'] . ':00'; $sql .= "('{$row['url']}', '{$row['tit']}', '{$time}'),"; } $sql = rtrim($sql, ','); $ret = $db->exec($sql); if ($ret !== false) { echo "线程{$this->name}成功插入{$ret}条数据\n"; } else { var_dump($db->errorInfo()); } } } } } //抓取页面地址 $url = 'http://roll.news.sina.com.cn/s/channel.php&#63;ch=01#col=89&spec=&type=&ch=01&k=&offset_page=0&offset_num=0&num=60&asc=&page='; //创建pool池 $pool = new Pool(5, 'DB', ['mysql:dbname=test;host=192.168.33.226', 'root', '']); //获取100个分页数据 for ($ix = 1; $ix submit(new Sina($ix, $url . $ix)); } //循环收集垃圾,阻塞主线程,等待子线程结束 while ($pool->collect()) ; $pool->shutdown();
  由于使用了QueryList,可以通过composer安装。
   composer require jaeger/querylist
  然而,安装的版本是3.2。我的php7.2下会有问题。由于each()已被弃用,因此修改了源代码,将each()替换为foreach。 ()够了。
  运行结果如下:
  
  数据也保存在数据库中
  
  当然,你也可以再次通过url获取具体的页面内容。这里不做演示,有兴趣的可以自己动手。
  更多对PHP相关内容感兴趣的读者可以查看本站专题:《PHP进程与线程操作技巧总结》、《PHP网络编程技巧总结》、《PHP基本语法介绍》、《 PHP数组(数组)操作技巧大全、php字符串使用总结、php+mysql数据库操作入门教程、php常用数据库操作技巧总结
  希望这篇文章能对你的 PHP 编程有所帮助。
  内容推荐:免费高清PNG素材下载

php多线程抓取网页(php手册中语焉不详的curl_multi一族的函数头疼不已)

网站优化优采云 发表了文章 • 0 个评论 • 76 次浏览 • 2021-12-21 00:26 • 来自相关话题

  php多线程抓取网页(php手册中语焉不详的curl_multi一族的函数头疼不已)
  让我向您介绍 Curl 多线程示例和原理。请指教
  相信很多人都为php手册中含糊不清的curl_multi系列函数而头疼。它们的文档较少,并且给出的示例很容易让您学习。我也搜索了很多网页,都没有看到一个完整的应用实例。
  curl_multi_add_handle
  curl_multi_close
  curl_multi_exec
  curl_multi_getcontent
  curl_multi_info_read
  curl_multi_init
  curl_multi_remove_handle
  curl_multi_select
  一般来说,在考虑使用这些函数时,目的显然应该是同时请求多个URL,而不是一个一个,否则最好在循环中调整curl_exec。
  步骤总结如下:
  第一步:调用 curl_multi_init
  第二步:循环调用 curl_multi_add_handle
  这一步需要注意的是curl_multi_add_handle的第二个参数是curl_init的子句柄。
  第三步:继续调用curl_multi_exec
  第四步:根据需要调用 curl_multi_getcontent 循环获取结果
  第五步:调用curl_multi_remove_handle,对每个字句柄调用curl_close
  第 6 步:调用 curl_multi_close
  这是 PHP 手册中的一个示例:
  复制代码代码如下:
  整个使用过程差不多就是这样,但是这段简单的代码有个致命的弱点,就是在do循环部分,在整个URL请求过程中都是无限循环,容易造成CPU占用100%。
  现在让我们改进它。这里我们需要使用一个几乎没有文档的函数 curl_multi_select。虽然C的curl库有select的说明,但是PHP中的界面和用法确实和C中的有所不同。
  将上面的段落更改为以下内容:
  复制代码代码如下:
  做 {
  $mrc = curl_multi_exec($mh,$active);
  } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  而($active 和 $mrc == CURLM_OK){
  如果 (curl_multi_select($mh) != -1) {
  做 {
  $mrc = curl_multi_exec($mh, $active);
  } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  }
  }
  因为$active要等到所有url数据都被接受后才会变为false,所以这里用curl_multi_exec的返回值来判断是否有数据。有数据时,会不断调用 curl_multi_exec。如果没有数据,则进入选择阶段。新数据可以唤醒继续执行。这里的优点是没有不必要的 CPU 消耗。
  另外:还有一些细节有时可能会遇到:
  要控制每个请求的超时时间,请在 curl_multi_add_handle 之前通过 curl_setopt 进行:
  curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
  判断是否超时或其他错误,使用 curl_error($conn[$i]); 在 curl_multi_getcontent 之前;
  该类别的特点:
  运行非常稳定。
  设置并发将始终使用此并发数,即使通过回调函数添加任务也是如此。
  CPU占用率极低,大部分CPU消耗在用户的回调函数中。
  内存利用率高,任务量大(15W任务会占用256M以上内存)。可以使用回调函数添加任务,任务数量可以自定义。
  可以最大限度地占用带宽。
  链式任务,例如需要多个不同地址采集的数据的任务,可以通过回调一次完成。
  能够对CURL错误进行多次尝试,次数自行决定(大并发初期容易产生CURL错误,网络条件或者对方服务器的稳定性也可能导致CURL错误)。
  回调函数相当灵活,可以同时执行多种类型的任务(比如下载文件、抓取网页、分析404可以在一个PHP进程中同时执行)。
  自定义任务类型非常容易,比如检查404,获取重定向的最后一个URL等。
  您可以设置缓存来挑战产品纪律。
  不足的:
  不能充分利用多核CPU(可以开多个进程解决,需要自己处理任务划分等逻辑)。
  最大并发数为 500(或 512?)。经过测试,是CURL的内部限制。如果超过最大并发,总是返回失败。
  目前没有可恢复的传递函数。
  目前任务是原子的,一个大文件不能分成几个部分开线程下载。
  trueTechArticle 向您介绍了 Curl 多线程示例和原理。有什么问题,请指教。相信很多人都为php手册中含糊不清的curl_multi系列函数而头疼。他们的文件较少,而且他们提供... 查看全部

  php多线程抓取网页(php手册中语焉不详的curl_multi一族的函数头疼不已)
  让我向您介绍 Curl 多线程示例和原理。请指教
  相信很多人都为php手册中含糊不清的curl_multi系列函数而头疼。它们的文档较少,并且给出的示例很容易让您学习。我也搜索了很多网页,都没有看到一个完整的应用实例。
  curl_multi_add_handle
  curl_multi_close
  curl_multi_exec
  curl_multi_getcontent
  curl_multi_info_read
  curl_multi_init
  curl_multi_remove_handle
  curl_multi_select
  一般来说,在考虑使用这些函数时,目的显然应该是同时请求多个URL,而不是一个一个,否则最好在循环中调整curl_exec。
  步骤总结如下:
  第一步:调用 curl_multi_init
  第二步:循环调用 curl_multi_add_handle
  这一步需要注意的是curl_multi_add_handle的第二个参数是curl_init的子句柄。
  第三步:继续调用curl_multi_exec
  第四步:根据需要调用 curl_multi_getcontent 循环获取结果
  第五步:调用curl_multi_remove_handle,对每个字句柄调用curl_close
  第 6 步:调用 curl_multi_close
  这是 PHP 手册中的一个示例:
  复制代码代码如下:
  整个使用过程差不多就是这样,但是这段简单的代码有个致命的弱点,就是在do循环部分,在整个URL请求过程中都是无限循环,容易造成CPU占用100%。
  现在让我们改进它。这里我们需要使用一个几乎没有文档的函数 curl_multi_select。虽然C的curl库有select的说明,但是PHP中的界面和用法确实和C中的有所不同。
  将上面的段落更改为以下内容:
  复制代码代码如下:
  做 {
  $mrc = curl_multi_exec($mh,$active);
  } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  而($active 和 $mrc == CURLM_OK){
  如果 (curl_multi_select($mh) != -1) {
  做 {
  $mrc = curl_multi_exec($mh, $active);
  } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  }
  }
  因为$active要等到所有url数据都被接受后才会变为false,所以这里用curl_multi_exec的返回值来判断是否有数据。有数据时,会不断调用 curl_multi_exec。如果没有数据,则进入选择阶段。新数据可以唤醒继续执行。这里的优点是没有不必要的 CPU 消耗。
  另外:还有一些细节有时可能会遇到:
  要控制每个请求的超时时间,请在 curl_multi_add_handle 之前通过 curl_setopt 进行:
  curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
  判断是否超时或其他错误,使用 curl_error($conn[$i]); 在 curl_multi_getcontent 之前;
  该类别的特点:
  运行非常稳定。
  设置并发将始终使用此并发数,即使通过回调函数添加任务也是如此。
  CPU占用率极低,大部分CPU消耗在用户的回调函数中。
  内存利用率高,任务量大(15W任务会占用256M以上内存)。可以使用回调函数添加任务,任务数量可以自定义。
  可以最大限度地占用带宽。
  链式任务,例如需要多个不同地址采集的数据的任务,可以通过回调一次完成。
  能够对CURL错误进行多次尝试,次数自行决定(大并发初期容易产生CURL错误,网络条件或者对方服务器的稳定性也可能导致CURL错误)。
  回调函数相当灵活,可以同时执行多种类型的任务(比如下载文件、抓取网页、分析404可以在一个PHP进程中同时执行)。
  自定义任务类型非常容易,比如检查404,获取重定向的最后一个URL等。
  您可以设置缓存来挑战产品纪律。
  不足的:
  不能充分利用多核CPU(可以开多个进程解决,需要自己处理任务划分等逻辑)。
  最大并发数为 500(或 512?)。经过测试,是CURL的内部限制。如果超过最大并发,总是返回失败。
  目前没有可恢复的传递函数。
  目前任务是原子的,一个大文件不能分成几个部分开线程下载。
  trueTechArticle 向您介绍了 Curl 多线程示例和原理。有什么问题,请指教。相信很多人都为php手册中含糊不清的curl_multi系列函数而头疼。他们的文件较少,而且他们提供...

php多线程抓取网页(PHP利用CurlFunctionsFunctions并发多线程地址)

网站优化优采云 发表了文章 • 0 个评论 • 60 次浏览 • 2021-12-18 19:16 • 来自相关话题

  php多线程抓取网页(PHP利用CurlFunctionsFunctions并发多线程地址)
  PHP 可以使用 Curl Functions 完成各种文件传输操作,比如模拟浏览器发送 GET、POST 请求等,但是 PHP 语言本身不支持多线程,所以开发爬虫程序的效率是不高。这时候往往需要Curl Multi Functions来实现对多个URL地址的并发多线程访问。既然Curl Multi Function这么强大,那我可以用Curl Multi Functions来写并发多线程下载文件吗?当然,我的代码如下:
  代码2:将得到的代码先放入变量中,再写入文件
  //上面的do有问题,这样写会报错
  //改变do循环开始
  做{
  $mrc = curl_multi_exec($mh,$active);
  } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  while ($active and $mrc == CURLM_OK) {
  if (curl_multi_select($mh) != -1) {
  做{
  $mrc = curl_multi_exec($mh, $active);
  } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  }
  }
  //改变do循环结束
  因为$active要等到所有url数据被接受后才变为false,这里用curl_multi_exec的返回值来判断是否有数据。有数据时,会不断调用curl_multi_exec,如果没有数据,则进入select阶段。 , 新数据可以被唤醒继续执行。这里的好处是没有了不必要的 CPU 消耗。 查看全部

  php多线程抓取网页(PHP利用CurlFunctionsFunctions并发多线程地址)
  PHP 可以使用 Curl Functions 完成各种文件传输操作,比如模拟浏览器发送 GET、POST 请求等,但是 PHP 语言本身不支持多线程,所以开发爬虫程序的效率是不高。这时候往往需要Curl Multi Functions来实现对多个URL地址的并发多线程访问。既然Curl Multi Function这么强大,那我可以用Curl Multi Functions来写并发多线程下载文件吗?当然,我的代码如下:
  代码2:将得到的代码先放入变量中,再写入文件
  //上面的do有问题,这样写会报错
  //改变do循环开始
  做{
  $mrc = curl_multi_exec($mh,$active);
  } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  while ($active and $mrc == CURLM_OK) {
  if (curl_multi_select($mh) != -1) {
  做{
  $mrc = curl_multi_exec($mh, $active);
  } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  }
  }
  //改变do循环结束
  因为$active要等到所有url数据被接受后才变为false,这里用curl_multi_exec的返回值来判断是否有数据。有数据时,会不断调用curl_multi_exec,如果没有数据,则进入select阶段。 , 新数据可以被唤醒继续执行。这里的好处是没有了不必要的 CPU 消耗。

php多线程抓取网页(中国最强搜索引擎--百度上面行走了好长,我要想骂人了)

网站优化优采云 发表了文章 • 0 个评论 • 53 次浏览 • 2021-12-18 17:03 • 来自相关话题

  php多线程抓取网页(中国最强搜索引擎--百度上面行走了好长,我要想骂人了)
  最近在做一个项目,有一个需求:要从网页中抓取数据,要求是先抓取整个网页的html源代码(用于后期更新)。一开始看到这个简单,然后就稀里糊涂的打了代码(之前用Hadoop平台的分布式爬虫框架Nutch,用起来很方便,但最后因为速度放弃了,但是统计生成用于后续爬取),很快就成功下载了holder.html和finance.html页面,然后在解析holder.html页面后,解析finance.html,然后郁闷的找不到自己需要的在这个页面中的数据不在html源代码中。去浏览器查看源码确实是这样。源代码中确实没有我需要的数据。
  在号称中国最强搜索引擎——百度上走了很久,发现大部分人都在用WebDriver和HttpUnit(其实前者已经收录了后者)。我很高兴,终于找到了解决方案。. 兴奋地使用WebDriver,我想骂人。
  
  以下是对WebDriver的投诉
  WebDriver 是一个测试框架。本来不是为爬虫服务的,但我想说的是:星盘只是有点短,你不能更进一步吗?为什么网上那么多人推荐WebDriver?我觉得这些人并没有从现实出发,甚至有人说WebDriver可以解析完成的页面,返回给想要爬取整个页面(包括动态生成的内容)的人。是的,WebDriver可以完成这个任务,但是看关于作者写的代码,我想说的是:哥们,你的代码限制太多了,解析你写的js代码,js代码很简单,所以当然WebDriver 可以毫无压力地完成任务。WebDriver 对动态内容的分析依赖于 js 代码的复杂性和多样性。
  什么是复杂度?
  先贴一段代码
  WebDriver driver = newInternetExplorerDriver ();
HtmlPage page = driver.get(url);
System.out.println(page.asXml());
  这段代码的意思是大家都明白了。上面使用的IE内核,当然是FirefoxDriver、ChromeDriver、HtmlUnitDriver,这些驱动的使用原理都是一样的,先打开浏览器(这个需要时间),然后加载url并完成动态分析,然后通过page。 asXml() 可以得到完整的html页面,其中HtmlUnitDriver模拟无界面浏览器,java有引擎rhino执行js,HtmlUnitDriver使用rhino解析js,因为它不会启动有界面的浏览器,所以HtmlUnitDriver的速度比前三个都快。不管是什么Driver,都难免要解析js,这需要时间,而且对于没有使用的内核,js的支持程序也不同。例如,HtmlUnitDriver 对带有滚动的 js 代码的支持很差,并且在执行过程中会报错。(亲身体验)。js代码的复杂含义是不同内核支持的js并不完全一样。这个要根据具体情况来确定。好久没研究js了,就不讲各个核心对js的支持了。
  什么是多样性
  前面说过,浏览器解析js需要时间。对于只嵌入少量js代码的页面,通过page.asXml()获取完整页面是没有问题的。但是对于嵌入了大量js代码的页面,解析js需要花费大量的时间(对于jvm),那么大部分时候通过page.asXml()获取的页面并不收录动态生成的内容。问题是,为什么说WebDriver可以获取收录动态内容的html页面呢?网上有人说在driver.get(url)之后,当前线程需要等待一段时间才能获取完成的页面,类似于下面的形式
  WebDriver driver = new InternetExplorerDriver();
HtmlPage page = dirver.get(url);
Thread.sleep(2000);
System.output.println(page.asXml());
  我按照这个想法尝试了以下,是的,确实有可能。但问题不就在那里吗?如何确定等待时间?类似于数据挖掘中使用的经验方法来确定阈值?,或者尽可能长。我觉得这些都不是很好的方法,时间成本也比较高。只是觉得驱动应该可以在js的解析完成后捕捉到状态,于是搜索,搜索,但是根本没有这样的方法,所以我说为什么WebDriver的设计者没有采取措施forward 以便我们可以在程序中获取解析js后驱动的状态。在这种情况下,没有必要使用像Thread.sleep(2000)这样的不确定代码,可惜我找不到它。真的让我感到难过。字段。FirefoxDriver,ChromeDriver,HtmlUnitDriver 也有同样的问题。可以说使用WebDriver辅助爬取动态生成的网页得到的结果是非常不稳定的。我对此有深刻的理解。使用IEDriver时,同一个页面两次爬取的结果会不一样,有时甚至IE直接挂掉。你敢在爬虫程序中使用这种东西吗?我不敢。
  另外,有人推荐使用HttpUnit。其实WebDirver中的HtmlUnitDriver内部使用的是httpUnit,所以在使用HttpUnit的时候也会遇到同样的问题。我也做过一个实验,确实是这样。通过Thread.sleep(2000))等待js解析完成,我觉得不可取,不确定性太大,尤其是大型爬虫工作。
  综上所述,WebDriver 是一个为测试而设计的框架。虽然理论上可以用来辅助爬虫获取动态内容的html页面,但在实际应用中并没有使用,不确定性太大。稳定性太差,速度太慢。让我们让框架发挥最大的作用。不要损害他们的优势。
  我的工作还没有完成,所以我需要想办法上网。这次找到了一个稳定且确定性很强的辅助工具——phantomjs。我还没有完全理解这件事。但是已经用它来实现我想要的功能了。在java中,通过runtime.exec(arg)调用phantomjs来获取解析js后的页面。我会发布代码
  phantomjs端要执行的代码
  system = require(\'system\')
address = system.args[1];//获得命令行第二个参数 接下来会用到
//console.log(\'Loading a web page\');
var page = require(\'webpage\').create();
var url = address;
//console.log(url);
page.open(url, function (status) {
//Page is loaded!
if (status !== \'success\') {
console.log(\'Unable to post!\');
} else {
//此处的打印,是将结果一流的形式output到java中,java通过InputStream可以获取该输出内容
console.log(page.content);
}
phantom.exit();
});
  在java端执行的代码
  public void getParseredHtml(){
String url = "www.bai.com";
Runtime runtime = Runtime.getRuntime();
runtime.exec("F:/phantomjs/phantomjs/phantomjs.exe F:/js/parser.js "+url);
InputStream in = runtime.getInputStream();
//后面的代码省略,得到了InputStream就好说了
}
  这样就可以在java端获取解析后的html页面,而不用像WebDriver中的Thread.sleep()这样不确定的代码来获取可能的代码。有一点需要说明:phantomjs端的js代码一定不能有语法错误,否则如果js代码编译不一样,java端会一直等待,不会抛出异常。而且,在使用phantomjs.exe时,java端每次都要启动一个phantomjs进程,耗费大量时间。但至少,结果是稳定的。当然,我最终没有使用phantomjs。我直接下载了数据,但是没有抓取整个页面,主要是速度问题。(其实我不敢用phantomjs,因为我对phantomjs不熟悉,所以谨慎使用)。
  折腾了几天,虽然我的问题没有解决,但是也长了不少见识。后面的工作熟悉phantomjs,看看速度能不能提高。如果能打破速度框架,以后去网页的时候就方便了。同样,它是 Nutch 框架。我很欣赏使用它时的便利性。后期需要研究如何优化Nutch on Hadoop的爬取速度。另外,Nutch原有的功能不会爬行。动态生成的页面内容,不过你可以用Nutch和WebDirver结合起来,也许爬取的结果是稳定的,哈哈,这些只是想法,不试试怎么知道呢?
  如果大家对使用WebDriver辅助爬虫得到的结果的稳定性有什么想说的,欢迎大家讨论,因为我确实没有找到稳定结果的相关资料。 查看全部

  php多线程抓取网页(中国最强搜索引擎--百度上面行走了好长,我要想骂人了)
  最近在做一个项目,有一个需求:要从网页中抓取数据,要求是先抓取整个网页的html源代码(用于后期更新)。一开始看到这个简单,然后就稀里糊涂的打了代码(之前用Hadoop平台的分布式爬虫框架Nutch,用起来很方便,但最后因为速度放弃了,但是统计生成用于后续爬取),很快就成功下载了holder.html和finance.html页面,然后在解析holder.html页面后,解析finance.html,然后郁闷的找不到自己需要的在这个页面中的数据不在html源代码中。去浏览器查看源码确实是这样。源代码中确实没有我需要的数据。
  在号称中国最强搜索引擎——百度上走了很久,发现大部分人都在用WebDriver和HttpUnit(其实前者已经收录了后者)。我很高兴,终于找到了解决方案。. 兴奋地使用WebDriver,我想骂人。
  
  以下是对WebDriver的投诉
  WebDriver 是一个测试框架。本来不是为爬虫服务的,但我想说的是:星盘只是有点短,你不能更进一步吗?为什么网上那么多人推荐WebDriver?我觉得这些人并没有从现实出发,甚至有人说WebDriver可以解析完成的页面,返回给想要爬取整个页面(包括动态生成的内容)的人。是的,WebDriver可以完成这个任务,但是看关于作者写的代码,我想说的是:哥们,你的代码限制太多了,解析你写的js代码,js代码很简单,所以当然WebDriver 可以毫无压力地完成任务。WebDriver 对动态内容的分析依赖于 js 代码的复杂性和多样性。
  什么是复杂度?
  先贴一段代码
  WebDriver driver = newInternetExplorerDriver ();
HtmlPage page = driver.get(url);
System.out.println(page.asXml());
  这段代码的意思是大家都明白了。上面使用的IE内核,当然是FirefoxDriver、ChromeDriver、HtmlUnitDriver,这些驱动的使用原理都是一样的,先打开浏览器(这个需要时间),然后加载url并完成动态分析,然后通过page。 asXml() 可以得到完整的html页面,其中HtmlUnitDriver模拟无界面浏览器,java有引擎rhino执行js,HtmlUnitDriver使用rhino解析js,因为它不会启动有界面的浏览器,所以HtmlUnitDriver的速度比前三个都快。不管是什么Driver,都难免要解析js,这需要时间,而且对于没有使用的内核,js的支持程序也不同。例如,HtmlUnitDriver 对带有滚动的 js 代码的支持很差,并且在执行过程中会报错。(亲身体验)。js代码的复杂含义是不同内核支持的js并不完全一样。这个要根据具体情况来确定。好久没研究js了,就不讲各个核心对js的支持了。
  什么是多样性
  前面说过,浏览器解析js需要时间。对于只嵌入少量js代码的页面,通过page.asXml()获取完整页面是没有问题的。但是对于嵌入了大量js代码的页面,解析js需要花费大量的时间(对于jvm),那么大部分时候通过page.asXml()获取的页面并不收录动态生成的内容。问题是,为什么说WebDriver可以获取收录动态内容的html页面呢?网上有人说在driver.get(url)之后,当前线程需要等待一段时间才能获取完成的页面,类似于下面的形式
  WebDriver driver = new InternetExplorerDriver();
HtmlPage page = dirver.get(url);
Thread.sleep(2000);
System.output.println(page.asXml());
  我按照这个想法尝试了以下,是的,确实有可能。但问题不就在那里吗?如何确定等待时间?类似于数据挖掘中使用的经验方法来确定阈值?,或者尽可能长。我觉得这些都不是很好的方法,时间成本也比较高。只是觉得驱动应该可以在js的解析完成后捕捉到状态,于是搜索,搜索,但是根本没有这样的方法,所以我说为什么WebDriver的设计者没有采取措施forward 以便我们可以在程序中获取解析js后驱动的状态。在这种情况下,没有必要使用像Thread.sleep(2000)这样的不确定代码,可惜我找不到它。真的让我感到难过。字段。FirefoxDriver,ChromeDriver,HtmlUnitDriver 也有同样的问题。可以说使用WebDriver辅助爬取动态生成的网页得到的结果是非常不稳定的。我对此有深刻的理解。使用IEDriver时,同一个页面两次爬取的结果会不一样,有时甚至IE直接挂掉。你敢在爬虫程序中使用这种东西吗?我不敢。
  另外,有人推荐使用HttpUnit。其实WebDirver中的HtmlUnitDriver内部使用的是httpUnit,所以在使用HttpUnit的时候也会遇到同样的问题。我也做过一个实验,确实是这样。通过Thread.sleep(2000))等待js解析完成,我觉得不可取,不确定性太大,尤其是大型爬虫工作。
  综上所述,WebDriver 是一个为测试而设计的框架。虽然理论上可以用来辅助爬虫获取动态内容的html页面,但在实际应用中并没有使用,不确定性太大。稳定性太差,速度太慢。让我们让框架发挥最大的作用。不要损害他们的优势。
  我的工作还没有完成,所以我需要想办法上网。这次找到了一个稳定且确定性很强的辅助工具——phantomjs。我还没有完全理解这件事。但是已经用它来实现我想要的功能了。在java中,通过runtime.exec(arg)调用phantomjs来获取解析js后的页面。我会发布代码
  phantomjs端要执行的代码
  system = require(\'system\')
address = system.args[1];//获得命令行第二个参数 接下来会用到
//console.log(\'Loading a web page\');
var page = require(\'webpage\').create();
var url = address;
//console.log(url);
page.open(url, function (status) {
//Page is loaded!
if (status !== \'success\') {
console.log(\'Unable to post!\');
} else {
//此处的打印,是将结果一流的形式output到java中,java通过InputStream可以获取该输出内容
console.log(page.content);
}
phantom.exit();
});
  在java端执行的代码
  public void getParseredHtml(){
String url = "www.bai.com";
Runtime runtime = Runtime.getRuntime();
runtime.exec("F:/phantomjs/phantomjs/phantomjs.exe F:/js/parser.js "+url);
InputStream in = runtime.getInputStream();
//后面的代码省略,得到了InputStream就好说了
}
  这样就可以在java端获取解析后的html页面,而不用像WebDriver中的Thread.sleep()这样不确定的代码来获取可能的代码。有一点需要说明:phantomjs端的js代码一定不能有语法错误,否则如果js代码编译不一样,java端会一直等待,不会抛出异常。而且,在使用phantomjs.exe时,java端每次都要启动一个phantomjs进程,耗费大量时间。但至少,结果是稳定的。当然,我最终没有使用phantomjs。我直接下载了数据,但是没有抓取整个页面,主要是速度问题。(其实我不敢用phantomjs,因为我对phantomjs不熟悉,所以谨慎使用)。
  折腾了几天,虽然我的问题没有解决,但是也长了不少见识。后面的工作熟悉phantomjs,看看速度能不能提高。如果能打破速度框架,以后去网页的时候就方便了。同样,它是 Nutch 框架。我很欣赏使用它时的便利性。后期需要研究如何优化Nutch on Hadoop的爬取速度。另外,Nutch原有的功能不会爬行。动态生成的页面内容,不过你可以用Nutch和WebDirver结合起来,也许爬取的结果是稳定的,哈哈,这些只是想法,不试试怎么知道呢?
  如果大家对使用WebDriver辅助爬虫得到的结果的稳定性有什么想说的,欢迎大家讨论,因为我确实没有找到稳定结果的相关资料。

php多线程抓取网页( hebedichPHP利用Curl实现并发多线程下载文件以上就是)

网站优化优采云 发表了文章 • 0 个评论 • 74 次浏览 • 2021-12-15 02:05 • 来自相关话题

  php多线程抓取网页(
hebedichPHP利用Curl实现并发多线程下载文件以上就是)
  PHP结合curl实现多线程爬取
  更新时间:2015-07-09 11:09:13 投稿:hebedich
  PHP可以使用Curl来完成各种文件传输操作,比如模拟浏览器发送GET、POST请求等,但是由于PHP语言本身不支持多线程,开发爬虫程序的效率不高,所以经常需要使用 Curl Multi Functions。实现多线程并发访问多个URL地址的函数,实现多线程并发抓取网页或下载文件
  PHP结合curl实现多线程爬取
  让我们再看几个例子
  (1)下面这段代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  
$urls = array(
'https://www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
); // 设置要抓取的页面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)下面的代码和上面的意思一样,只不过这个地方先把获取的代码放入变量中,然后将获取的内容写入指定的文件
  
$urls = array(
'https://www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
);
$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 Functions实现文件的并发多线程下载
  
$urls=array(
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/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(
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/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多线程抓取网页(
hebedichPHP利用Curl实现并发多线程下载文件以上就是)
  PHP结合curl实现多线程爬取
  更新时间:2015-07-09 11:09:13 投稿:hebedich
  PHP可以使用Curl来完成各种文件传输操作,比如模拟浏览器发送GET、POST请求等,但是由于PHP语言本身不支持多线程,开发爬虫程序的效率不高,所以经常需要使用 Curl Multi Functions。实现多线程并发访问多个URL地址的函数,实现多线程并发抓取网页或下载文件
  PHP结合curl实现多线程爬取
  让我们再看几个例子
  (1)下面这段代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  
$urls = array(
'https://www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
); // 设置要抓取的页面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)下面的代码和上面的意思一样,只不过这个地方先把获取的代码放入变量中,然后将获取的内容写入指定的文件
  
$urls = array(
'https://www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
);
$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 Functions实现文件的并发多线程下载
  
$urls=array(
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/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(
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/5w.zip',
'https://www.jb51.net/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多线程抓取网页(Python多线程爬虫扫描器介绍)

网站优化优采云 发表了文章 • 0 个评论 • 48 次浏览 • 2021-12-10 14:05 • 来自相关话题

  php多线程抓取网页(Python多线程爬虫扫描器介绍)
  Python多线程爬虫扫描程序
  一、Python多线程扫描程序简介
  对于小白来说,这里介绍的扫描仪不是条形码扫描仪
  事实上,多线程扫描程序是Python爬虫程序之一。它可以自动检测安全漏洞,如远程服务器和网站、弱密码、扫描IP、文件、端口和目录的python程序。它能快速准确地发现扫描目标的漏洞,为深入入侵安全检测打下基础。
  
  Python多线程爬虫相关知识也是Python黑客学习渗透技术所必需的
  例如,python黑客工具具有以下功能:
  1.扫描站点漏洞、特洛伊木马和危险程序
  2.扫描对比文件的差异,并监控网站文件
  3.检测网页状态代码(200、403、404、500==)
  4.检查网站是否存在搜索引擎优化欺骗[为用户和搜索引擎返回不同的结果]
  5.网站150个虚拟主机空间连接,例如压力测试中的IIS连接
  6.模拟搜索引擎蜘蛛抓取美国用户代理用户代理
  7.网站程序和版本确认,网站后台扫描
  8.扫描端口等,玩蛇网游戏
  二、黑客多线程扫描仪的功能
  在本次播放snake Python home的图形和视频教程中,Python scanner要实现的简单功能包括:
  1.多线程扫描(更快)
  2.模拟搜索引擎爬虫(用户代理)
  3.使用代理服务器(大量代理IP交换和获取)
  4.扫描状态代码、文件目录等
  5.过滤不必要的文件或目录等
  6.您可以手动更改与扫描匹配的词典
  7.它可以制成一个带有图形界面的黑客工具
  如下图所示:(本教程为终端版本,未来将推出相应的GUI版本)
  
  三、测试多线程爬虫环境的构造
  1.linux\Mac OS X\windows
  2.编辑器IDE,python2.x/python3.x
  3.构建一个开放源代码的web程序或博客程序进行本地测试(play snake教程环境:apache2+PHP5+WordPress)
  4.获取匹配列表字典、目录或漏洞文件字典(WordPress、zblog、Dedecms等)
  5.确保本地网络和扫描服务器之间的连接和稳定性
  6.注意:建议在本地构建测试环境。请勿扫描网络上的其他网站和服务器。这是违法的
  声明:本视频教程仅用于Python学习和测试,不应用于非法方式和行为
  一切后果自负。玩蛇网与斯巴达无关
  四、黑客工具实用代码案例分析
  
# -*- coding:utf-8 -*-
__author__="iplaypython.com"
import os
import urllib2
import threading
import Queue
import time
import random
q = Queue.Queue() # Queue产生一个队列,有3种类型队列 默认用 FIFO队列
threading_num = 5 # 开启5个线程
# 扫描本地IP或域名
domain_name = "http://127.0.0.1"
# 百度蜘蛛UA
Baidu_spider = "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
# 不需要的文件过滤列表
exclude_list = [&#39;.jpg&#39;, &#39;.gif&#39;, &#39;.css&#39;, &#39;.png&#39;, &#39;.js&#39;, &#39;.scss&#39;]
proxy_list = [ # 代理服务器,可能已经失效,换为自己的
{&#39;http&#39;: &#39;117.28.254.130:8080&#39;},
{&#39;http&#39;: &#39;118.144.177.254:3128&#39;},
{&#39;http&#39;: &#39;113.118.211.152:9797&#39;},
]
# 打开字典文件,开始过滤不需要的文件路径
with open("/home/leo/app_txt/wordpress.txt" , "r") as lines:
for line in lines:
line = line.rstrip()
if os.path.splitext(line)[1] not in exclude_list:
q.put(line) #将line传入到队列 q 中
# 扫描器方法
def crawler():
while not q.empty(): # 循环
path = q.get() 将line从队列 q 中取出来
url = "%s%s" % (domain_name, path) # 组合url地址,用于下一步提交
random_proxy = random.choice(proxy_list) # 随机使用一个代理服务器
proxy_support = urllib2.ProxyHandler(random_proxy)
opener = urllib2.build_opener(proxy_support)
urllib2.install_opener(opener)
headers = {}
headers[&#39;User-Agent&#39;] = Baidu_spider # 蜘蛛的头部信息
# 玩蛇网 www.iplaypy.com
request = urllib2.Request(url, headers=headers)
try:
response = urllib2.urlopen(request)
content = response.read()
if len(content): # 内容不为空的情况下返回状态码、路径
print "Status [%s] - path: %s" % (response.code, path)
response.close()
time.sleep(1) # 休息一会儿,防止速度过快连接数过大被封掉IP
except urllib2.HTTPError as e:
# print e.code, path
pass # 异常处理,先暂时pass掉
if __name__ == &#39;__main__&#39;:
# 创建多线程并指明函数的入口为crawler,以后还可以传参进去
for i in range(threading_num):
t = threading.Thread(target=crawler)
t.start()
  #在上面的代码中,我们总共导入了6个模块,这些模块都是下一步要使用的功能模块
  #操作系统用于过滤我们不需要扫描的后缀文件
  #Urlib2负责抓取,线程是我们的Python多线程模块
  #这次还需要一个线程安全的队列模块Queue
  #另外两个相对简单。一个是随机模块,另一个是时间模块
  五、下载与本文相关的资源
  
  黑客工具\uPython多线程爬虫抓取扫描仪Python完整源代码下载:
  本地高速下载:爬虫扫描程序rar
  源代码大小:1.6KB
  Python多线程爬虫抓取扫描程序
  这是pyhton多线程扫描仪视频课程的内容页,稍后将更新
  提供课程相关资源和python源代码下载,以及详细的图形教程使用
  黑客工具,黑客扫描仪,端口扫描,免费网页网站扫描仪
  百度在线硬盘下载地址:
  由于视频教程持续约50分钟,因此视频分两部分发送
  Python多线程爬虫抓取扫描程序-上一节
  Python多线程爬虫抓取扫描程序-下一节
  任何问题和建议都可以留在评论区供讨论
  [视频播放密码]:qqun20419428 查看全部

  php多线程抓取网页(Python多线程爬虫扫描器介绍)
  Python多线程爬虫扫描程序
  一、Python多线程扫描程序简介
  对于小白来说,这里介绍的扫描仪不是条形码扫描仪
  事实上,多线程扫描程序是Python爬虫程序之一。它可以自动检测安全漏洞,如远程服务器和网站、弱密码、扫描IP、文件、端口和目录的python程序。它能快速准确地发现扫描目标的漏洞,为深入入侵安全检测打下基础。
  
  Python多线程爬虫相关知识也是Python黑客学习渗透技术所必需的
  例如,python黑客工具具有以下功能:
  1.扫描站点漏洞、特洛伊木马和危险程序
  2.扫描对比文件的差异,并监控网站文件
  3.检测网页状态代码(200、403、404、500==)
  4.检查网站是否存在搜索引擎优化欺骗[为用户和搜索引擎返回不同的结果]
  5.网站150个虚拟主机空间连接,例如压力测试中的IIS连接
  6.模拟搜索引擎蜘蛛抓取美国用户代理用户代理
  7.网站程序和版本确认,网站后台扫描
  8.扫描端口等,玩蛇网游戏
  二、黑客多线程扫描仪的功能
  在本次播放snake Python home的图形和视频教程中,Python scanner要实现的简单功能包括:
  1.多线程扫描(更快)
  2.模拟搜索引擎爬虫(用户代理)
  3.使用代理服务器(大量代理IP交换和获取)
  4.扫描状态代码、文件目录等
  5.过滤不必要的文件或目录等
  6.您可以手动更改与扫描匹配的词典
  7.它可以制成一个带有图形界面的黑客工具
  如下图所示:(本教程为终端版本,未来将推出相应的GUI版本)
  
  三、测试多线程爬虫环境的构造
  1.linux\Mac OS X\windows
  2.编辑器IDE,python2.x/python3.x
  3.构建一个开放源代码的web程序或博客程序进行本地测试(play snake教程环境:apache2+PHP5+WordPress)
  4.获取匹配列表字典、目录或漏洞文件字典(WordPress、zblog、Dedecms等)
  5.确保本地网络和扫描服务器之间的连接和稳定性
  6.注意:建议在本地构建测试环境。请勿扫描网络上的其他网站和服务器。这是违法的
  声明:本视频教程仅用于Python学习和测试,不应用于非法方式和行为
  一切后果自负。玩蛇网与斯巴达无关
  四、黑客工具实用代码案例分析
  
# -*- coding:utf-8 -*-
__author__="iplaypython.com"
import os
import urllib2
import threading
import Queue
import time
import random
q = Queue.Queue() # Queue产生一个队列,有3种类型队列 默认用 FIFO队列
threading_num = 5 # 开启5个线程
# 扫描本地IP或域名
domain_name = "http://127.0.0.1"
# 百度蜘蛛UA
Baidu_spider = "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
# 不需要的文件过滤列表
exclude_list = [&#39;.jpg&#39;, &#39;.gif&#39;, &#39;.css&#39;, &#39;.png&#39;, &#39;.js&#39;, &#39;.scss&#39;]
proxy_list = [ # 代理服务器,可能已经失效,换为自己的
{&#39;http&#39;: &#39;117.28.254.130:8080&#39;},
{&#39;http&#39;: &#39;118.144.177.254:3128&#39;},
{&#39;http&#39;: &#39;113.118.211.152:9797&#39;},
]
# 打开字典文件,开始过滤不需要的文件路径
with open("/home/leo/app_txt/wordpress.txt" , "r") as lines:
for line in lines:
line = line.rstrip()
if os.path.splitext(line)[1] not in exclude_list:
q.put(line) #将line传入到队列 q 中
# 扫描器方法
def crawler():
while not q.empty(): # 循环
path = q.get() 将line从队列 q 中取出来
url = "%s%s" % (domain_name, path) # 组合url地址,用于下一步提交
random_proxy = random.choice(proxy_list) # 随机使用一个代理服务器
proxy_support = urllib2.ProxyHandler(random_proxy)
opener = urllib2.build_opener(proxy_support)
urllib2.install_opener(opener)
headers = {}
headers[&#39;User-Agent&#39;] = Baidu_spider # 蜘蛛的头部信息
# 玩蛇网 www.iplaypy.com
request = urllib2.Request(url, headers=headers)
try:
response = urllib2.urlopen(request)
content = response.read()
if len(content): # 内容不为空的情况下返回状态码、路径
print "Status [%s] - path: %s" % (response.code, path)
response.close()
time.sleep(1) # 休息一会儿,防止速度过快连接数过大被封掉IP
except urllib2.HTTPError as e:
# print e.code, path
pass # 异常处理,先暂时pass掉
if __name__ == &#39;__main__&#39;:
# 创建多线程并指明函数的入口为crawler,以后还可以传参进去
for i in range(threading_num):
t = threading.Thread(target=crawler)
t.start()
  #在上面的代码中,我们总共导入了6个模块,这些模块都是下一步要使用的功能模块
  #操作系统用于过滤我们不需要扫描的后缀文件
  #Urlib2负责抓取,线程是我们的Python多线程模块
  #这次还需要一个线程安全的队列模块Queue
  #另外两个相对简单。一个是随机模块,另一个是时间模块
  五、下载与本文相关的资源
  
  黑客工具\uPython多线程爬虫抓取扫描仪Python完整源代码下载:
  本地高速下载:爬虫扫描程序rar
  源代码大小:1.6KB
  Python多线程爬虫抓取扫描程序
  这是pyhton多线程扫描仪视频课程的内容页,稍后将更新
  提供课程相关资源和python源代码下载,以及详细的图形教程使用
  黑客工具,黑客扫描仪,端口扫描,免费网页网站扫描仪
  百度在线硬盘下载地址:
  由于视频教程持续约50分钟,因此视频分两部分发送
  Python多线程爬虫抓取扫描程序-上一节
  Python多线程爬虫抓取扫描程序-下一节
  任何问题和建议都可以留在评论区供讨论
  [视频播放密码]:qqun20419428

php多线程抓取网页(批量调用过程如下:一系列数量很大数据(一)_官方手册)

网站优化优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2021-12-09 00:19 • 来自相关话题

  php多线程抓取网页(批量调用过程如下:一系列数量很大数据(一)_官方手册)
  从哪儿开始:
  一系列数据量大、不热、希望被大量蜘蛛爬取的页面,在爬虫高峰期会有非常高的响应时间。
  前辈做过这样的事情:将页面分成3个块,提供3个内部接口,入口文件使用curl_multi_*系列函数抓取3个内部接口的内容,放在一起成为一个页面。
  怀疑这可能会影响性能。
  是通过学习来分析的。
  看了php官方手册,批量调用过程总结如下:
  curl_multi_init—返回一个新的 curl 批处理句柄作为 curl_init 生成的单个 curl 句柄的容器
  curl_multi_add_handle - 向 curl 批处理会话添加单个 curl 句柄。
  curl_multi_exec—运行当前cURL句柄的子连接,curl_multi_select()的值
  curl_multi_select—等待 curl 批处理中的所有活动连接
  curl_multi_getcontent——如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出文本流
  curl_multi_remove_handle—删除curl批处理句柄资源中的句柄资源
  curl_multi_close—关闭一组 cURL 句柄
  取PHP官网的示例代码:
  疑惑和想法:
  1.批量请求的原理
  PHP没有多线程,是通过操作系统的多线程来实现的(看网上)
  2. 批量请求是基于操作系统的多线程机制,理论上会消耗大量机器的cpu
  一种。开发机上验证,大批量请求时cpu调用确实会急剧上升
  湾 对比线上前端机的负载情况和页面响应时间加长的时间点,发现线上前端机的负载并没有明显增加(维持在0.3左右)
  C。我在网上看到有人curl_multi_select()的返回值不是-1时(表示一个请求没有被处理过) usleep(100), sleep 避免不读取处理状态造成不必要的cpu​​压力.
  注意:
  2中的a和b存在矛盾,目前还没有找到根本原因
  2中的c没有实际测试过
  欢迎广大读者批评指正
  作者:小帅将军 查看全部

  php多线程抓取网页(批量调用过程如下:一系列数量很大数据(一)_官方手册)
  从哪儿开始:
  一系列数据量大、不热、希望被大量蜘蛛爬取的页面,在爬虫高峰期会有非常高的响应时间。
  前辈做过这样的事情:将页面分成3个块,提供3个内部接口,入口文件使用curl_multi_*系列函数抓取3个内部接口的内容,放在一起成为一个页面。
  怀疑这可能会影响性能。
  是通过学习来分析的。
  看了php官方手册,批量调用过程总结如下:
  curl_multi_init—返回一个新的 curl 批处理句柄作为 curl_init 生成的单个 curl 句柄的容器
  curl_multi_add_handle - 向 curl 批处理会话添加单个 curl 句柄。
  curl_multi_exec—运行当前cURL句柄的子连接,curl_multi_select()的值
  curl_multi_select—等待 curl 批处理中的所有活动连接
  curl_multi_getcontent——如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出文本流
  curl_multi_remove_handle—删除curl批处理句柄资源中的句柄资源
  curl_multi_close—关闭一组 cURL 句柄
  取PHP官网的示例代码:
  疑惑和想法:
  1.批量请求的原理
  PHP没有多线程,是通过操作系统的多线程来实现的(看网上)
  2. 批量请求是基于操作系统的多线程机制,理论上会消耗大量机器的cpu
  一种。开发机上验证,大批量请求时cpu调用确实会急剧上升
  湾 对比线上前端机的负载情况和页面响应时间加长的时间点,发现线上前端机的负载并没有明显增加(维持在0.3左右)
  C。我在网上看到有人curl_multi_select()的返回值不是-1时(表示一个请求没有被处理过) usleep(100), sleep 避免不读取处理状态造成不必要的cpu​​压力.
  注意:
  2中的a和b存在矛盾,目前还没有找到根本原因
  2中的c没有实际测试过
  欢迎广大读者批评指正
  作者:小帅将军

php多线程抓取网页(PHP5.3以上版本,使用pthreads抓取信息测试例子)

网站优化优采云 发表了文章 • 0 个评论 • 68 次浏览 • 2021-12-04 19:04 • 来自相关话题

  php多线程抓取网页(PHP5.3以上版本,使用pthreads抓取信息测试例子)
  只有在php5.3及以后的版本中才能真正使用多线程程序。以前是fake curl实现的多线程工作。给大家介绍几个多线程爬取的资料。测试例子,希望对大家有帮助。
  PHP 5.3 及以上,使用pthreads PHP扩展,可以让PHP真正支持多线程。多线程是处理重复的循环任务,可以大大缩短程序的执行时间。
  PHP 扩展下载:
  PHP 手册文档:
  1、Linux的扩展编译安装,编辑参数--enable-maintainer-zts为必选项:
  cd /Data/tgz/php-5.3.8
./configure --prefix=/Data/apps/php --with-config-file-path=/Data/apps/php/etc --with-mysql=/Data/apps/mysql --with-mysqli=/Data/apps/mysql/bin/mysql_config --with-iconv-dir --with-freetype-dir=/Data/apps/libs --with-jpeg-dir=/Data/apps/libs --with-png-dir=/Data/apps/libs --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt=/Data/apps/libs --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --enable-opcache --with-pdo-mysql --enable-maintainer-zts
make clean
make
make install

unzip pthreads-master.zip
cd pthreads-master
/Data/apps/php/bin/phpize
./configure --with-php-config=/Data/apps/php/bin/php-config
make
make install
  添加扩展:
  vi /Data/apps/php/etc/php.ini
  extension = "pthreads.so"
  一段PHP多线程的代码示例,以及For循环,抓取百度搜索页面,代码如下:
  以采集数据为例,代码如下:
  教程链接:
  欢迎转载~但请保留教程地址 查看全部

  php多线程抓取网页(PHP5.3以上版本,使用pthreads抓取信息测试例子)
  只有在php5.3及以后的版本中才能真正使用多线程程序。以前是fake curl实现的多线程工作。给大家介绍几个多线程爬取的资料。测试例子,希望对大家有帮助。
  PHP 5.3 及以上,使用pthreads PHP扩展,可以让PHP真正支持多线程。多线程是处理重复的循环任务,可以大大缩短程序的执行时间。
  PHP 扩展下载:
  PHP 手册文档:
  1、Linux的扩展编译安装,编辑参数--enable-maintainer-zts为必选项:
  cd /Data/tgz/php-5.3.8
./configure --prefix=/Data/apps/php --with-config-file-path=/Data/apps/php/etc --with-mysql=/Data/apps/mysql --with-mysqli=/Data/apps/mysql/bin/mysql_config --with-iconv-dir --with-freetype-dir=/Data/apps/libs --with-jpeg-dir=/Data/apps/libs --with-png-dir=/Data/apps/libs --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt=/Data/apps/libs --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --enable-opcache --with-pdo-mysql --enable-maintainer-zts
make clean
make
make install

unzip pthreads-master.zip
cd pthreads-master
/Data/apps/php/bin/phpize
./configure --with-php-config=/Data/apps/php/bin/php-config
make
make install
  添加扩展:
  vi /Data/apps/php/etc/php.ini
  extension = "pthreads.so"
  一段PHP多线程的代码示例,以及For循环,抓取百度搜索页面,代码如下:
  以采集数据为例,代码如下:
  教程链接:
  欢迎转载~但请保留教程地址

php多线程抓取网页(推荐手册:php完全自学手册(pthreads)(组图))

网站优化优采云 发表了文章 • 0 个评论 • 46 次浏览 • 2021-12-04 08:04 • 来自相关话题

  php多线程抓取网页(推荐手册:php完全自学手册(pthreads)(组图))
  php中可以实现多线程,是利用老的exec函数通过异步处理实现多线程的一种方式。exec 函数本身是一个执行外部程序的php 函数。下面我们来详细看看php多线程的实现。
  推荐手册:php完全自学手册
  
  我们先来看一个例子
  当执行上述操作时,甚至在耗时处理结束之前显示处理完成。
  exec("php static_massive.php > /dev/null &");
  由于 "&gt;/dev/null&amp;" 返回的值缺失,我们不会等待响应。
  因此,处理完成指示比耗时处理更快。
  但是,这种方法不知道耗时的过程何时结束。
  不要忘记考虑日志的执行、登录DB等方式将执行结果交付给用户。
  多线程方法(pthreads)
  最后介绍了PHP扩展模块pthreads的使用方法。
  它可以比使用exec的上述方法更简单。
  ①配置环境并安装php
  请使用 vagrant 准备自己喜欢的环境。
  php需要使用线程安全的版本,是多线程和安全的实现。
  从官方网站下载线程安全版本的 PHP。
  访问下面的内容并从图片中的红色框中下载。
  
  此外,对于线程安全安装,您需要使用配置选项指定 -enable-maintainer-zts。
  ./configure --enable-maintainer-zts
  根据需要,您还可以安装 Apache 和 mysql 的选项。
  使用以下命令确认 php 版本。
  php -v
  ②pthreads的安装
  让我们下载zip格式。
  解压zip,移动到解压文件,执行phpize。
  如果您在 PHP 模块列表上运行 pthreads,您可以执行以下操作。
  php -m
  根据环境的不同,此块的设置会有所不同。可以用环境名+pthreads等方式搜索信息。
  ③尝试使用多线程
  例子如下
  因为 sleep(5) 被调用两次,需要10秒,但实际上会是5秒。 查看全部

  php多线程抓取网页(推荐手册:php完全自学手册(pthreads)(组图))
  php中可以实现多线程,是利用老的exec函数通过异步处理实现多线程的一种方式。exec 函数本身是一个执行外部程序的php 函数。下面我们来详细看看php多线程的实现。
  推荐手册:php完全自学手册
  
  我们先来看一个例子
  当执行上述操作时,甚至在耗时处理结束之前显示处理完成。
  exec("php static_massive.php > /dev/null &");
  由于 "&gt;/dev/null&amp;" 返回的值缺失,我们不会等待响应。
  因此,处理完成指示比耗时处理更快。
  但是,这种方法不知道耗时的过程何时结束。
  不要忘记考虑日志的执行、登录DB等方式将执行结果交付给用户。
  多线程方法(pthreads)
  最后介绍了PHP扩展模块pthreads的使用方法。
  它可以比使用exec的上述方法更简单。
  ①配置环境并安装php
  请使用 vagrant 准备自己喜欢的环境。
  php需要使用线程安全的版本,是多线程和安全的实现。
  从官方网站下载线程安全版本的 PHP。
  访问下面的内容并从图片中的红色框中下载。
  
  此外,对于线程安全安装,您需要使用配置选项指定 -enable-maintainer-zts。
  ./configure --enable-maintainer-zts
  根据需要,您还可以安装 Apache 和 mysql 的选项。
  使用以下命令确认 php 版本。
  php -v
  ②pthreads的安装
  让我们下载zip格式。
  解压zip,移动到解压文件,执行phpize。
  如果您在 PHP 模块列表上运行 pthreads,您可以执行以下操作。
  php -m
  根据环境的不同,此块的设置会有所不同。可以用环境名+pthreads等方式搜索信息。
  ③尝试使用多线程
  例子如下
  因为 sleep(5) 被调用两次,需要10秒,但实际上会是5秒。

php多线程抓取网页( PHPCurlFunctions例子(一)-上海怡健医学)

网站优化优采云 发表了文章 • 0 个评论 • 68 次浏览 • 2021-11-26 12:13 • 来自相关话题

  php多线程抓取网页(
PHPCurlFunctions例子(一)-上海怡健医学)
  PHP结合curl实现多线程爬取
  PHP结合curl实现多线程爬取
  让我们再看几个例子
  (1)下面这段代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  
$urls = array(
'/',
'http://www.google.com/',
'http://www.example.com/'
); // 设置要抓取的页面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)下面的代码和上面的意思一样,只不过这个地方先把获取的代码放入变量中,然后将获取的内容写入指定的文件
  
$urls = array(
'/',
'http://www.google.com/',
'http://www.example.com/'
);
$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 Functions实现文件的并发多线程下载
  
$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多线程抓取网页(
PHPCurlFunctions例子(一)-上海怡健医学)
  PHP结合curl实现多线程爬取
  PHP结合curl实现多线程爬取
  让我们再看几个例子
  (1)下面这段代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  
$urls = array(
'/',
'http://www.google.com/',
'http://www.example.com/'
); // 设置要抓取的页面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)下面的代码和上面的意思一样,只不过这个地方先把获取的代码放入变量中,然后将获取的内容写入指定的文件
  
$urls = array(
'/',
'http://www.google.com/',
'http://www.example.com/'
);
$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 Functions实现文件的并发多线程下载
  
$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多线程抓取网页(PHP5.3以上版本,使用pthreads抓取信息测试例子)

网站优化优采云 发表了文章 • 0 个评论 • 54 次浏览 • 2021-11-26 12:11 • 来自相关话题

  php多线程抓取网页(PHP5.3以上版本,使用pthreads抓取信息测试例子)
  只有在php5.3及以后的版本中才能真正使用多线程程序。以前是fake curl实现的多线程工作。给大家介绍几个多线程爬取的资料。测试例子,希望对大家有帮助。
  PHP 5.3 及以上,使用pthreads PHP扩展,可以让PHP真正支持多线程。多线程是处理重复的循环任务,可以大大缩短程序的执行时间。
  PHP 扩展下载:
  PHP 手册文档:
  1、Linux的扩展编译安装,编辑参数--enable-maintainer-zts为必选项:
  cd /Data/tgz/php-5.3.8
./configure --prefix=/Data/apps/php --with-config-file-path=/Data/apps/php/etc --with-mysql=/Data/apps/mysql --with-mysqli=/Data/apps/mysql/bin/mysql_config --with-iconv-dir --with-freetype-dir=/Data/apps/libs --with-jpeg-dir=/Data/apps/libs --with-png-dir=/Data/apps/libs --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt=/Data/apps/libs --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --enable-opcache --with-pdo-mysql --enable-maintainer-zts
make clean
make
make install

unzip pthreads-master.zip
cd pthreads-master
/Data/apps/php/bin/phpize
./configure --with-php-config=/Data/apps/php/bin/php-config
make
make install
  添加扩展:
  vi /Data/apps/php/etc/php.ini
  extension = "pthreads.so"
  一段PHP多线程的代码示例,以及For循环,抓取百度搜索页面,代码如下:
  以采集数据为例,代码如下:
  教程链接:
  欢迎转载~但请保留教程地址 查看全部

  php多线程抓取网页(PHP5.3以上版本,使用pthreads抓取信息测试例子)
  只有在php5.3及以后的版本中才能真正使用多线程程序。以前是fake curl实现的多线程工作。给大家介绍几个多线程爬取的资料。测试例子,希望对大家有帮助。
  PHP 5.3 及以上,使用pthreads PHP扩展,可以让PHP真正支持多线程。多线程是处理重复的循环任务,可以大大缩短程序的执行时间。
  PHP 扩展下载:
  PHP 手册文档:
  1、Linux的扩展编译安装,编辑参数--enable-maintainer-zts为必选项:
  cd /Data/tgz/php-5.3.8
./configure --prefix=/Data/apps/php --with-config-file-path=/Data/apps/php/etc --with-mysql=/Data/apps/mysql --with-mysqli=/Data/apps/mysql/bin/mysql_config --with-iconv-dir --with-freetype-dir=/Data/apps/libs --with-jpeg-dir=/Data/apps/libs --with-png-dir=/Data/apps/libs --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt=/Data/apps/libs --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --enable-opcache --with-pdo-mysql --enable-maintainer-zts
make clean
make
make install

unzip pthreads-master.zip
cd pthreads-master
/Data/apps/php/bin/phpize
./configure --with-php-config=/Data/apps/php/bin/php-config
make
make install
  添加扩展:
  vi /Data/apps/php/etc/php.ini
  extension = "pthreads.so"
  一段PHP多线程的代码示例,以及For循环,抓取百度搜索页面,代码如下:
  以采集数据为例,代码如下:
  教程链接:
  欢迎转载~但请保留教程地址

php多线程抓取网页(PHP利用CurlFunctions实现并发多线程抓取网页或者下载文件操作)

网站优化优采云 发表了文章 • 0 个评论 • 54 次浏览 • 2021-11-23 14:23 • 来自相关话题

  php多线程抓取网页(PHP利用CurlFunctions实现并发多线程抓取网页或者下载文件操作)
  PHP可以使用Curl Functions完成各种文件传输操作,比如模拟浏览器发送GET、POST请求等,但是由于PHP语言本身不支持多线程,开发爬虫程序的效率不高,所以卷曲多功能是经常需要的。该功能可以实现多线程并发访问多个URL地址,实现多线程并发抓取网页或下载文件。具体实现过程请参考以下示例:
  (1)下面这段代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  <p>$urls = array( 'http://www.scutephp.com/', <br />'http://www.google.com/', <br />'http://www.example.com/' <br />); // 设置要抓取的页面URL <br />$save_to='/test.txt'; // 把抓取的代码写入该文件 <br />$st = fopen($save_to,"a"); <br />$mh = curl_multi_init(); <br />foreach ($urls as $i => $url) { <br />$conn[$i] = curl_init($url); <br />curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"); <br />curl_setopt($conn[$i], CURLOPT_HEADER ,0); <br />curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60); <br />curl_setopt($conn[$i], CURLOPT_FILE,$st); // 将爬取的代码写入文件 <br />curl_multi_add_handle ($mh,$conn[$i]); <br />} // 初始化 <br />do { <br />curl_multi_exec($mh,$active); <br />} while ($active); // 执行 <br />foreach ($urls as $i => $url) { <br />curl_multi_remove_handle($mh,$conn[$i]); <br />curl_close($conn[$i]); <br />} // 结束清理 <br />curl_multi_close($mh); <br />
  fclose($st);
  (2)下面的代码和上面的意思一样,只不过这个地方先把获取的代码放入变量中,然后将获取的内容写入指定的文件
  <p>$urls = array( 'http://www.scutephp.com/', <br />'http://www.google.com/', <br />'http://www.example.com/' <br />); <br />$save_to='/test.txt'; // 把抓取的代码写入该文件 <br />$st = fopen($save_to,"a"); <br />$mh = curl_multi_init(); <br />foreach ($urls as $i => $url) { <br />$conn[$i] = curl_init($url); <br />curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"); <br />curl_setopt($conn[$i], CURLOPT_HEADER ,0); <br />curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60); <br />curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,true); // 不将爬取代码写到浏览器,而是转化为字符串 <br />curl_multi_add_handle ($mh,$conn[$i]); <br />} <br />do { <br />curl_multi_exec($mh,$active); <br />} while ($active); <br />foreach ($urls as $i => $url) { <br />$data = curl_multi_getcontent($conn[$i]); // 获得爬取的代码字符串 <br />fwrite($st,$data); // 将字符串写入文件<br />} // 获得数据变量,并写入文件 <br />foreach ($urls as $i => $url) { <br />curl_multi_remove_handle($mh,$conn[$i]); <br />curl_close($conn[$i]); <br />}<br />curl_multi_close($mh); <br />
  fclose($st);
  (3) 下面一段代码实现了使用PHP的Curl Functions实现文件的并发多线程下载
  <p>$urls=array( 'http://www.scutephp.com/5w.zip',<br /> 'http://www.scutephp.com/5w.zip',<br /> 'http://www.scutephp.com/5w.zip'<br />);<br />$save_to='./home/';<br />$mh=curl_multi_init();<br />foreach($urls as $i=>$url){<br /> $g=$save_to.basename($url);<br /> if(!is_file($g)){<br /> $conn[$i]=curl_init($url);<br /> $fp[$i]=fopen($g,"w");<br /> curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");<br /> curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);<br /> curl_setopt($conn[$i],CURLOPT_HEADER ,0);<br /> curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);<br /> curl_multi_add_handle($mh,$conn[$i]);<br /> }<br />}<br />do{<br /> $n=curl_multi_exec($mh,$active);<br />}while($active);<br />foreach($urls as $i=>$url){<br /> curl_multi_remove_handle($mh,$conn[$i]);<br /> curl_close($conn[$i]);<br /> fclose($fp[$i]);<br />}<br />curl_multi_close($mh);$urls=array(<br /> 'http://www.scutephp.com/5w.zip',<br /> 'http://www.scutephp.com/5w.zip',<br /> 'http://www.scutephp.com/5w.zip'<br />);<br />$save_to='./home/';<br />$mh=curl_multi_init();<br />foreach($urls as $i=>$url){<br /> $g=$save_to.basename($url);<br /> if(!is_file($g)){<br /> $conn[$i]=curl_init($url);<br /> $fp[$i]=fopen($g,"w");<br /> curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");<br /> curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);<br /> curl_setopt($conn[$i],CURLOPT_HEADER ,0);<br /> curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);<br /> curl_multi_add_handle($mh,$conn[$i]);<br /> }<br />}<br />do{<br /> $n=curl_multi_exec($mh,$active);<br />}while($active);<br />foreach($urls as $i=>$url){<br /> curl_multi_remove_handle($mh,$conn[$i]);<br /> curl_close($conn[$i]);<br /> fclose($fp[$i]);<br />}<br />curl_multi_close($mh);</p>
  
  免责声明:本文原创发表于php中文网。转载请注明出处。感谢您的尊重!如果您有任何疑问,请与我们联系 查看全部

  php多线程抓取网页(PHP利用CurlFunctions实现并发多线程抓取网页或者下载文件操作)
  PHP可以使用Curl Functions完成各种文件传输操作,比如模拟浏览器发送GET、POST请求等,但是由于PHP语言本身不支持多线程,开发爬虫程序的效率不高,所以卷曲多功能是经常需要的。该功能可以实现多线程并发访问多个URL地址,实现多线程并发抓取网页或下载文件。具体实现过程请参考以下示例:
  (1)下面这段代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  <p>$urls = array( 'http://www.scutephp.com/', <br />'http://www.google.com/', <br />'http://www.example.com/' <br />); // 设置要抓取的页面URL <br />$save_to='/test.txt'; // 把抓取的代码写入该文件 <br />$st = fopen($save_to,"a"); <br />$mh = curl_multi_init(); <br />foreach ($urls as $i => $url) { <br />$conn[$i] = curl_init($url); <br />curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"); <br />curl_setopt($conn[$i], CURLOPT_HEADER ,0); <br />curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60); <br />curl_setopt($conn[$i], CURLOPT_FILE,$st); // 将爬取的代码写入文件 <br />curl_multi_add_handle ($mh,$conn[$i]); <br />} // 初始化 <br />do { <br />curl_multi_exec($mh,$active); <br />} while ($active); // 执行 <br />foreach ($urls as $i => $url) { <br />curl_multi_remove_handle($mh,$conn[$i]); <br />curl_close($conn[$i]); <br />} // 结束清理 <br />curl_multi_close($mh); <br />
  fclose($st);
  (2)下面的代码和上面的意思一样,只不过这个地方先把获取的代码放入变量中,然后将获取的内容写入指定的文件
  <p>$urls = array( 'http://www.scutephp.com/', <br />'http://www.google.com/', <br />'http://www.example.com/' <br />); <br />$save_to='/test.txt'; // 把抓取的代码写入该文件 <br />$st = fopen($save_to,"a"); <br />$mh = curl_multi_init(); <br />foreach ($urls as $i => $url) { <br />$conn[$i] = curl_init($url); <br />curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"); <br />curl_setopt($conn[$i], CURLOPT_HEADER ,0); <br />curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60); <br />curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,true); // 不将爬取代码写到浏览器,而是转化为字符串 <br />curl_multi_add_handle ($mh,$conn[$i]); <br />} <br />do { <br />curl_multi_exec($mh,$active); <br />} while ($active); <br />foreach ($urls as $i => $url) { <br />$data = curl_multi_getcontent($conn[$i]); // 获得爬取的代码字符串 <br />fwrite($st,$data); // 将字符串写入文件<br />} // 获得数据变量,并写入文件 <br />foreach ($urls as $i => $url) { <br />curl_multi_remove_handle($mh,$conn[$i]); <br />curl_close($conn[$i]); <br />}<br />curl_multi_close($mh); <br />
  fclose($st);
  (3) 下面一段代码实现了使用PHP的Curl Functions实现文件的并发多线程下载
  <p>$urls=array( 'http://www.scutephp.com/5w.zip',<br /> 'http://www.scutephp.com/5w.zip',<br /> 'http://www.scutephp.com/5w.zip'<br />);<br />$save_to='./home/';<br />$mh=curl_multi_init();<br />foreach($urls as $i=>$url){<br /> $g=$save_to.basename($url);<br /> if(!is_file($g)){<br /> $conn[$i]=curl_init($url);<br /> $fp[$i]=fopen($g,"w");<br /> curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");<br /> curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);<br /> curl_setopt($conn[$i],CURLOPT_HEADER ,0);<br /> curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);<br /> curl_multi_add_handle($mh,$conn[$i]);<br /> }<br />}<br />do{<br /> $n=curl_multi_exec($mh,$active);<br />}while($active);<br />foreach($urls as $i=>$url){<br /> curl_multi_remove_handle($mh,$conn[$i]);<br /> curl_close($conn[$i]);<br /> fclose($fp[$i]);<br />}<br />curl_multi_close($mh);$urls=array(<br /> 'http://www.scutephp.com/5w.zip',<br /> 'http://www.scutephp.com/5w.zip',<br /> 'http://www.scutephp.com/5w.zip'<br />);<br />$save_to='./home/';<br />$mh=curl_multi_init();<br />foreach($urls as $i=>$url){<br /> $g=$save_to.basename($url);<br /> if(!is_file($g)){<br /> $conn[$i]=curl_init($url);<br /> $fp[$i]=fopen($g,"w");<br /> curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");<br /> curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);<br /> curl_setopt($conn[$i],CURLOPT_HEADER ,0);<br /> curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);<br /> curl_multi_add_handle($mh,$conn[$i]);<br /> }<br />}<br />do{<br /> $n=curl_multi_exec($mh,$active);<br />}while($active);<br />foreach($urls as $i=>$url){<br /> curl_multi_remove_handle($mh,$conn[$i]);<br /> curl_close($conn[$i]);<br /> fclose($fp[$i]);<br />}<br />curl_multi_close($mh);</p>
  
  免责声明:本文原创发表于php中文网。转载请注明出处。感谢您的尊重!如果您有任何疑问,请与我们联系

php多线程抓取网页( PHPCurlFunctions例子(一)-上海怡健医学)

网站优化优采云 发表了文章 • 0 个评论 • 71 次浏览 • 2021-11-20 11:09 • 来自相关话题

  php多线程抓取网页(
PHPCurlFunctions例子(一)-上海怡健医学)
  PHP结合curl实现多线程爬取
  让我们再看几个例子
  (1)下面这段代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  
$urls = array(
'http://www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
); // 设置要抓取的页面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)下面的代码和上面的意思一样,只不过这个地方是先把获取到的代码放入变量中,再将获取到的内容写入指定文件
  
$urls = array(
'http://www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
);
$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 Functions实现文件的并发多线程下载
  
$urls=array(
'http://www.jb51.net/5w.zip',
'http://www.jb51.net/5w.zip',
'http://www.jb51.net/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(
'http://www.jb51.net/5w.zip',
'http://www.jb51.net/5w.zip',
'http://www.jb51.net/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多线程抓取网页(
PHPCurlFunctions例子(一)-上海怡健医学)
  PHP结合curl实现多线程爬取
  让我们再看几个例子
  (1)下面这段代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  
$urls = array(
'http://www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
); // 设置要抓取的页面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)下面的代码和上面的意思一样,只不过这个地方是先把获取到的代码放入变量中,再将获取到的内容写入指定文件
  
$urls = array(
'http://www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
);
$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 Functions实现文件的并发多线程下载
  
$urls=array(
'http://www.jb51.net/5w.zip',
'http://www.jb51.net/5w.zip',
'http://www.jb51.net/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(
'http://www.jb51.net/5w.zip',
'http://www.jb51.net/5w.zip',
'http://www.jb51.net/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多线程抓取网页(php多线程抓取网页程序:1.程序设计模式+反射+动态代理)

网站优化优采云 发表了文章 • 0 个评论 • 82 次浏览 • 2021-11-13 14:05 • 来自相关话题

  php多线程抓取网页(php多线程抓取网页程序:1.程序设计模式+反射+动态代理)
  php多线程抓取网页程序:1.程序设计模式+反射+动态代理+序列化+枚举2.搜索引擎结构化数据处理+html自动提取+格式化处理+json处理3.大数据可视化+函数式编程+smarty&jsonwrap+ifactory注释
  关于单线程,要使用windows下shell脚本,或者linux下kickstart脚本,还要知道对应的编程语言是什么,以及是怎么联系的。以下是一些个人经验。linux下面,最好使用kickstart编程语言。他拥有命令行操作的超级vim。不过他本身跟命令行编程也没什么关系,都是linux底层的东西。
  bash的话写些脚本可以这么玩。windows下面,常见的是php,java开发的thinkphp,以及eclipse之类的。然后可以学习linux内核来控制linux服务器。想要好玩,在线网页抓取?。
  单线程就用,多线程就是多线程实现呗,
  首先你要清楚你要在单线程还是多线程下编程。大多数语言都支持多线程编程,所以不用太担心线程的问题。最后,你至少需要掌握php,java这种语言才能开发出一个完整的php或java程序,才能明白如何使用单线程与多线程编程。个人觉得nodejs等不是很稳定的语言在解决编程上的问题上就不是很理想,而php则相对更好些。
  不过,如果你想做出功能比较强大的php或java程序,并且在编程时比较注重面向对象或函数式编程。那你可以考虑nodejs,其实现效率会比java或php好很多的。 查看全部

  php多线程抓取网页(php多线程抓取网页程序:1.程序设计模式+反射+动态代理)
  php多线程抓取网页程序:1.程序设计模式+反射+动态代理+序列化+枚举2.搜索引擎结构化数据处理+html自动提取+格式化处理+json处理3.大数据可视化+函数式编程+smarty&jsonwrap+ifactory注释
  关于单线程,要使用windows下shell脚本,或者linux下kickstart脚本,还要知道对应的编程语言是什么,以及是怎么联系的。以下是一些个人经验。linux下面,最好使用kickstart编程语言。他拥有命令行操作的超级vim。不过他本身跟命令行编程也没什么关系,都是linux底层的东西。
  bash的话写些脚本可以这么玩。windows下面,常见的是php,java开发的thinkphp,以及eclipse之类的。然后可以学习linux内核来控制linux服务器。想要好玩,在线网页抓取?。
  单线程就用,多线程就是多线程实现呗,
  首先你要清楚你要在单线程还是多线程下编程。大多数语言都支持多线程编程,所以不用太担心线程的问题。最后,你至少需要掌握php,java这种语言才能开发出一个完整的php或java程序,才能明白如何使用单线程与多线程编程。个人觉得nodejs等不是很稳定的语言在解决编程上的问题上就不是很理想,而php则相对更好些。
  不过,如果你想做出功能比较强大的php或java程序,并且在编程时比较注重面向对象或函数式编程。那你可以考虑nodejs,其实现效率会比java或php好很多的。

php多线程抓取网页( DOM树结构的解析资源地址保存到文件中的文件地址)

网站优化优采云 发表了文章 • 0 个评论 • 55 次浏览 • 2021-11-12 13:02 • 来自相关话题

  php多线程抓取网页(
DOM树结构的解析资源地址保存到文件中的文件地址)
  #解析首页
def CrawIndexPage(starturl):
print "正在爬取首页"
page = __getpage(starturl)
if page=="error":
return
page = page.decode(&#39;gbk&#39;, &#39;ignore&#39;)
tree = etree.HTML(page)
Nodes = tree.xpath("//p[@id=&#39;menu&#39;]//a")
print "首页解析出地址",len(Nodes),"条"
for node in Nodes:
CrawledURLs = []
CrawledURLs.append(starturl)
url=node.xpath("@href")[0]
if re.match(r&#39;/html/[A-Za-z0-9_/]+/index.html&#39;, url):
if __isexit(host + url,CrawledURLs):
pass
else:
try:
catalog = node.xpath("text()")[0].encode("utf-8")
newdir = "E:/电影资源/" + catalog
os.makedirs(newdir.decode("utf-8"))
print "创建分类目录成功------"+newdir
thread = myThread(host + url, newdir,CrawledURLs)
thread.start()
except:
pass
  在这个函数中,首先下载网页的源代码,通过XPath解析菜单分类信息。并创建相应的文件目录。一个需要注意的地方是编码问题,但是被这个编码纠缠了很久。通过查看网页源代码,我们可以发现网页的编码使用的是GB2312。这里,需要文本信息通过XPath 构造Tree 对象。解码操作,将gb2312改成Unicode编码,使DOM树结构正确,否则后面解析会出问题。
  ②分析各个品类的首页
  # 解析分类文件
def CrawListPage(indexurl,filedir,CrawledURLs):
print "正在解析分类主页资源"
print indexurl
page = __getpage(indexurl)
if page=="error":
return
CrawledURLs.append(indexurl)
page = page.decode(&#39;gbk&#39;, &#39;ignore&#39;)
tree = etree.HTML(page)
Nodes = tree.xpath("//p[@class=&#39;co_content8&#39;]//a")
for node in Nodes:
url=node.xpath("@href")[0]
if re.match(r&#39;/&#39;, url):
# 非分页地址 可以从中解析出视频资源地址
if __isexit(host + url,CrawledURLs):
pass
else:
#文件命名是不能出现以下特殊符号
filename=node.xpath("text()")[0].encode("utf-8").replace("/"," ")\
.replace("\\"," ")\
.replace(":"," ")\
.replace("*"," ")\
.replace("?"," ")\
.replace("\""," ")\
.replace("", " ")\
.replace("|", " ")
CrawlSourcePage(host + url,filedir,filename,CrawledURLs)
pass
else:
# 分页地址 从中嵌套再次解析
print "分页地址 从中嵌套再次解析",url
index = indexurl.rfind("/")
baseurl = indexurl[0:index + 1]
pageurl = baseurl + url
if __isexit(pageurl,CrawledURLs):
pass
else:
print "分页地址 从中嵌套再次解析", pageurl
CrawListPage(pageurl,filedir,CrawledURLs)
pass
pass
  打开每个分类的首页,你会发现都是一样的结构(点击打开例子)。首先解析收录资源 URL 的节点,然后提取名称和 URL。这部分有两点需要注意。一个是因为你想把资源保存在一个txt文件中,但是命名的时候有些特殊符号不能出现,所以需要处理掉。其次,必须处理分页。网站中的数据是以分页的形式显示的,所以如何识别和捕获分页也是很重要的。通过观察发现分页地址前面没有“/”,所以只需要通过正则表达式找出分页地址链接,然后嵌套调用就可以解决分页问题。
  ③解析资源地址并保存到文件中
  #处理资源页面 爬取资源地址
def CrawlSourcePage(url,filedir,filename,CrawledURLs):
print url
page = __getpage(url)
if page=="error":
return
CrawledURLs.append(url)
page = page.decode(&#39;gbk&#39;, &#39;ignore&#39;)
tree = etree.HTML(page)
Nodes = tree.xpath("//p[@align=&#39;left&#39;]//table//a")
try:
source = filedir + "/" + filename + ".txt"
f = open(source.decode("utf-8"), &#39;w&#39;)
for node in Nodes:
sourceurl = node.xpath("text()")[0]
f.write(sourceurl.encode("utf-8")+"\n")
f.close()
except:
print "!!!!!!!!!!!!!!!!!"
  这一段比较简单,把提取的内容写入文件
  为了提高程序的效率,采用了多线程爬取。这里我为每个分类首页都开了一个线程,大大加快了爬虫的效率。一开始只是用单线程跑,结果等了一下午,最后因为一个没有处理的异常跑掉了。!!!疲劳的
  class myThread (threading.Thread): #继承父类threading.Thread
def __init__(self, url, newdir,CrawledURLs):
threading.Thread.__init__(self)
self.url = url
self.newdir = newdir
self.CrawledURLs=CrawledURLs
def run(self): #把要执行的代码写到run函数里面 线程在创建后会直接运行run函数
CrawListPage(self.url, self.newdir,self.CrawledURLs)
  以上只是部分代码,所有代码都可以在GitHub上下载(点我跳转)
  最终的爬取结果如下。
  
  
  
  以上就是小编为大家使用Python多线程爬虫对电影天堂资源进行爬取的介绍。我希望它会对你有所帮助。如果您有任何问题,请给我留言。小编会及时回复您。非常感谢您对PHP中文网站的支持!
  更多Python多线程爬虫爬取电影天堂资源相关文章请关注PHP中文网!
  
  免责声明:本文原创发表于php中文网。转载请注明出处。感谢您的尊重!如果您有任何疑问,请与我们联系 查看全部

  php多线程抓取网页(
DOM树结构的解析资源地址保存到文件中的文件地址)
  #解析首页
def CrawIndexPage(starturl):
print "正在爬取首页"
page = __getpage(starturl)
if page=="error":
return
page = page.decode(&#39;gbk&#39;, &#39;ignore&#39;)
tree = etree.HTML(page)
Nodes = tree.xpath("//p[@id=&#39;menu&#39;]//a")
print "首页解析出地址",len(Nodes),"条"
for node in Nodes:
CrawledURLs = []
CrawledURLs.append(starturl)
url=node.xpath("@href")[0]
if re.match(r&#39;/html/[A-Za-z0-9_/]+/index.html&#39;, url):
if __isexit(host + url,CrawledURLs):
pass
else:
try:
catalog = node.xpath("text()")[0].encode("utf-8")
newdir = "E:/电影资源/" + catalog
os.makedirs(newdir.decode("utf-8"))
print "创建分类目录成功------"+newdir
thread = myThread(host + url, newdir,CrawledURLs)
thread.start()
except:
pass
  在这个函数中,首先下载网页的源代码,通过XPath解析菜单分类信息。并创建相应的文件目录。一个需要注意的地方是编码问题,但是被这个编码纠缠了很久。通过查看网页源代码,我们可以发现网页的编码使用的是GB2312。这里,需要文本信息通过XPath 构造Tree 对象。解码操作,将gb2312改成Unicode编码,使DOM树结构正确,否则后面解析会出问题。
  ②分析各个品类的首页
  # 解析分类文件
def CrawListPage(indexurl,filedir,CrawledURLs):
print "正在解析分类主页资源"
print indexurl
page = __getpage(indexurl)
if page=="error":
return
CrawledURLs.append(indexurl)
page = page.decode(&#39;gbk&#39;, &#39;ignore&#39;)
tree = etree.HTML(page)
Nodes = tree.xpath("//p[@class=&#39;co_content8&#39;]//a")
for node in Nodes:
url=node.xpath("@href")[0]
if re.match(r&#39;/&#39;, url):
# 非分页地址 可以从中解析出视频资源地址
if __isexit(host + url,CrawledURLs):
pass
else:
#文件命名是不能出现以下特殊符号
filename=node.xpath("text()")[0].encode("utf-8").replace("/"," ")\
.replace("\\"," ")\
.replace(":"," ")\
.replace("*"," ")\
.replace("?"," ")\
.replace("\""," ")\
.replace("", " ")\
.replace("|", " ")
CrawlSourcePage(host + url,filedir,filename,CrawledURLs)
pass
else:
# 分页地址 从中嵌套再次解析
print "分页地址 从中嵌套再次解析",url
index = indexurl.rfind("/")
baseurl = indexurl[0:index + 1]
pageurl = baseurl + url
if __isexit(pageurl,CrawledURLs):
pass
else:
print "分页地址 从中嵌套再次解析", pageurl
CrawListPage(pageurl,filedir,CrawledURLs)
pass
pass
  打开每个分类的首页,你会发现都是一样的结构(点击打开例子)。首先解析收录资源 URL 的节点,然后提取名称和 URL。这部分有两点需要注意。一个是因为你想把资源保存在一个txt文件中,但是命名的时候有些特殊符号不能出现,所以需要处理掉。其次,必须处理分页。网站中的数据是以分页的形式显示的,所以如何识别和捕获分页也是很重要的。通过观察发现分页地址前面没有“/”,所以只需要通过正则表达式找出分页地址链接,然后嵌套调用就可以解决分页问题。
  ③解析资源地址并保存到文件中
  #处理资源页面 爬取资源地址
def CrawlSourcePage(url,filedir,filename,CrawledURLs):
print url
page = __getpage(url)
if page=="error":
return
CrawledURLs.append(url)
page = page.decode(&#39;gbk&#39;, &#39;ignore&#39;)
tree = etree.HTML(page)
Nodes = tree.xpath("//p[@align=&#39;left&#39;]//table//a")
try:
source = filedir + "/" + filename + ".txt"
f = open(source.decode("utf-8"), &#39;w&#39;)
for node in Nodes:
sourceurl = node.xpath("text()")[0]
f.write(sourceurl.encode("utf-8")+"\n")
f.close()
except:
print "!!!!!!!!!!!!!!!!!"
  这一段比较简单,把提取的内容写入文件
  为了提高程序的效率,采用了多线程爬取。这里我为每个分类首页都开了一个线程,大大加快了爬虫的效率。一开始只是用单线程跑,结果等了一下午,最后因为一个没有处理的异常跑掉了。!!!疲劳的
  class myThread (threading.Thread): #继承父类threading.Thread
def __init__(self, url, newdir,CrawledURLs):
threading.Thread.__init__(self)
self.url = url
self.newdir = newdir
self.CrawledURLs=CrawledURLs
def run(self): #把要执行的代码写到run函数里面 线程在创建后会直接运行run函数
CrawListPage(self.url, self.newdir,self.CrawledURLs)
  以上只是部分代码,所有代码都可以在GitHub上下载(点我跳转)
  最终的爬取结果如下。
  
  
  
  以上就是小编为大家使用Python多线程爬虫对电影天堂资源进行爬取的介绍。我希望它会对你有所帮助。如果您有任何问题,请给我留言。小编会及时回复您。非常感谢您对PHP中文网站的支持!
  更多Python多线程爬虫爬取电影天堂资源相关文章请关注PHP中文网!
  
  免责声明:本文原创发表于php中文网。转载请注明出处。感谢您的尊重!如果您有任何疑问,请与我们联系

php多线程抓取网页(比较,结合实例形式详细分析了curl_init()和curl)

网站优化优采云 发表了文章 • 0 个评论 • 59 次浏览 • 2021-11-11 19:11 • 来自相关话题

  php多线程抓取网页(比较,结合实例形式详细分析了curl_init()和curl)
  本文文章主要介绍php使用curl_init()和curl_multi_init()多线程的速度对比。结合示例形式,详细分析了 curl_init() 和 curl_multi_init() 的具体使用方法和相关效率对比。有需要的朋友可以参考
  本文介绍了 PHP 使用 curl_init() 和 curl_multi_init() 多线程的速度对比。分享给大家,供大家参考,如下:
  php中curl_init()的作用很棒,尤其是在爬取网页内容或者文件信息的时候。比如之前的文章《》介绍了curl_init()的强大。
  curl_init() 以单线程模式处理事情。如果需要使用多线程模式进行事务处理,那么php为我们提供了一个函数curl_multi_init(),就是多线程模式处理事务的功能。
  curl_init() 和 curl_multi_init() 速度对比
  curl_multi_init() 多线程可以提高网页的处理速度吗?今天我将通过实验来验证这个问题。
  我今天的测试很简单,就是抓取网页内容,连续抓取5次,分别使用curl_init()和curl_multi_init()函数来完成,记录下两者的耗时,将它们比较得出结论。
  首先,使用 curl_init() 在单个线程中抓取网页内容 5 次。
  程序代码如下:
  然后,使用 curl_multi_init() 多线程连续抓取网页内容 5 次。
  代码显示如下:
<p> 查看全部

  php多线程抓取网页(比较,结合实例形式详细分析了curl_init()和curl)
  本文文章主要介绍php使用curl_init()和curl_multi_init()多线程的速度对比。结合示例形式,详细分析了 curl_init() 和 curl_multi_init() 的具体使用方法和相关效率对比。有需要的朋友可以参考
  本文介绍了 PHP 使用 curl_init() 和 curl_multi_init() 多线程的速度对比。分享给大家,供大家参考,如下:
  php中curl_init()的作用很棒,尤其是在爬取网页内容或者文件信息的时候。比如之前的文章《》介绍了curl_init()的强大。
  curl_init() 以单线程模式处理事情。如果需要使用多线程模式进行事务处理,那么php为我们提供了一个函数curl_multi_init(),就是多线程模式处理事务的功能。
  curl_init() 和 curl_multi_init() 速度对比
  curl_multi_init() 多线程可以提高网页的处理速度吗?今天我将通过实验来验证这个问题。
  我今天的测试很简单,就是抓取网页内容,连续抓取5次,分别使用curl_init()和curl_multi_init()函数来完成,记录下两者的耗时,将它们比较得出结论。
  首先,使用 curl_init() 在单个线程中抓取网页内容 5 次。
  程序代码如下:
  然后,使用 curl_multi_init() 多线程连续抓取网页内容 5 次。
  代码显示如下:
<p>

php多线程抓取网页(PHP利用CurlFunctions实现并发多线程抓取网页或者下载文件操作 )

网站优化优采云 发表了文章 • 0 个评论 • 54 次浏览 • 2021-11-08 15:19 • 来自相关话题

  php多线程抓取网页(PHP利用CurlFunctions实现并发多线程抓取网页或者下载文件操作
)
  PHP可以使用Curl Functions来完成各种文件传输操作,比如模拟浏览器发送GET、POST请求等,但是由于PHP语言本身不支持多线程,开发爬虫程序的效率不高,所以经常需要卷曲多功能。该功能可以实现多线程并发访问多个URL地址,实现多线程并发抓取网页或下载文件。具体实现过程请参考以下示例:
  (1)下面这段代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  $urls = array(
&#39;http://www.lefts.cn/&#39;,
&#39;http://www.google.com/&#39;,
&#39;http://www.example.com/&#39;
); // 设置要抓取的页面URL
$save_to=&#39;/test.txt&#39;; // 把抓取的代码写入该文件
$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)下面的代码和上面的意思一样,只不过这个地方先把获取到的代码放入变量中,然后将获取到的内容写入指定文件
  (3)下面这段代码实现了使用PHP的Curl Functions实现文件的并发多线程下载
  $urls=array(
&#39;http://www.lefts.cn/5w.zip&#39;,
&#39;http://www.lefts.cn/5w.zip&#39;,
&#39;http://www.lefts.cn/5w.zip&#39;
);
$save_to=&#39;./home/&#39;;
$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(
&#39;http://www.lefts.cn/5w.zip&#39;,
&#39;http://www.lefts.cn/5w.zip&#39;,
&#39;http://www.lefts.cn/5w.zip&#39;
);
$save_to=&#39;./home/&#39;;
$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多线程抓取网页(PHP利用CurlFunctions实现并发多线程抓取网页或者下载文件操作
)
  PHP可以使用Curl Functions来完成各种文件传输操作,比如模拟浏览器发送GET、POST请求等,但是由于PHP语言本身不支持多线程,开发爬虫程序的效率不高,所以经常需要卷曲多功能。该功能可以实现多线程并发访问多个URL地址,实现多线程并发抓取网页或下载文件。具体实现过程请参考以下示例:
  (1)下面这段代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  $urls = array(
&#39;http://www.lefts.cn/&#39;,
&#39;http://www.google.com/&#39;,
&#39;http://www.example.com/&#39;
); // 设置要抓取的页面URL
$save_to=&#39;/test.txt&#39;; // 把抓取的代码写入该文件
$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)下面的代码和上面的意思一样,只不过这个地方先把获取到的代码放入变量中,然后将获取到的内容写入指定文件
  (3)下面这段代码实现了使用PHP的Curl Functions实现文件的并发多线程下载
  $urls=array(
&#39;http://www.lefts.cn/5w.zip&#39;,
&#39;http://www.lefts.cn/5w.zip&#39;,
&#39;http://www.lefts.cn/5w.zip&#39;
);
$save_to=&#39;./home/&#39;;
$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(
&#39;http://www.lefts.cn/5w.zip&#39;,
&#39;http://www.lefts.cn/5w.zip&#39;,
&#39;http://www.lefts.cn/5w.zip&#39;
);
$save_to=&#39;./home/&#39;;
$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多线程抓取网页( PHP中文网Functions例子(1)--代码的尊重)

网站优化优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2021-11-07 03:26 • 来自相关话题

  php多线程抓取网页(
PHP中文网Functions例子(1)--代码的尊重)
  PHP结合curl实现多线程爬取
  让我们再看几个例子
  (1)下面这段代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  $urls = array(
&#39;http://www.php.cn/&#39;,
&#39;http://www.google.com/&#39;,
&#39;http://www.example.com/&#39;
); // 设置要抓取的页面URL
$save_to=&#39;/test.txt&#39;; // 把抓取的代码写入该文件
$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)下面的代码和上面的意思一样,只不过这个地方是先把获取到的代码放入变量中,再将获取到的内容写入指定文件
  $urls = array(
&#39;http://www.php.cn/&#39;,
&#39;http://www.google.com/&#39;,
&#39;http://www.example.com/&#39;
);
$save_to=&#39;/test.txt&#39;; // 把抓取的代码写入该文件
$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 Functions实现文件的并发多线程下载
  $urls=array(
&#39;http://www.php.cn/5w.zip&#39;,
&#39;http://www.jb51.net/5w.zip&#39;,
&#39;http://www.jb51.net/5w.zip&#39;
);
$save_to=&#39;./home/&#39;;
$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(
&#39;http://www.php.cn/5w.zip&#39;,
&#39;http://www.php.cn/5w.zip&#39;,
&#39;http://www.php.cn/5w.zip&#39;
);
$save_to=&#39;./home/&#39;;
$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实现多线程爬取相关文章请关注PHP中文网!
  
  免责声明:本文原创发表于php中文网。转载请注明出处。感谢您的尊重!如果您有任何疑问,请与我们联系 查看全部

  php多线程抓取网页(
PHP中文网Functions例子(1)--代码的尊重)
  PHP结合curl实现多线程爬取
  让我们再看几个例子
  (1)下面这段代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  $urls = array(
&#39;http://www.php.cn/&#39;,
&#39;http://www.google.com/&#39;,
&#39;http://www.example.com/&#39;
); // 设置要抓取的页面URL
$save_to=&#39;/test.txt&#39;; // 把抓取的代码写入该文件
$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)下面的代码和上面的意思一样,只不过这个地方是先把获取到的代码放入变量中,再将获取到的内容写入指定文件
  $urls = array(
&#39;http://www.php.cn/&#39;,
&#39;http://www.google.com/&#39;,
&#39;http://www.example.com/&#39;
);
$save_to=&#39;/test.txt&#39;; // 把抓取的代码写入该文件
$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 Functions实现文件的并发多线程下载
  $urls=array(
&#39;http://www.php.cn/5w.zip&#39;,
&#39;http://www.jb51.net/5w.zip&#39;,
&#39;http://www.jb51.net/5w.zip&#39;
);
$save_to=&#39;./home/&#39;;
$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(
&#39;http://www.php.cn/5w.zip&#39;,
&#39;http://www.php.cn/5w.zip&#39;,
&#39;http://www.php.cn/5w.zip&#39;
);
$save_to=&#39;./home/&#39;;
$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实现多线程爬取相关文章请关注PHP中文网!
  
  免责声明:本文原创发表于php中文网。转载请注明出处。感谢您的尊重!如果您有任何疑问,请与我们联系

php多线程抓取网页(ip多线程变化,定位网站缓存区和log区,ip变化)

网站优化优采云 发表了文章 • 0 个评论 • 67 次浏览 • 2021-10-29 16:02 • 来自相关话题

  php多线程抓取网页(ip多线程变化,定位网站缓存区和log区,ip变化)
  php多线程抓取网页得到wap和html代码
  我也刚刚入门,见过的抓包问题就是ip多线程变化,定位网站缓存区和log区,ip变化的话,可以尝试从127.0.0.1抓包,后台一定要留痕迹,比如抓取com的值
  打开终端输入如下命令:php--header-list=,抓取com的session,因为其它端口都是动态改变的
  我在安卓上也遇到这个问题,不知道你是在哪抓取的,
  不用修改原来的,php和http协议栈上,
  原来是没有封tcp协议通道导致请求异常
  看看封没封tcp
  看看底部那个缓存的拦截,那里没拦截的话就能在该域名返回时使用开发者工具抓包了。看下是不是没弄sessionfilename(一般会有)之类的,或者在url分发上没弄重点,
  发现wap页在抓取失败的情况下,无法生成请求到相应的html文件。试了好多方法还是不行。
  最新情况:1.将你这个wap链接通过114导出(所有的公开数据都可以导出)2.把最近出现的wap链接全都加上时间戳,用mongodb保存,这样就可以永久保存了3.插到wap开发者模式(首页的一个地方,在你的浏览器中,可以显示链接所有之前已经抓取到的数据),可以更新排名(在chrome中)4.使用公共http2开发的wap抓包工具(比如阿里妈妈抓包王之类的)进行抓包。用户体验应该是最好的。 查看全部

  php多线程抓取网页(ip多线程变化,定位网站缓存区和log区,ip变化)
  php多线程抓取网页得到wap和html代码
  我也刚刚入门,见过的抓包问题就是ip多线程变化,定位网站缓存区和log区,ip变化的话,可以尝试从127.0.0.1抓包,后台一定要留痕迹,比如抓取com的值
  打开终端输入如下命令:php--header-list=,抓取com的session,因为其它端口都是动态改变的
  我在安卓上也遇到这个问题,不知道你是在哪抓取的,
  不用修改原来的,php和http协议栈上,
  原来是没有封tcp协议通道导致请求异常
  看看封没封tcp
  看看底部那个缓存的拦截,那里没拦截的话就能在该域名返回时使用开发者工具抓包了。看下是不是没弄sessionfilename(一般会有)之类的,或者在url分发上没弄重点,
  发现wap页在抓取失败的情况下,无法生成请求到相应的html文件。试了好多方法还是不行。
  最新情况:1.将你这个wap链接通过114导出(所有的公开数据都可以导出)2.把最近出现的wap链接全都加上时间戳,用mongodb保存,这样就可以永久保存了3.插到wap开发者模式(首页的一个地方,在你的浏览器中,可以显示链接所有之前已经抓取到的数据),可以更新排名(在chrome中)4.使用公共http2开发的wap抓包工具(比如阿里妈妈抓包王之类的)进行抓包。用户体验应该是最好的。

php多线程抓取网页( 【每日一题】几个例子(1)代码)

网站优化优采云 发表了文章 • 0 个评论 • 76 次浏览 • 2021-10-28 17:09 • 来自相关话题

  php多线程抓取网页(
【每日一题】几个例子(1)代码)
  PHP结合curl实现多线程爬取
  让我们再看几个例子
  (1)下面的代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  
$urls = array(
'//www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
); // 设置要抓取的页面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)下面的代码和上面的意思一样,只不过这个地方先把获取到的代码放入变量中,然后将获取到的内容写入指定文件
  
$urls = array(
'//www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
);
$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(
'//www.jb51.net/5w.zip',
'//www.jb51.net/5w.zip',
'//www.jb51.net/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(
'//www.jb51.net/5w.zip',
'//www.jb51.net/5w.zip',
'//www.jb51.net/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多线程抓取网页(
【每日一题】几个例子(1)代码)
  PHP结合curl实现多线程爬取
  让我们再看几个例子
  (1)下面的代码是抓取多个网址,然后将抓取到的网址的页面代码写入指定文件
  
$urls = array(
'//www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
); // 设置要抓取的页面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)下面的代码和上面的意思一样,只不过这个地方先把获取到的代码放入变量中,然后将获取到的内容写入指定文件
  
$urls = array(
'//www.jb51.net/',
'http://www.google.com/',
'http://www.example.com/'
);
$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(
'//www.jb51.net/5w.zip',
'//www.jb51.net/5w.zip',
'//www.jb51.net/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(
'//www.jb51.net/5w.zip',
'//www.jb51.net/5w.zip',
'//www.jb51.net/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);
  以上就是本文的全部内容,希望大家喜欢。

官方客服QQ群

微信人工客服

QQ人工客服


线