首页 > 作文

php使用pthreads v3多线程实现抓取新浪新闻信息操作示例

更新时间:2023-04-08 16:04:28 阅读: 评论:0

本文实例讲述了php使用pthreads v3多线程实现抓取新浪新闻信息。分享给大家供大家参考,具体如下:

我们使用pthreads,来写一个多线程的抓取页面小程序,把结果存到数据库里。

数据表结构如下:

create table `tb_sina` ( `id` int(11) unsigned not nul英语专业四级l auto_increment comment 'id', `url` varchar(256) default '' comment 'url地址', `title` varchar(128) default '' comment '标题', `time` dat节能降耗从我做起etime default null on update current_timestamp comment '时间', primary key (`id`)) engine=innodb default chart=utf8mb重阳节是干嘛的节日4 comment='sina新闻';

代码如下:

<?phpclass 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()  {    //创建连接对象    lf::$db = new pdo($this->dsn, $this->root, $this->pwd);    //把require放到worker线程中,不要放到主线程中,不然会报错找不到类    require './vendor/autoload.php';  }  //返回一个连接资源  public function getconn()  {    return lf::$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 fal;    }    $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 = 'inrt 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 !== fal) {          echo "线程{$this->name}成功插入{$ret}条数据\n";        } el {          var_dump($db->errorinfo());        }      }    }  }}//抓取页面地址$url = '/d/file/titlepic/ = 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,大家可以通过compor进行安装。

compor require jaeger/querylist

不过安装的版本是3.2,在我的php7.2下会有问题,由于each()已经被废弃,所以修改下源码,each()全换成foreach()就好了。

运行结果如下:

数据也保存进了数据库

当然大家也可以再次通过url,拿到具体的页面内容,这里就不做演示了,有兴趣的可以自已去实现。

本文发布于:2023-04-08 16:04:26,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/1133c498385591e535e8147eedbcafbb.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:php使用pthreads v3多线程实现抓取新浪新闻信息操作示例.doc

本文 PDF 下载地址:php使用pthreads v3多线程实现抓取新浪新闻信息操作示例.pdf

标签:数据   线程   时间   页面
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图