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 相关文章推荐
自己前几天写的无限分类类
Feb 14 PHP
PHP中去掉字符串首尾空格的方法
May 19 PHP
Linux下CoreSeek及PHP扩展模块的安装
Sep 23 PHP
解析php通过cookies获取远程网页的指定代码
Jun 25 PHP
PHP中浮点数计算比较及取整不准确的解决方法
Jan 09 PHP
php数组键名技巧小结
Feb 17 PHP
理解PHP中的Session及对Session有效期的控制
Jan 08 PHP
PHP判断文件是否被引入的方法get_included_files用法示例
Nov 29 PHP
Yii框架实现的验证码、登录及退出功能示例
May 20 PHP
php-fpm开启状态统计的方法详解
Jun 23 PHP
redis+php实现微博(三)微博列表功能详解
Sep 23 PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
Dec 13 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
锁定年轻人的双倍活力 星巴克推出星倍醇即饮浓咖啡
2021/03/03 咖啡文化
php 魔术函数使用说明
2010/02/21 PHP
10个实用的PHP代码片段
2011/09/02 PHP
php中unlink()、mkdir()、rmdir()等方法的使用介绍
2012/12/21 PHP
thinkPHP自动验证、自动添加及表单错误问题分析
2016/10/17 PHP
基于jQueryUI和Corethink实现百度的搜索提示功能
2016/11/09 PHP
php_pdo 预处理语句详解
2016/11/21 PHP
JavaScript 判断判断某个对象是Object还是一个Array
2010/01/28 Javascript
js 弹出框 替代浏览器的弹出框
2010/10/29 Javascript
用Jquery.load载入页面实现局部刷新
2014/01/22 Javascript
使用Javascript简单实现图片无缝滚动
2014/12/05 Javascript
JavaScript的9种继承实现方式归纳
2015/05/18 Javascript
coffeescript使用的方式汇总
2015/08/05 Javascript
javascript数据结构之二叉搜索树实现方法
2015/11/25 Javascript
基于AngularJS+HTML+Groovy实现登录功能
2016/02/17 Javascript
JavaScript+html5 canvas实现图片破碎重组动画特效
2016/02/22 Javascript
JS实现图片上传预览功能
2016/11/21 Javascript
微信小程序开发之录音机 音频播放 动画实例 (真机可用)
2016/12/08 Javascript
Vue.js进行查询操作的实例详解
2017/08/25 Javascript
基于jQuery实现图片推拉门动画效果的两种方法
2017/08/26 jQuery
基于node打包可执行文件工具_Pkg使用心得分享
2018/01/24 Javascript
axios简单实现小程序延时loading指示
2018/07/30 Javascript
工作中常用到的ES6语法
2018/09/04 Javascript
vue中多个倒计时实现代码实例
2019/03/27 Javascript
微信小程序实现电子签名并导出图片
2020/05/27 Javascript
windows下Virtualenvwrapper安装教程
2017/12/13 Python
python3如何将docx转换成pdf文件
2018/03/23 Python
Python OpenCV处理图像之图像像素点操作
2018/07/10 Python
python实现动态数组的示例代码
2019/07/15 Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
2019/08/28 Python
python类中super() 的使用解析
2019/12/19 Python
Python打印不合法的文件名
2020/07/31 Python
真正的英国宝藏:Mappin & Webb
2019/05/05 全球购物
系统管理员的职责包括那些?管理的对象是什么?
2016/09/20 面试题
党的群众路线教育实践活动总结报告
2014/04/28 职场文书
论群众路线学习心得体会
2014/10/31 职场文书