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调用三种数据库的方法(3)
Oct 09 PHP
php与paypal整合方法
Nov 28 PHP
PHP操作XML作为数据库的类
Dec 19 PHP
让php处理图片变得简单 基于gb库的图片处理类附实例代码下载
May 17 PHP
PHP写UltraEdit插件脚本实现方法
Dec 26 PHP
php中is_null,empty,isset,unset 的区别详细介绍
Apr 28 PHP
PHP封装分页函数实现文本分页和数字分页
Oct 23 PHP
php获取文章上一页与下一页的方法
Dec 01 PHP
PHP回溯法解决0-1背包问题实例分析
Mar 23 PHP
PHP输出日历表代码实例
Mar 27 PHP
php实现猴子选大王问题算法实例
Apr 20 PHP
Laravel5.5+ 使用API Resources快速输出自定义JSON方法详解
Apr 06 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实现的用户查询类实例
2015/06/18 PHP
PHP实现微信小程序人脸识别刷脸登录功能
2018/05/24 PHP
php layui实现前端多图上传实例
2019/07/30 PHP
JS中实现replaceAll的方法(实例代码)
2013/11/12 Javascript
nodejs创建web服务器之hello world程序
2015/08/20 NodeJs
javascript表单事件处理方法详解
2016/05/15 Javascript
JS自定义函数对web前端上传的文件进行类型大小判断
2016/10/19 Javascript
jQuery基于正则表达式的表单验证功能示例
2017/01/21 Javascript
javascript 删除数组元素和清空数组的简单方法
2017/02/24 Javascript
关于vuex的学习实践笔记
2017/04/05 Javascript
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
2017/09/20 jQuery
浅析node Async异步处理模块用例分析及常用方法介绍
2017/11/17 Javascript
利用jquery如何从json中读取数据追加到html中
2017/12/01 jQuery
jQuery实现动态添加和删除input框实例代码
2019/03/26 jQuery
layui插件表单验证提交触发提交的例子
2019/09/09 Javascript
微信小程序 多行文本显示...+显示更多按钮和收起更多按钮功能
2019/09/26 Javascript
JS实现灯泡开关特效
2020/03/30 Javascript
vue 百度地图(vue-baidu-map)绘制方向箭头折线实例代码详解
2020/04/28 Javascript
详解三种方式在React中解决绑定this的作用域问题并传参
2020/08/18 Javascript
Scrapy-redis爬虫分布式爬取的分析和实现
2017/02/07 Python
如何高效使用Python字典的方法详解
2017/08/31 Python
Python数据分析库pandas基本操作方法
2018/04/08 Python
wxPython实现窗口用图片做背景
2018/04/25 Python
Python爬虫爬取新浪微博内容示例【基于代理IP】
2018/08/03 Python
将pandas.dataframe的数据写入到文件中的方法
2018/12/07 Python
对python mayavi三维绘图的实现详解
2019/01/08 Python
Django使用Jinja2模板引擎的示例代码
2019/08/09 Python
python输出第n个默尼森数的实现示例
2020/03/08 Python
python map比for循环快在哪
2020/09/21 Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
2020/09/29 Python
python实现启动一个外部程序,并且不阻塞当前进程
2020/12/05 Python
就业协议书范本
2014/04/11 职场文书
倡议书格式模板
2014/05/13 职场文书
幼儿园安全责任书范本
2014/07/24 职场文书
2016年大学生社会实践心得体会
2015/10/09 职场文书
Win11 Build 22000.829更新补丁KB5015882发布(附更新修复内容汇总)
2022/07/15 数码科技