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
实时抓取YAHOO股票报价的代码
Oct 09 PHP
PHP 判断常量,变量和函数是否存在
Apr 26 PHP
PHP 循环列出目录内容的函数代码
May 26 PHP
PHP FOR MYSQL 代码生成助手(根据Mysql里的字段自动生成类文件的)
Jul 23 PHP
供参考的 php 学习提高路线分享
Oct 23 PHP
利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法
Dec 19 PHP
解析crontab php自动运行的方法
Jun 24 PHP
三种php连接access数据库方法
Nov 11 PHP
浅谈PDO的rowCount函数
Jun 18 PHP
php数组函数array_walk用法示例
May 26 PHP
laravel通过a标签从视图向控制器实现传值
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
使用php显示搜索引擎来的关键词
2014/02/13 PHP
destoon调用企业会员公司形象图片的实现方法
2014/08/21 PHP
php similar_text()函数的定义和用法
2016/05/12 PHP
Eclipse PHPEclipse 配置的具体步骤
2017/08/08 PHP
一个对于js this关键字的问题
2007/01/09 Javascript
实现JavaScript中继承的三种方式
2009/10/16 Javascript
document.getElementById方法在Firefox与IE中的区别
2010/05/18 Javascript
用jquery实现的模拟QQ邮箱里的收件人选取及其他效果(一)
2011/01/06 Javascript
JS格式化数字金额用逗号隔开保留两位小数
2013/10/18 Javascript
Node调试工具JSHint的安装及配置教程
2014/05/27 Javascript
avascript中的自执行匿名函数应用示例
2014/09/15 Javascript
javascript框架设计读书笔记之字符串的扩展和修复
2014/12/02 Javascript
谈谈JavaScript类型系统之Math
2016/01/06 Javascript
JQueryEasyUI之DataGrid数据显示
2016/11/23 Javascript
Angular中管道操作符(|)的使用方法
2017/12/15 Javascript
vue 实现复制内容到粘贴板clipboard的方法
2018/03/17 Javascript
Vue项目分环境打包的实现步骤
2018/04/02 Javascript
原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
2020/12/30 Javascript
node app 打包工具pkg的具体使用
2019/01/17 Javascript
[49:21]完美世界DOTA2联赛循环赛 Ink Ice vs LBZS BO2第二场 11.05
2020/11/06 DOTA
Python中的元类编程入门指引
2015/04/15 Python
Python实现输出程序执行进度百分比的方法
2017/09/16 Python
Django使用HttpResponse返回图片并显示的方法
2018/05/22 Python
Python神奇的内置函数locals的实例讲解
2019/02/22 Python
Python流程控制 if else实现解析
2019/09/02 Python
Python模块 _winreg操作注册表
2020/02/05 Python
浅谈如何使用python抓取网页中的动态数据实现
2020/08/17 Python
匈牙利最大的健身制造商和销售商:inSPORTline
2018/10/30 全球购物
电子商务专业学生的学习自我评价
2013/10/27 职场文书
大学军训自我鉴定
2013/12/15 职场文书
行政秘书工作自我鉴定
2014/09/15 职场文书
2014年初三班主任工作总结
2014/12/05 职场文书
放射科岗位职责
2015/02/14 职场文书
python 网络编程要点总结
2021/06/18 Python
Python语言内置数据类型
2022/02/24 Python
mysql查看表结构的三种方法总结
2022/07/07 MySQL