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 pcntl_fork和pcntl_fork 的用法
Apr 13 PHP
仿AS3实现PHP 事件机制实现代码
Jan 27 PHP
PHP反转字符串函数strrev()函数的用法
Feb 04 PHP
微信access_token的获取开发示例
Apr 16 PHP
详解PHP中的mb_detect_encoding函数使用方法
Aug 18 PHP
PHP使用http_build_query()构造URL字符串的方法
Apr 02 PHP
一波PHP中cURL库的常见用法代码示例
May 06 PHP
PHP微信支付实例解析
Jul 22 PHP
Yii2验证器(Validator)用法分析
Jul 23 PHP
通过chrome浏览器控制台(Console)进行PHP Debug的方法
Oct 19 PHP
jQuery+php简单实现全选删除的方法
Nov 28 PHP
laravel5.5添加echarts实现画图功能的方法
Oct 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
2006/12/14 PHP
使用 MySQL Date/Time 类型
2008/03/26 PHP
symfony表单与页面实现技巧
2015/01/26 PHP
详解WordPress开发中的get_post与get_posts函数使用
2016/01/04 PHP
PHP whois查询类定义与用法示例
2019/04/03 PHP
js跟随滚动条滚动浮动代码
2009/12/31 Javascript
一个网马的tips实现分析
2010/11/28 Javascript
深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP
2012/01/15 Javascript
json格式的时间显示为正常年月日的方法
2013/09/08 Javascript
在JS中如何调用JSP中的变量
2014/01/22 Javascript
jquery如何把数组变为字符串传到服务端并处理
2014/04/30 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
2016/11/09 Javascript
百度地图API之百度地图退拽标记点获取经纬度的实现代码
2017/01/12 Javascript
带你了解session和cookie作用原理区别和用法
2017/08/14 Javascript
详解Vue微信授权登录前后端分离较为优雅的解决方案
2018/06/29 Javascript
es6 super关键字的理解与应用实例分析
2020/02/15 Javascript
JS实现简单移动端鼠标拖拽
2020/07/23 Javascript
Openlayers实现扩散的动态点(水纹效果)
2020/08/17 Javascript
javascript实现简易计算器功能
2020/09/23 Javascript
使用python删除nginx缓存文件示例(python文件操作)
2014/03/26 Python
Python XML RPC服务器端和客户端实例
2014/11/22 Python
python3基于OpenCV实现证件照背景替换
2018/07/18 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
2019/01/07 Python
浅谈python 中类属性共享的问题
2019/07/02 Python
8种用Python实现线性回归的方法对比详解
2019/07/10 Python
flask框架json数据的拿取和返回操作示例
2019/11/28 Python
美国第二大连锁书店:Books-A-Million
2017/12/28 全球购物
Hotels.com越南:酒店预订
2019/10/29 全球购物
称象教学反思
2014/02/03 职场文书
巡警年度自我鉴定
2014/02/21 职场文书
公司领导九九重阳节发言稿2014
2014/09/25 职场文书
化工厂员工工作总结
2015/10/15 职场文书
高一军训口号
2015/12/25 职场文书
师德培训心得体会2016
2016/01/09 职场文书
2016年国培心得体会及反思
2016/01/13 职场文书
Python基础知识学习之类的继承
2021/05/31 Python