php使用pthreads v3多线程实现抓取新浪新闻信息操作示例


Posted in PHP onFebruary 21, 2020

本文实例讲述了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新闻';

代码如下:

<?php

class DB extends Worker
{
  private static $db;
  private $dsn;
  private $root;
  private $pwd;

  public function __construct($dsn, $root, $pwd)
  {
    $this->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 <= 100; $ix++) {
  $pool->submit(new Sina($ix, $url . $ix));
}

//循环收集垃圾,阻塞主线程,等待子线程结束
while ($pool->collect()) ;
$pool->shutdown();

由于使用到了QueryList,大家可以通过composer进行安装。

composer require jaeger/querylist

不过安装的版本是3.2,在我的php7.2下会有问题,由于each()已经被废弃,所以修改下源码,each()全换成foreach()就好了。

运行结果如下:

php使用pthreads v3多线程实现抓取新浪新闻信息操作示例

数据也保存进了数据库

php使用pthreads v3多线程实现抓取新浪新闻信息操作示例

当然大家也可以再次通过url,拿到具体的页面内容,这里就不做演示了,有兴趣的可以自已去实现。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP数据缓存技术
Feb 14 PHP
PHP注释实例技巧
Oct 03 PHP
通过PHP CLI实现简单的数据库实时监控调度
Jul 01 PHP
Notice: Undefined index: page in E:\PHP\test.php on line 14
Nov 02 PHP
PHP $_FILES函数详解
Mar 09 PHP
PHP编码规范的深入探讨
Jun 06 PHP
PHP.ini安全配置检测工具pcc简单介绍
Jul 02 PHP
php is_writable判断文件是否可写实例代码
Oct 13 PHP
Laravel框架模板加载,分配变量及简单路由功能示例
Jun 11 PHP
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
Apr 15 PHP
php探针不显示内存解决方法
Sep 17 PHP
Laravel框架控制器的request与response用法示例
Sep 30 PHP
php操作redis数据库常见方法实例总结
Feb 20 #PHP
php使用redis的几种常见操作方式和用法示例
Feb 20 #PHP
PHP使用openssl扩展实现加解密方法示例
Feb 20 #PHP
php使用redis的有序集合zset实现延迟队列应用示例
Feb 20 #PHP
解决windows上php xdebug 无法调试的问题
Feb 19 #PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 #PHP
laravel框架select2多选插件初始化默认选中项操作示例
Feb 18 #PHP
You might like
全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
2011/01/06 PHP
PHP在线生成二维码(google api)的实现代码详解
2013/06/04 PHP
thinkphp的CURD和查询方式介绍
2013/12/19 PHP
Codeigniter出现错误提示Error with CACHE directory的解决方案
2014/06/12 PHP
List the Codec Files on a Computer
2007/06/11 Javascript
基于jquery的一个图片hover的插件
2010/04/24 Javascript
jQuery对象和DOM对象使用说明
2010/06/25 Javascript
jQuery bind事件使用详解
2011/05/05 Javascript
这段js代码得节约你多少时间
2011/12/20 Javascript
写自已的js类库需要的核心代码
2012/07/16 Javascript
Jquery获取复选框被选中值的简单方法
2013/07/04 Javascript
Javascript中判断变量是数组还是对象(array还是object)
2013/08/14 Javascript
jquery对table中各数据的增加、保存、删除操作示例
2014/05/14 Javascript
jQuery+CSS3+Html5实现弹出层效果实例代码(附源码下载)
2016/05/16 Javascript
微信小程序mpvue点击按钮获取button值的方法
2019/05/29 Javascript
[58:09]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第三场 6.2
2018/06/03 DOTA
Python抓取京东图书评论数据
2014/08/31 Python
python的pip安装以及使用教程
2018/09/18 Python
用Python和WordCloud绘制词云的实现方法(内附让字体清晰的秘笈)
2019/01/08 Python
Python批量生成幻影坦克图片实例代码
2019/06/04 Python
python按行读取文件并找出其中指定字符串
2019/08/08 Python
Python使用matplotlib绘制Logistic曲线操作示例
2019/11/28 Python
tensorflow 自定义损失函数示例代码
2020/02/05 Python
django处理select下拉表单实例(从model到前端到post到form)
2020/03/13 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
2020/07/03 Python
Python selenium实现断言3种方法解析
2020/09/08 Python
css3 transform导致子元素固定定位变成绝对定位的方法
2020/03/06 HTML / CSS
法国床上用品商店:La Compagnie du lit
2019/12/26 全球购物
Envie de Fraise意大利:法国网上推出的孕妇装品牌
2020/10/18 全球购物
J2EE系统只能是基于web
2015/09/08 面试题
个人简历自我评价
2014/01/06 职场文书
父亲追悼会答谢词
2014/01/17 职场文书
西北政法大学自主招生自荐信
2014/01/29 职场文书
《彩色世界》教学反思
2014/04/12 职场文书
党员领导干部民主生活会批评与自我批评发言
2014/09/28 职场文书
民主生活会剖析材料
2014/09/30 职场文书