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中实现Javascript的escape()函数代码
Aug 08 PHP
php实现与erlang的二进制通讯实例解析
Jul 23 PHP
php操作csv文件代码实例汇总
Sep 22 PHP
php中http与https跨域共享session的解决方法
Dec 20 PHP
php实现以只读方式打开文件的方法
Mar 16 PHP
PHP实现的购物车类实例
Jun 17 PHP
php里array_work用法实例分析
Jul 13 PHP
php计算税后工资的方法
Jul 28 PHP
PHP5.5迭代生成器用法实例详解
Mar 16 PHP
分析PHP中单双引号的误区和双引号小隐患
Jul 19 PHP
PHP-FPM的配置与优化讲解
Mar 15 PHP
浅谈laravel框架sql中groupBy之后排序的问题
Oct 17 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
全国FM电台频率大全 - 31 新疆维吾尔族自治区
2020/03/11 无线电
PHP生成网页快照 不用COM不用扩展.
2010/02/11 PHP
php 读取文件乱码问题
2010/02/20 PHP
PHP中的替代语法简介
2014/08/22 PHP
PHP超牛逼无限极分类生成树方法
2015/05/11 PHP
PHP文件上传之多文件上传的实现思路
2016/01/27 PHP
实例讲解php实现多线程
2019/01/27 PHP
用javascript实现的支持lrc歌词的播放器
2007/05/17 Javascript
jQuery html()等方法介绍
2009/11/18 Javascript
JQuery中的$.getJSON 使用说明
2011/03/10 Javascript
ExtJS判断IE浏览器类型的方法
2014/02/10 Javascript
jQuery实现仿百度首页滑动伸缩展开的添加服务效果代码
2015/09/09 Javascript
JS中的进制转换以及作用
2016/06/26 Javascript
第一次记录Bootstrap table学习笔记(1)
2017/05/18 Javascript
AngularJs分页插件使用详解
2018/06/30 Javascript
浅谈JavaScript闭包
2019/04/09 Javascript
通过vue写一个瀑布流插件代码实例
2019/09/07 Javascript
详解vue实现坐标拾取器功能示例
2020/11/18 Vue.js
[06:24]DOTA2亚洲邀请赛小组赛第三日 TOP10精彩集锦
2015/02/01 DOTA
[03:55]2016国际邀请赛中国区预选赛首日TOP10精彩集锦
2016/06/27 DOTA
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
2014/08/22 Python
python学习之第三方包安装方法(两种方法)
2015/07/30 Python
Python实现的堆排序算法示例
2018/04/29 Python
利用Python如何生成便签图片详解
2018/07/09 Python
python 拼接文件路径的方法
2018/10/23 Python
一行Python代码过滤标点符号等特殊字符
2019/08/12 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
2019/09/26 Python
python相对企业语言优势在哪
2020/06/12 Python
Python -m参数原理及使用方法解析
2020/08/21 Python
亚洲最大的运动鞋寄售店:KicksCrew
2020/11/26 全球购物
化学实验员岗位职责
2013/12/28 职场文书
党员四风问题个人对照检查材料
2014/10/26 职场文书
家长会感言
2015/08/01 职场文书
工作转正自我鉴定范文
2019/06/21 职场文书
python基础之错误和异常处理
2021/10/24 Python
Win11黑色桌面背景怎么办?Win11黑色壁纸解决方法汇总
2022/04/05 数码科技