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应用提速面面观
Oct 09 PHP
一个简单的自动发送邮件系统(一)
Oct 09 PHP
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
Nov 01 PHP
PHP实现一维数组转二维数组的方法
Feb 25 PHP
PHP实现支持SSL连接的SMTP邮件发送类
Mar 05 PHP
smarty高级特性之过滤器的使用方法
Dec 25 PHP
phplist及phpmailer(组合使用)通过gmail发送邮件的配置方法
Mar 30 PHP
LINUX下PHP程序实现WORD文件转化为PDF文件的方法
May 13 PHP
ThinkPHP使用Ueditor的方法详解
May 20 PHP
ThinkPHP框架实现数据增删改
May 07 PHP
php设计模式之工厂模式用法经典实例分析
Sep 20 PHP
PDO实现学生管理系统
Mar 21 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自定义函数之递归删除文件及目录
2010/08/08 PHP
ThinkPHP多表联合查询的常用方法
2020/03/24 PHP
php数组中删除元素之重新索引的方法
2014/09/16 PHP
深入了解PHP中的Array数组和foreach
2016/11/06 PHP
PHP实现一个轻量级容器的方法
2019/01/28 PHP
基于jQuery的仿flash的广告轮播代码
2010/11/04 Javascript
JQuery插件Style定制化方法的分析与比较
2012/05/03 Javascript
Javascript自定义排序 node运行 实例
2013/06/05 Javascript
基于jquery插件实现常见的幻灯片效果
2013/11/01 Javascript
jquery监听div内容的变化具体实现思路
2013/11/04 Javascript
JS文本获得焦点清除文本文字的示例代码
2014/01/13 Javascript
JS基于VML技术实现的五角星礼花效果代码
2015/10/26 Javascript
Bootstrap组件(一)之菜单
2016/05/11 Javascript
Bootstrap布局组件教程之Bootstrap下拉菜单
2016/06/12 Javascript
NodeJS处理Express中异步错误
2017/03/26 NodeJs
Vue2.0用户权限控制解决方案
2017/11/29 Javascript
从parcel.js打包出错到选择nvm的全部过程
2018/01/23 Javascript
浅析vue-router jquery和params传参(接收参数)$router $route的区别
2018/08/03 jQuery
微信小程序使用map组件实现检索(定位位置)周边的POI功能示例
2019/01/23 Javascript
微信小程序开发之转发分享功能
2019/10/22 Javascript
Python中几种操作字符串的方法的介绍
2015/04/09 Python
python中如何使用朴素贝叶斯算法
2017/04/06 Python
关于Python如何避免循环导入问题详解
2017/09/14 Python
python绘制圆柱体的方法
2018/07/02 Python
pygame游戏之旅 调用按钮实现游戏开始功能
2018/11/21 Python
python 中pyqt5 树节点点击实现多窗口切换问题
2019/07/04 Python
python实现的分析并统计nginx日志数据功能示例
2019/12/21 Python
Python的赋值、深拷贝与浅拷贝的区别详解
2020/02/12 Python
pytorch 把图片数据转化成tensor的操作
2021/03/04 Python
一款纯css3实现的竖形二级导航的实例教程
2014/12/11 HTML / CSS
提供世界各地便宜的机票:Sky-tours
2016/07/21 全球购物
Crocs美国官方网站:卡骆驰洞洞鞋
2017/08/04 全球购物
瑞典度假品牌:OAS
2019/05/28 全球购物
xml有哪些解析技术?区别是什么
2016/04/26 面试题
公安局副政委班子个人对照检查材料
2014/10/04 职场文书
学校三八妇女节活动总结
2015/02/06 职场文书