本文实例讲述了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 条评论) |