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 相关文章推荐
第十二节--类的自动加载
Nov 16 PHP
php与XML、XSLT、Mysql的结合运用实现代码
Nov 19 PHP
PHP simple_html_dom.php+正则 采集文章代码
Dec 24 PHP
深入PHP内存相关的功能特性详解
Jun 08 PHP
CodeIgniter生成网站sitemap地图的方法
Nov 13 PHP
PHP字符串中特殊符号的过滤方法介绍
Feb 18 PHP
smarty简单分页的实现方法
Oct 27 PHP
PHP使用strstr()函数获取指定字符串后所有字符的方法
Jan 07 PHP
Laravel 5.3 学习笔记之 安装
Aug 28 PHP
PHP memcache在微信公众平台的应用方法示例
Sep 13 PHP
基于PHP-FPM进程池探秘
Oct 17 PHP
laravel5.5安装jwt-auth 生成token令牌的示例
Oct 24 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
雄兵连三大错觉:凯莎没了,凉冰阵亡了,华烨觉得自己又行了
2020/04/09 国漫
PHP 已经成熟
2006/12/04 PHP
PHP面向接口编程 耦合设计模式 简单范例
2011/03/23 PHP
修改apache配置文件去除thinkphp url中的index.php
2014/01/17 PHP
php获取指定日期之间的各个周和月的起止时间
2014/11/24 PHP
php中curl使用指南
2015/02/05 PHP
php异常处理方法实例汇总
2015/06/24 PHP
CI框架整合smarty步骤详解
2016/05/19 PHP
Nigma vs Alliance BO5 第三场2.14
2021/03/10 DOTA
用js自动判断浏览器分辨率的代码
2007/01/28 Javascript
iframe 上下滚动条如何默认在下方实现原理
2012/12/10 Javascript
解析URI与URL之间的区别与联系
2013/11/22 Javascript
ExtJs纵坐标值重复问题的解决方法
2014/02/27 Javascript
js字符串日期yyyy-MM-dd转化为date示例代码
2014/03/06 Javascript
jquery禁用右键示例
2014/04/28 Javascript
JavaScript实现的购物车效果可以运用在好多地方
2014/05/09 Javascript
javascript禁止超链接跳转的方法
2016/02/02 Javascript
vue2.0 路由不显示router-view的解决方法
2018/03/06 Javascript
JavaScript对象原型链原理详解
2020/02/05 Javascript
python实现给微信公众号发送消息的方法
2017/06/30 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
python方法生成txt标签文件的实例代码
2018/05/10 Python
Python中list查询及所需时间计算操作示例
2018/06/21 Python
5分钟 Pipenv 上手指南
2018/12/20 Python
django 基于中间件实现限制ip频繁访问过程详解
2019/07/30 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
2020/04/07 Python
python通过cython加密代码
2020/12/11 Python
iframe在移动端的缩放的示例代码
2018/10/12 HTML / CSS
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
教师自荐书
2013/10/08 职场文书
事业单位公务员的职业生涯规划
2014/01/15 职场文书
领导干部四风问题自我剖析材料
2014/09/25 职场文书
工作岗位职责范本
2015/02/15 职场文书
工作会议通知
2015/04/15 职场文书
接触艺术对孩子学习思维有益
2019/08/06 职场文书
HR必备:销售经理聘用合同范本
2019/08/21 职场文书