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 相关文章推荐
使用Limit参数优化MySQL查询的方法
Nov 12 PHP
php miniBB中文乱码问题解决方法
Nov 25 PHP
超小PHP小马小结(方便查找后门的朋友)
May 05 PHP
基于PHPExcel的常用方法总结
Jun 13 PHP
php curl post 时出现的问题解决
Jan 30 PHP
php初始化对象和析构函数的简单实例
Mar 11 PHP
php使用iconv中文截断问题的解决方法
Feb 11 PHP
laravel容器延迟加载以及auth扩展详解
Mar 02 PHP
浅谈php错误提示及查错方法
Jul 14 PHP
PhpStorm terminal无法输入命令的解决方法
Oct 09 PHP
php原生导出excel文件的两种方法(推荐)
Nov 19 PHP
探究Laravel使用env函数读取环境变量为null的问题
Dec 06 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
超人钢铁侠联手合作?美漫作家呼吁DC漫威合作联动以抵抗疫情
2020/04/09 欧美动漫
给apache2.2加上mod_encoding模块後 php5.2.0 处理url出现bug
2007/04/12 PHP
一个好用的PHP验证码类实例分享
2013/12/27 PHP
PHP实现HTTP断点续传的方法
2015/06/17 PHP
Yii2使用自带的UploadedFile实现的文件上传
2016/06/20 PHP
PHP多维数组排序array详解
2017/11/21 PHP
JS控件autocomplete 0.11演示及下载 1月5日已更新
2007/01/09 Javascript
Jquery Change与bind事件代码
2011/09/29 Javascript
js实现网页倒计时、网站已运行时间功能的代码3例
2014/04/14 Javascript
JQuery 在线引用及测试引用是否成功
2014/06/24 Javascript
一个小例子解释如何来阻止Jquery事件冒泡
2014/07/17 Javascript
Angularjs编写KindEditor,UEidtor,jQuery指令
2015/01/28 Javascript
基于javascript实现图片切换效果
2016/04/17 Javascript
拥Bootstrap入怀——导航栏篇
2016/05/30 Javascript
js友好的时间返回函数
2016/08/24 Javascript
Javascript实现信息滚动效果
2017/05/18 Javascript
Node接收电子邮件的实例代码
2017/07/21 Javascript
浅谈React中的元素、组件、实例和节点
2018/02/27 Javascript
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
JS 实现发送短信验证码的“59秒后重新发送验证短信”功能
2019/08/23 Javascript
JavaScript闭包原理与用法学习笔记
2020/05/29 Javascript
解决iView Table组件宽度只变大不变小的问题
2020/11/13 Javascript
Python 列表(List)操作方法详解
2014/03/11 Python
python数据结构之二叉树的遍历实例
2014/04/29 Python
13个最常用的Python深度学习库介绍
2017/10/28 Python
pandas 数据实现行间计算的方法
2018/06/08 Python
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
2018/07/18 Python
对python中Json与object转化的方法详解
2018/12/31 Python
PyQt5 实现给窗口设置背景图片的方法
2019/06/13 Python
Python容器类型公共方法总结
2020/08/19 Python
Python如何实现感知器的逻辑电路
2020/12/25 Python
加拿大健康、婴儿和美容产品在线购物:Well.ca
2016/11/30 全球购物
预备党员2014全国两会学习心得体会
2014/03/10 职场文书
党员民主评议个人总结
2014/10/20 职场文书
创业计划书之少年玩具店
2019/09/05 职场文书
Nginx同一个域名配置多个项目的实现方法
2021/03/31 Servers