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数据库操作方法(MYSQL版)
Jun 08 PHP
php 字符串替换的方法
Jan 10 PHP
深入php函数file_get_contents超时处理的方法详解
Jun 03 PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
Jul 23 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
Aug 23 PHP
PHP中使用CURL获取页面title例子
Jan 07 PHP
php链表用法实例分析
Jul 09 PHP
浅谈PHP中的
Apr 23 PHP
eclipse php wamp配置教程
Jun 30 PHP
PHP中使用OpenSSL生成证书及加密解密
Feb 05 PHP
PHP 实现 WebSocket 协议原理与应用详解
Apr 22 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
Oct 30 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来处理多个提交任务
2008/05/08 PHP
PHP 判断常量,变量和函数是否存在
2009/04/26 PHP
盘点PHP和ASP.NET的10大对比!
2015/12/24 PHP
PHP的Yii框架中YiiBase入口类的扩展写法示例
2016/03/17 PHP
Joomla使用Apache重写模式的方法
2016/05/04 PHP
php 查找数组元素提高效率的方法详解
2017/05/05 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
input+select(multiple) 实现下拉框输入值
2009/05/21 Javascript
防止页面被iframe(兼容IE,Firefox火狐)
2010/07/04 Javascript
Javascript进制转换实例分析
2015/05/14 Javascript
AngularJS 最常用的功能汇总
2016/02/17 Javascript
JavaScript继承与多继承实例分析
2018/05/26 Javascript
vue.js template模板的使用(仿饿了么布局)
2018/08/13 Javascript
vue.js 打包时出现空白页和路径错误问题及解决方法
2019/06/26 Javascript
jquery 时间戳转日期过程详解
2019/10/12 jQuery
Jquery如何使用animation动画效果改变背景色的代码
2020/07/20 jQuery
python 基础学习第二弹 类属性和实例属性
2012/08/27 Python
利用Python2下载单张图片与爬取网页图片实例代码
2017/12/25 Python
python flask安装和命令详解
2019/04/02 Python
Python开发之Nginx+uWSGI+virtualenv多项目部署教程
2019/05/13 Python
python使用sessions模拟登录淘宝的方式
2019/08/16 Python
pandas read_excel()和to_excel()函数解析
2019/09/19 Python
python multiprocessing多进程变量共享与加锁的实现
2019/10/02 Python
python使用numpy实现直方图反向投影示例
2020/01/17 Python
Python模拟FTP文件服务器的操作方法
2020/02/18 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
2020/10/15 Python
JSF的标签库有哪些
2012/04/27 面试题
职业生涯规划怎么写
2013/12/29 职场文书
村庄环境整治方案
2014/05/15 职场文书
2014年教师节活动总结
2014/08/29 职场文书
交通运输局四风问题对照检查材料思想汇报
2014/10/09 职场文书
2015年社区计生工作总结
2015/04/21 职场文书
立案决定书范文
2015/06/24 职场文书
小学音乐课教学反思
2016/02/18 职场文书
解决Navicat for Mysql连接报错1251的问题(连接失败)
2021/05/27 MySQL
浅谈Python中的正则表达式
2021/06/28 Python