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
PHP 高手之路(一)
Oct 09 PHP
php将数据库中的电话号码读取出来并生成图片
Aug 31 PHP
php带密码功能并下载远程文件保存本地指定目录 修改加强版
May 16 PHP
php抽奖小程序的实现代码
Jun 18 PHP
一个PHP二维数组排序的函数分享
Jan 17 PHP
使用php方法curl抓取AJAX异步内容思路分析及代码分享
Aug 25 PHP
php 无限分类 树形数据格式化代码
Oct 11 PHP
Nginx下ThinkPHP5的配置方法详解
Aug 01 PHP
PHP的微信支付接口使用方法讲解
Mar 08 PHP
Yii2框架中一些折磨人的坑
Dec 15 PHP
php的instanceof和判断闭包Closure操作示例
Jan 26 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
德生PL330测评
2021/03/02 无线电
腾讯QQ微博API接口获取微博内容
2013/10/30 PHP
php中error与exception的区别及应用
2014/07/28 PHP
php实现的替换敏感字符串类实例
2014/09/22 PHP
PHP实现根据密码长度显示安全条
2017/07/04 PHP
Three.js源码阅读笔记(物体是如何组织的)
2012/12/27 Javascript
js判读浏览器是否支持html5的canvas的代码
2013/11/18 Javascript
jQuery自动添加表单项的方法
2015/07/13 Javascript
jQuery div拖拽用法实例
2016/01/14 Javascript
JavaScript如何实现组合列表框中元素移动效果
2016/03/01 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
2017/01/04 Javascript
vue.js绑定事件监听器示例【基于v-on事件绑定】
2018/07/07 Javascript
vue实现微信二次分享以及自定义分享的示例
2019/03/20 Javascript
nodejs对项目下所有空文件夹创建gitkeep的方法
2019/08/02 NodeJs
Vue实现可移动水平时间轴
2020/06/29 Javascript
浅谈vue中get请求解决传输数据是数组格式的问题
2020/08/03 Javascript
vue 表单输入框不支持focus及blur事件的解决方案
2020/11/17 Vue.js
[14:51]DOTA2 HEROS教学视频教你分分钟做大人-卓尔游侠
2014/06/13 DOTA
[06:16]DOTA2守卫传承者——职业选手谈心路历程
2015/02/26 DOTA
[46:21]Liquid vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
python使用socket向客户端发送数据的方法
2015/04/29 Python
Python中Django发送带图片和附件的邮件
2017/03/31 Python
python中requests小技巧
2017/05/10 Python
Python根据文件名批量转移图片的方法
2018/10/21 Python
在python中利用GDAL对tif文件进行读写的方法
2018/11/29 Python
python实现Flappy Bird源码
2018/12/24 Python
Python opencv实现人眼/人脸识别以及实时打码处理
2019/04/29 Python
Python实现串口通信(pyserial)过程解析
2019/09/25 Python
Python3+SQLAlchemy+Sqlite3实现ORM教程
2021/02/16 Python
李宁官方网店:中国运动品牌
2017/11/02 全球购物
WebSphere面试题:在WebSphere里面如何部署一个应用
2015/08/02 面试题
十佳家长事迹材料
2014/08/26 职场文书
简易版租房协议书范本
2014/10/13 职场文书
个人委托书范文
2015/01/28 职场文书
党员干部学习三严三实心得体会
2016/01/05 职场文书
微信小程序中使用vant框架的具体步骤
2022/02/18 Javascript