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的ob_start() 控制您的浏览器cache
Aug 03 PHP
一步一步学习PHP(6) 面向对象
Feb 16 PHP
php中实现简单的ACL 完结篇
Sep 07 PHP
通达OA公共代码 php常用检测函数
Dec 14 PHP
浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题
Aug 06 PHP
PHP5.3安装Zend Guard Loader图文教程
Sep 29 PHP
php cookie中点号(句号)自动转为下划线问题
Oct 21 PHP
php构造函数与析构函数
Apr 23 PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
Jul 07 PHP
PHP实现二维数组中的查找算法小结
Jun 09 PHP
php微信开发之谷歌测距
Jun 14 PHP
在Laravel中使用GuzzleHttp调用第三方服务的API接口代码
Oct 15 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
2020显卡排行榜天梯图 显卡天梯图2020年3月最新版
2020/04/02 数码科技
使用php统计字符串中中英文字符的个数
2013/06/23 PHP
PHP操作FTP类 (上传、下载、移动、创建等)
2016/03/31 PHP
javascript SocialHistory 检查访问者是否访问过某站点
2008/08/02 Javascript
ASP小贴士/ASP Tips javascript tips可以当桌面
2009/12/10 Javascript
js阻止冒泡及jquery阻止事件冒泡示例介绍
2013/11/19 Javascript
通过location.replace禁止浏览器后退防止重复提交
2014/09/04 Javascript
Javascript中的getUTCDay()方法使用详解
2015/06/10 Javascript
使用DeviceOne实现微信小程序功能
2016/12/29 Javascript
BootStrap Fileinput的使用教程
2016/12/30 Javascript
微信小程序商城项目之商品属性分类(4)
2017/04/17 Javascript
vue富文本编辑器组件vue-quill-edit使用教程
2018/09/21 Javascript
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
Vue触发式全局组件构建的方法
2018/11/28 Javascript
如何利用vue+vue-router+elementUI实现简易通讯录
2019/05/13 Javascript
vue 更改连接后台的api示例
2019/11/11 Javascript
vue实现分页加载效果
2019/12/24 Javascript
微信小程序实现文件预览
2020/10/22 Javascript
Python双向循环链表实现方法分析
2018/07/30 Python
利用python循环创建多个文件的方法
2018/10/25 Python
Laravel+Dingo/Api 自定义响应的实现
2019/02/17 Python
Python中turtle库的使用实例
2019/09/09 Python
matplotlib绘制多个子图(subplot)的方法
2019/12/03 Python
Python字典生成式、集合生成式、生成器用法实例分析
2020/01/07 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
2020/02/27 Python
交通专业个人自荐信格式
2013/09/23 职场文书
电大毕业自我鉴定
2014/02/03 职场文书
《商鞅南门立木》教学反思
2014/02/16 职场文书
大学信息公开实施方案
2014/03/09 职场文书
2015年班主任个人工作总结
2015/03/31 职场文书
道歉信怎么写
2015/05/12 职场文书
2016继续教育研修日志
2015/11/13 职场文书
为什么说餐饮很难做,是因为你不了解这些新规则
2019/08/20 职场文书
如何使JavaScript休眠或等待
2021/04/27 Javascript
python使用matplotlib绘制图片时x轴的刻度处理
2021/08/30 Python
Java无向树分析 实现最小高度树
2022/04/09 Javascript