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中使用Sockets 从Usenet中获取文件
Jan 10 PHP
PHP备份/还原MySQL数据库的代码
Jan 06 PHP
php新建文件自动编号的思路与实现
Jun 27 PHP
php防注入,表单提交值转义的实现详解
Jun 10 PHP
神盾加密解密教程(二)PHP 神盾解密
Jun 08 PHP
php出现内存位置访问无效错误问题解决方法
Aug 16 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
Oct 30 PHP
使用php的HTTP请求的库Requests实现美女图片墙
Feb 22 PHP
PHP框架Laravel插件Pagination实现自定义分页
Apr 22 PHP
thinkphp5.1 文件引入路径问题及注意事项
Jun 13 PHP
PHP单元测试框架PHPUnit用法详解
Jan 23 PHP
thinkPHP3.2使用RBAC实现权限管理的实现
Aug 27 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
PHP新手上路(十一)
2006/10/09 PHP
遍历指定目录下的所有目录和文件的php代码
2011/11/27 PHP
纯php生成随机密码
2015/10/30 PHP
JS将所有对象s的属性复制给对象r(原生js+jquery)
2014/01/25 Javascript
js jquery ajax的几种用法总结(及优缺点介绍)
2014/01/28 Javascript
DOM基础教程之使用DOM
2015/01/19 Javascript
使用JavaScript刷新网页的方法
2015/06/04 Javascript
JS简单循环遍历json数组的方法
2016/04/22 Javascript
自动化测试读写64位操作系统的注册表
2016/08/15 Javascript
微信小程序开发一键登录 获取session_key和openid实例
2016/11/23 Javascript
详解Vue 普通对象数据更新与 file 对象数据更新
2017/04/26 Javascript
vue iview组件表格 render函数的使用方法详解
2018/03/15 Javascript
jquery.param()实现数组或对象的序列化方法
2018/10/08 jQuery
jQuery实现的模仿雨滴下落动画效果
2018/12/11 jQuery
一次微信小程序内地图的使用实战记录
2019/09/09 Javascript
vue页面更新patch的实现示例
2020/03/25 Javascript
Node Express用法详解【安装、使用、路由、中间件、模板引擎等】
2020/05/13 Javascript
Python调用命令行进度条的方法
2015/05/05 Python
Windows下Python的Django框架环境部署及应用编写入门
2016/03/10 Python
Python字典,函数,全局变量代码解析
2017/12/18 Python
详谈python在windows中的文件路径问题
2018/04/28 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
2019/07/03 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
2019/12/26 Python
pytorch 模拟关系拟合——回归实例
2020/01/14 Python
Python关于__name__属性的含义和作用详解
2020/02/19 Python
Python sklearn库实现PCA教程(以鸢尾花分类为例)
2020/02/24 Python
python如何用matplotlib创建三维图表
2021/01/26 Python
英国最受欢迎的在线隐形眼镜商店:VisionDirect.co.uk
2018/12/06 全球购物
世界上第一个创建了罩杯系统的美国内衣品牌:Maidenform
2019/03/23 全球购物
理工学院学生自我鉴定
2014/02/23 职场文书
爱国演讲稿400字
2014/05/07 职场文书
行政专员岗位职责说明书
2014/09/01 职场文书
医院科室评语
2015/01/04 职场文书
检讨书范文2000字
2015/01/28 职场文书
网络营销实训总结
2015/08/03 职场文书
javascript代码简写的几种常用方式汇总
2021/08/23 Javascript