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调用数据库的存贮过程!
Oct 09 PHP
PHP新手上路(九)
Oct 09 PHP
用php解析html的实现代码
Aug 08 PHP
PHP服务器页面间跳转实现方法
Aug 02 PHP
PHP编译安装中遇到的两个错误和解决方法
Aug 20 PHP
PHP多线程之内部多线程实例分析
Mar 09 PHP
Laravel 5.3 学习笔记之 安装
Aug 28 PHP
利用PHP生成静态html页面的原理
Sep 30 PHP
Thinkphp实现短信验证注册功能
Oct 18 PHP
php插件Xajax使用方法详解
Aug 31 PHP
PHP实现登录注册之BootStrap表单功能
Sep 03 PHP
php中file_get_contents()函数用法实例
Feb 21 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中使用灵巧的体系结构
2006/10/09 PHP
PHP批量上传图片的具体实现方法介绍.
2014/02/26 PHP
PH P5.2至5.5、5.6的新增功能详解
2014/07/14 PHP
CI框架装载器Loader.php源码分析
2014/11/04 PHP
php读取flash文件高宽帧数背景颜色的方法
2015/01/06 PHP
php实现数组重复数字统计实例
2018/09/30 PHP
禁止刷新,回退的JS
2006/11/25 Javascript
利用js对象弹出一个层
2008/03/26 Javascript
鼠标左键单击冲突的问题解决方法(防止冒泡)
2014/05/14 Javascript
jquery表单验证需要做些什么
2015/11/17 Javascript
浅析BootStrap栅格系统
2016/06/07 Javascript
AngularJS 过滤器的简单实例
2016/07/27 Javascript
微信小程序 animation API详解及实例代码
2016/10/08 Javascript
Angularjs处理页面闪烁的解决方法
2017/03/09 Javascript
jQuery自定义多选下拉框效果
2017/06/19 jQuery
一个有意思的鼠标点击文字特效jquery代码
2017/09/23 jQuery
详解小程序原生使用ES7 async/await语法
2018/08/06 Javascript
Node.js连接Sql Server 2008及数据层封装详解
2018/08/27 Javascript
Node配合WebSocket做多文件下载以及进度回传
2019/11/07 Javascript
微信小程序实现滚动加载更多的代码
2019/12/06 Javascript
jQuery实现的解析本地 XML 文档操作示例
2020/04/30 jQuery
基于aotu.js实现微信自动添加通讯录中的联系人功能
2020/05/28 Javascript
[42:32]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第二场 10.28
2020/10/28 DOTA
从零学Python之入门(四)运算
2014/05/27 Python
python实现在每个独立进程中运行一个函数的方法
2015/04/23 Python
python简单实现矩阵的乘,加,转置和逆运算示例
2019/07/10 Python
Python openpyxl读取单元格字体颜色过程解析
2019/09/03 Python
django xadmin中form_layout添加字段显示方式
2020/03/30 Python
html5 datalist 选中option选项后的触发事件
2020/03/05 HTML / CSS
Mistine官方海外旗舰店:泰国国民彩妆品牌
2016/12/28 全球购物
PHP数据运算类型都有哪些
2013/11/05 面试题
医药学专业大学生职业生涯规划书论文
2014/01/21 职场文书
学生喝酒检讨书500字
2014/11/02 职场文书
2014年党支部工作总结
2014/11/13 职场文书
电力工程合作意向书
2015/05/11 职场文书
刑事辩护词范文
2015/05/21 职场文书