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 相关文章推荐
用文本文件制作留言板提示(上)
Oct 09 PHP
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
Mar 27 PHP
php Xdebug的安装与使用详解
Jun 20 PHP
php导出csv数据在浏览器中输出提供下载或保存到文件的示例
Apr 24 PHP
PHP 5.3新增魔术方法__invoke概述
Jul 23 PHP
php生成QRcode实例
Sep 22 PHP
跟我学Laravel之请求与输入
Oct 15 PHP
yii2利用自带UploadedFile实现上传图片的示例
Feb 16 PHP
关于php几种字符串连接的效率比较(详解)
Feb 22 PHP
PHP解耦的三重境界(浅谈服务容器)
Mar 13 PHP
thinkPHP多表查询及分页功能实现方法示例
Jul 03 PHP
老生常谈PHP中的数据结构:DS扩展
Jul 17 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
如何冲泡挂耳包咖啡?技巧是什么
2021/03/04 冲泡冲煮
无数据库的详细域名查询程序PHP版(5)
2006/10/09 PHP
php 之 没有mysql支持时的替代方案
2006/10/09 PHP
PHP生成Gif图片验证码
2013/10/27 PHP
Smarty中常用变量操作符汇总
2014/10/27 PHP
使用 PHPStorm 开发 Laravel
2015/03/24 PHP
PHP整合七牛实现上传文件
2015/07/03 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
2019/04/27 PHP
jQuery学习5 jQuery事件模型
2010/02/07 Javascript
用js判断页面是否加载完成实现代码
2012/12/11 Javascript
jquery弹出框的用法示例(一)
2013/08/26 Javascript
JS+CSS实现的经典tab选项卡效果代码
2015/09/16 Javascript
jquery判断复选框选中状态以及区分attr和prop
2015/12/18 Javascript
jQuery 检查某个元素在页面上是否存在实例代码
2016/10/27 Javascript
实现点击下箭头变上箭头来回切换的两种方法【推荐】
2016/12/14 Javascript
详解ES6之async+await 同步/异步方案
2017/09/19 Javascript
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
2019/04/29 NodeJs
微信小程序实现下拉刷新动画
2019/06/21 Javascript
浅谈VUE中演示v-for为什么要加key
2020/01/16 Javascript
微信小程序onShareTimeline()实现分享朋友圈
2021/01/07 Javascript
[01:01:22]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
python中 logging的使用详解
2017/10/25 Python
pandas每次多Sheet写入文件的方法
2018/12/10 Python
Python TestCase中的断言方法介绍
2019/05/02 Python
Python虚拟环境库virtualenvwrapper安装及使用
2020/06/17 Python
Python2.x与3​​.x版本有哪些区别
2020/07/09 Python
css3 transform 3d 使用css3创建动态3d立方体(html5实践)
2013/01/06 HTML / CSS
后备干部考察材料
2014/02/12 职场文书
《小猫刮胡子》教学反思
2014/02/21 职场文书
会计电算化专业自荐信
2014/03/15 职场文书
应聘会计求职信
2014/06/11 职场文书
管理岗位竞聘演讲稿
2014/08/18 职场文书
毕业设计指导教师评语
2014/12/30 职场文书
Go标准容器之Ring的使用说明
2021/05/05 Golang
深入理解CSS 中 transform matrix矩阵变换问题
2021/08/30 HTML / CSS
MySQL into_Mysql中replace与replace into用法案例详解
2021/09/14 MySQL