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&amp;mysql(五)
Oct 09 PHP
一个php Mysql类 可以参考学习熟悉下
Jun 21 PHP
php5 图片验证码实现代码
Dec 11 PHP
Blitz templates 最快的PHP模板引擎
Apr 06 PHP
php 编写安全的代码时容易犯的错误小结
May 20 PHP
php自动加载autoload机制示例分享
Feb 20 PHP
PHP邮件发送类PHPMailer用法实例详解
Sep 22 PHP
php实现插入排序
Mar 29 PHP
phpStudy访问速度慢和启动失败的解决办法
Nov 19 PHP
Symfony实现行为和模板中取得request参数的方法
Mar 17 PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
Feb 10 PHP
PHP标准库 (SPL)――Countable用法示例
Jun 05 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中使用__autoload()自动加载未定义类的实现代码
2013/02/06 PHP
使用Zttp简化Guzzle 调用
2017/07/02 PHP
PHP获取日期对应星期、一周日期、星期开始与结束日期的方法
2018/06/22 PHP
javascript 用函数语句和表达式定义函数的区别详解
2014/01/06 Javascript
js关于字符长度限制的问题示例探讨
2014/01/24 Javascript
JavaScript实现简单图片滚动附源码下载
2014/06/17 Javascript
JavaScript实现从数组中选出和等于固定值的n个数
2014/09/03 Javascript
jQuery实现点击该行即可删除HTML表格行
2014/10/17 Javascript
jQuery+CSS实现滑动的标签分栏切换效果
2015/12/17 Javascript
基于JavaScript实现智能右键菜单
2016/03/02 Javascript
webpack+vue.js实现组件化详解
2016/10/12 Javascript
js document.getElementsByClassName的使用介绍与自定义函数
2016/11/25 Javascript
jQuery实现淡入淡出的模态框
2017/02/09 Javascript
webpack2.0搭建前端项目的教程详解
2017/04/05 Javascript
vue修改vue项目运行端口号的方法
2017/08/04 Javascript
vue实现点击当前标签高亮效果【推荐】
2018/06/22 Javascript
Javascript中弹窗confirm与prompt的区别
2018/10/26 Javascript
vue开发环境配置跨域的方法步骤
2019/01/16 Javascript
JavaScript复制变量三种方法实例详解
2020/01/09 Javascript
webpack3.0升级4.0的方法步骤
2020/04/02 Javascript
jQuery是用来干什么的 jquery其实就是一个js框架
2021/02/04 jQuery
Python中asyncore的用法实例
2014/09/29 Python
Python小工具之消耗系统指定大小内存的方法
2018/12/03 Python
在python 中实现运行多条shell命令
2019/01/07 Python
python3+selenium实现qq邮箱登陆并发送邮件功能
2019/01/23 Python
python+opencv边缘提取与各函数参数解析
2020/03/09 Python
深入研究HTML5实现图片压缩上传功能
2016/03/25 HTML / CSS
详解HTML5常用的语义化标签
2019/09/27 HTML / CSS
俄罗斯苹果优质经销商商店:iPort
2020/05/27 全球购物
汽车机修工岗位职责
2014/03/06 职场文书
股东合作协议书
2014/09/12 职场文书
工商局副局长个人对照检查材料
2014/09/25 职场文书
死者家属慰问信
2015/03/24 职场文书
行政撤诉申请书
2015/05/18 职场文书
大学入学感言
2015/08/01 职场文书
导游词之贵州织金洞
2019/10/12 职场文书