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 相关文章推荐
ASP知识讲座四
Oct 09 PHP
提取HTML标签
Oct 09 PHP
五个PHP程序员工具
May 26 PHP
php报表之jpgraph柱状图实例代码
Aug 22 PHP
PHP遍历数组的几种方法
Mar 22 PHP
ThinkPHP文件上传实例教程
Aug 22 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
Jan 08 PHP
php版微信公众号自定义分享内容实现方法
Sep 22 PHP
php求数组全排列,元素所有组合的方法总结
Mar 14 PHP
phpstudy的php版本自由修改的方法
Oct 18 PHP
Swoole4.4协程抢占式调度器详解
May 23 PHP
PHP 使用位运算实现四则运算的代码
Mar 09 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实现redis数据库指定库号迁移的方法
2015/01/14 PHP
关于实现代码语法标亮 dp.SyntaxHighlighter
2007/02/02 Javascript
前淘宝前端开发工程师阿当的PPT中有JS技术理念问题
2010/01/15 Javascript
基于prototype扩展的JavaScript常用函数库
2010/11/30 Javascript
jquery 鼠标滑动显示详情应用示例
2014/01/24 Javascript
DOM 高级编程
2015/05/06 Javascript
jquery日历插件e-calendar升级版
2016/11/10 Javascript
js处理层级数据结构的方法小结
2017/01/17 Javascript
JavaScript阻止表单提交方法(附代码)
2017/08/15 Javascript
使用node.js对音视频文件加密的实例代码
2017/08/30 Javascript
微信web端后退强制刷新功能的实现代码
2018/03/04 Javascript
vue项目动态设置页面title及是否缓存页面的问题
2018/11/08 Javascript
Angular脚手架开发的实现步骤
2019/04/09 Javascript
vue获取时间戳转换为日期格式代码实例
2019/04/17 Javascript
Element-UI+Vue模式使用总结
2020/01/02 Javascript
使用vue实现HTML页面生成图片的方法
2020/03/12 Javascript
vue-cli脚手架的.babelrc文件用法说明
2020/09/11 Javascript
[01:44]剑指西雅图 展望TI之CIS战队专访
2014/06/25 DOTA
Python中的条件判断语句基础学习教程
2016/02/07 Python
Mac 上切换Python多版本
2017/06/17 Python
PyQt5每天必学之带有标签的复选框
2018/04/19 Python
由Python编写的MySQL管理工具代码实例
2019/04/09 Python
PyQt5响应回车事件的方法
2019/06/25 Python
Python安装tar.gz格式文件方法详解
2020/01/19 Python
Python requests.post方法中data与json参数区别详解
2020/04/30 Python
MSC邮轮官方网站:加勒比海、地中海和世界各地的假期
2018/08/27 全球购物
美国宠物美容和宠物用品购物网站:Cherrybrook
2018/12/07 全球购物
数字漫画:comiXology
2020/06/13 全球购物
预备党员党校学习自我评价分享
2013/11/12 职场文书
师说教学反思
2014/02/07 职场文书
保护环境的建议书
2014/03/12 职场文书
放飞梦想演讲稿600字
2014/08/26 职场文书
大学迎新生标语
2014/10/06 职场文书
2015教师见习期工作总结
2014/12/12 职场文书
旗帜观后感
2015/06/08 职场文书
幼儿园六一儿童节主持词
2015/06/30 职场文书