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正则表达式(regar expression)
Sep 10 PHP
php中opendir函数用法实例
Nov 15 PHP
ThinkPHP中RBAC类的四种用法分析
Nov 24 PHP
浅析php原型模式
Nov 25 PHP
深入解析WordPress中加载模板的get_template_part函数
Jan 11 PHP
Joomla实现组件中弹出一个模式(modal)窗口的方法
May 04 PHP
thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法
May 19 PHP
thinkPHP自动验证机制详解
Dec 05 PHP
ThinkPHP实现简单登陆功能
Apr 28 PHP
Yii2框架可逆加密简单实现方法
Aug 25 PHP
PHP微信H5支付开发实例
Jul 25 PHP
如何利用PHP实现上传图片功能详解
Sep 24 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
Yii+MYSQL锁表防止并发情况下重复数据的方法
2016/07/14 PHP
Zend Framework上传文件重命名的实现方法
2016/11/25 PHP
PHP中的日期时间处理利器实例(Carbon)
2017/06/09 PHP
PHP实现爬虫爬取图片代码实例
2021/03/03 PHP
JavaScript Event学习第六章 事件的访问
2010/02/07 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/06 Javascript
jcarousellite.js 基于Jquery的图片无缝滚动插件
2010/12/30 Javascript
javascript中强制执行toString()具体实现
2013/04/27 Javascript
DOM基础教程之使用DOM控制表格
2015/01/20 Javascript
JavaScript中用sort()方法对数组元素进行排序的操作
2015/06/09 Javascript
jQuery实现按钮只点击一次后就取消点击事件绑定的方法
2015/06/26 Javascript
jQuery实现的无限级下拉菜单功能示例
2016/09/12 Javascript
详解vue2.0的Element UI的表格table列时间戳格式化
2017/06/13 Javascript
详解jQuery设置内容和属性
2019/04/11 jQuery
JS html事件冒泡和事件捕获操作示例
2019/05/01 Javascript
微信小程序封装自定义弹窗的实现代码
2019/05/08 Javascript
uni-app 支持多端第三方地图定位的方法
2020/01/03 Javascript
[01:05:24]Ti4 冒泡赛第二天 iG vs NEWBEE 3
2014/07/15 DOTA
Python之父谈Python的未来形式
2016/07/01 Python
python实现堆和索引堆的代码示例
2018/03/19 Python
python处理“
2019/06/10 Python
pycharm显示远程图片的实现
2019/11/04 Python
python 消费 kafka 数据教程
2019/12/21 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
2020/03/30 Python
详解Python流程控制语句
2020/10/28 Python
任课老师推荐信范文
2013/11/24 职场文书
大学自荐信
2013/12/12 职场文书
高一政治教学反思
2014/01/28 职场文书
《大自然的语言》教学反思
2014/04/08 职场文书
祖国在我心中演讲稿500字
2014/05/04 职场文书
高中国旗下的演讲稿
2014/08/28 职场文书
2015暑假打工实践报告
2015/07/13 职场文书
2016年村干部公开承诺书(公开承诺事项)
2016/03/25 职场文书
python中subplot大小的设置步骤
2021/06/28 Python
Python可视化学习之matplotlib内置单颜色
2022/02/24 Python
css布局巧妙技巧之css三角示例的运用
2022/03/16 HTML / CSS