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 相关文章推荐
Linux下将excel数据导入到mssql数据库中的方法
Feb 08 PHP
Php获取金书网的书名的实现代码
Jun 11 PHP
PHP入门学习笔记之一
Oct 12 PHP
用Simple Excel导出xls实现方法
Dec 06 PHP
php学习笔记之面向对象编程
Dec 29 PHP
shell脚本作为保证PHP脚本不挂掉的守护进程实例分享
Jul 15 PHP
QQ互联一键登录审核不通过的解决方案
Sep 10 PHP
php mysqli查询语句返回值类型实例分析
Jun 29 PHP
CodeIgniter开发实现支付宝接口调用的方法示例
Nov 14 PHP
PHP面向对象程序设计方法实例详解
Dec 24 PHP
PHP crypt()函数的用法讲解
Feb 15 PHP
PHP封装cURL工具类与应用示例
Jul 01 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
URL Rewrite的设置方法
2007/01/02 PHP
PHP+Ajax异步通讯实现用户名邮箱验证是否已注册( 2种方法实现)
2011/12/28 PHP
CI框架装载器Loader.php源码分析
2014/11/04 PHP
thinkPHP交易详情查询功能详解
2016/12/02 PHP
PHP实现随机发放扑克牌
2020/04/21 PHP
jQuery DOM操作小结与实例
2010/01/07 Javascript
JavaScript日历实现代码
2010/09/12 Javascript
JavaScript Title、alt提示(Tips)实现源码解读
2010/12/12 Javascript
五段实用的js高级技巧
2011/12/20 Javascript
javascript学习笔记(十六) 系统对话框(alert、confirm、prompt)
2012/06/20 Javascript
js获取会话框prompt的返回值的方法
2015/01/10 Javascript
require.js配合插件text.js实现最简单的单页应用程序
2016/07/12 Javascript
ExtJs的Ext.Ajax.request实现waitMsg等待提示效果
2017/06/14 Javascript
JQuery EasyUI的一些常用组件
2017/07/12 jQuery
微信小程序实现弹出菜单
2018/07/19 Javascript
Layui表格监听行单双击事件讲解
2019/11/14 Javascript
[01:06:32]DOTA2上海特级锦标赛D组资格赛#1 EG VS VP第一局
2016/02/28 DOTA
Python实现二叉搜索树
2016/02/03 Python
浅谈python中set使用
2016/06/30 Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
2018/07/07 Python
python使用Pandas库提升项目的运行速度过程详解
2019/07/12 Python
python下PyGame的下载与安装过程及遇到问题
2019/08/04 Python
numpy.ndarray 实现对特定行或列取值
2019/12/05 Python
Python稀疏矩阵及参数保存代码实现
2020/04/18 Python
基于打开pycharm有带图片md文件卡死问题的解决
2020/04/24 Python
Python自动化之UnitTest框架实战记录
2020/09/08 Python
C#如何判断当前用户是否输入某个域
2015/12/07 面试题
你经历的项目中的SCM配置项主要有哪些?什么是配置项?
2013/11/04 面试题
感恩节红领巾广播稿
2014/02/11 职场文书
研究生考核个人自我鉴定
2014/03/27 职场文书
世界地球日活动总结
2015/02/09 职场文书
煤矿安全保证书
2015/02/27 职场文书
加薪通知
2015/04/25 职场文书
2015年大学班级工作总结
2015/04/28 职场文书
Lakehouse数据湖并发控制陷阱分析
2022/03/31 Oracle
Golang 入门 之url 包
2022/05/04 Golang