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安装为Apache DSO
Oct 09 PHP
浅析PHP水印技术
Feb 14 PHP
php pki加密技术(openssl)详解
Jul 01 PHP
PHP函数之日期时间函数date()使用详解
Sep 09 PHP
php中的boolean(布尔)类型详解
Oct 28 PHP
PHP常用函数和常见疑难问题解答
Mar 05 PHP
ThinkPHP中的系统常量和预定义常量集合
Jul 01 PHP
PHP中捕获超时事件的方法实例
Feb 12 PHP
cakephp常见知识点汇总
Feb 24 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
Aug 23 PHP
Laravel 数据库加密及数据库表前缀配置方法
Oct 10 PHP
PHP手机号码及邮箱正则表达式实例解析
Jul 11 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 4.2书写安全的脚本
2006/10/09 PHP
php 页面执行时间计算代码
2008/12/04 PHP
thinkPHP中验证码的简单实现方法
2016/12/05 PHP
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
2011/06/02 Javascript
动态的创建一个元素createElement及删除一个元素
2014/01/24 Javascript
JS的参数传递示例介绍
2014/02/08 Javascript
JS简单设置下拉选择框默认值的方法
2016/08/20 Javascript
前端程序员必须知道的高性能Javascript知识
2016/08/24 Javascript
jQuery EasyUI Panel面板组件使用详解
2017/02/28 Javascript
vue 1.x 交互实现仿百度下拉列表示例
2017/10/21 Javascript
vue.js分页中单击页码更换页面内容的方法(配合spring springmvc)
2018/02/10 Javascript
使用Angular CLI生成路由的方法
2018/03/24 Javascript
基于vue.js中关于下拉框的值默认及绑定问题
2018/08/22 Javascript
让webpack+vue-cil项目不再自动打开浏览器的方法
2018/09/27 Javascript
监控微信小程序中的慢HTTP请求过程详解
2019/07/05 Javascript
JavaScript使用表单元素验证表单的示例代码
2019/08/20 Javascript
[01:30]我们共输赢 完美世界城市挑战赛开启全新赛季
2019/04/19 DOTA
Python中IPYTHON入门实例
2015/05/11 Python
Python的re模块正则表达式操作
2016/05/25 Python
Python pyinotify日志监控系统处理日志的方法
2018/03/08 Python
python批量实现Word文件转换为PDF文件
2018/03/15 Python
浅谈django三种缓存模式的使用及注意点
2018/09/30 Python
详解Python Matplotlib解决绘图X轴值不按数组排序问题
2019/08/05 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
2020/01/18 Python
基于python修改srt字幕的时间轴
2020/02/03 Python
django中related_name的用法说明
2020/05/20 Python
keras的backend 设置 tensorflow,theano操作
2020/06/30 Python
澳大利亚UGG工厂直销:Australian Ugg Boots
2017/10/14 全球购物
元旦晚会主持词
2014/03/24 职场文书
四风专项整治工作情况汇报
2014/10/28 职场文书
服装店员工管理制度
2015/08/07 职场文书
2017年大学生寒假社会实践活动总结
2016/04/06 职场文书
go web 预防跨站脚本的实现方式
2021/06/11 Golang
python中Matplotlib绘制直线的实例代码
2021/07/04 Python
Android Studio实现简易进制转换计算器
2022/05/20 Java/Android
Redis特殊数据类型bitmap位图
2022/06/01 Redis