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下一个非常全面获取图象信息的函数
Nov 20 PHP
php5 图片验证码实现代码
Dec 11 PHP
elgg 获取文件图标地址的方法
Mar 20 PHP
遍历指定目录下的所有目录和文件的php代码
Nov 27 PHP
关于PHP的curl开启问题探讨
Apr 08 PHP
PHP函数strip_tags的一个bug浅析
May 22 PHP
PHP多个文件上传到服务器实例
Oct 29 PHP
js+php实现静态页面实时调用用户登陆状态的方法
Jan 04 PHP
PHP实现的json类实例
Jul 28 PHP
yii权限控制的方法(三种方法)
Dec 28 PHP
CI框架入门之MVC简单示例
Nov 21 PHP
php+js实现的无刷新下载文件功能示例
Aug 23 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
Netflix将与CLAMP、乙一以及冲方丁等6名知名制作人合伙展开原创动画计划!
2020/03/06 日漫
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
2011/03/19 PHP
ThinkPHP3.1查询语言详解
2014/06/19 PHP
php使用$_POST或$_SESSION[]向js函数传参
2014/09/16 PHP
PHP命名空间和自动加载类
2016/04/03 PHP
php中preg_replace_callback函数简单用法示例
2016/07/21 PHP
PHP实现用户登录的案例代码
2018/05/10 PHP
php+js实现点赞功能的示例详解
2020/08/07 PHP
js每次Title显示不同的名言
2008/09/25 Javascript
JavaScript高级程序设计 DOM学习笔记
2011/09/10 Javascript
分析Node.js connect ECONNREFUSED错误
2013/04/09 Javascript
jquery Ajax 实现加载数据前动画效果的示例代码
2014/02/07 Javascript
Eclipse去除js(JavaScript)验证错误
2014/02/11 Javascript
JavaScript实现DIV层拖动及动态增加新层的方法
2015/05/12 Javascript
jQuery简单实现两级下拉菜单效果代码
2015/09/15 Javascript
Javascript实现前端简单的路由实例
2016/09/11 Javascript
KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法
2016/10/05 Javascript
javascript编程开发中取色器及封装$函数用法示例
2017/08/09 Javascript
vue.js实现回到顶部动画效果
2019/07/31 Javascript
Handtrack.js库实现实时监测手部运动(推荐)
2021/02/08 Javascript
Python使用cookielib模块操作cookie的实例教程
2016/07/12 Python
使用python模拟命令行终端的示例
2019/08/13 Python
三个python爬虫项目实例代码
2019/12/28 Python
HTML5 CSS3新的WEB标准和浏览器支持
2009/07/16 HTML / CSS
Nike比利时官网:Nike.com (BE)
2019/02/07 全球购物
找工作最新求职信
2013/12/22 职场文书
大学毕业后的十年规划
2014/01/07 职场文书
我们的节日中秋节活动总结
2015/03/23 职场文书
正规借条模板
2015/05/26 职场文书
出纳试用期工作总结2015
2015/05/28 职场文书
钱学森观后感
2015/06/04 职场文书
幼儿园庆元旦主持词
2015/07/06 职场文书
Memcached介绍及php-memcache扩展安装
2021/04/01 PHP
Golang 实现获取当前函数名称和文件行号等操作
2021/05/08 Golang
详解GaussDB for MySQL性能优化
2021/05/18 MySQL
2022年显卡天梯图(6月更新)
2022/06/17 数码科技