laogepj 发表于 2021-5-9 00:17

表示不服,来个PHP批量(并发)爬虫下载小姐姐图片到本地

本帖最后由 laogepj 于 2021-5-9 09:35 编辑

看到论坛都没有php采集爬虫我就不服了,php照样并发批量采集,一点都不耽误快速找小姐姐。{:1_918:}
142张照片8秒搞定
1.来个PHP批量(同步)爬虫下载小姐姐图片到本地
2.里面引用的库文件请转移带这里下载https://github.com/playm3u8/whttp
3.和download.php目录同级即可
3.执行命令 php download.php
3.php版本在7.2以上
<?php
require_once './whttp/autoload.php';
use PL\Whttp,PL\Debug;

function getImg($id)
{
      $retlist = [];
      $html = whttp::get("https://bcy.net/item/detail/{$id}?_source_page=hashtag")
                ->core('window.__ssr_data = JSON.parse("','");')
                ->getBody();
      $json= json_decode(stripslashes($html), true);
      if (isset($json['detail']['post_data']['multi'])) {
                $multi = $json['detail']['post_data']['multi'];
                foreach ($multi as $key => $value) {
                        $retlist[$key] = $value['path'];
                }
      }
      return $retlist;
}

$param = [
      'url' => 'https://bcy.net/apiv3/common/circleFeed?circle_id=492',
];



$retlist = [];
$result= Whttp::get($param['url']);
if($result->getCode() != 200) {
      print("请求错误"."\n");
} else {
      // 记录请求耗时起点
      Debug::remark('begin');
      $getlist = $result->getJson('data.items');
      foreach ($getlist as $key => $value) {
                $retlist[$key]['id']    = $value['item_detail']['item_id'];
                $retlist[$key]['plain'] = $value['item_detail']['plain'];
                $retlist[$key]['img']   = getImg($value['item_detail']['item_id']);
      }
      // 下载图片
      foreach ($retlist as $key => $value) {
                print("id:{$value['id']}"."\n");
                print("plain:{$value['plain']}"."\n");
                $img = Whttp::get($value['img'])
                  ->savepath("./bcy_img/".$value['id'])
                  ->concurrent(10) // 同时并发任务数量
                  ->gany(Function($data)
                {
                        $error = $data['error'];
                        $url   = $data['info']['url'];
                        if(empty($error)) {
                              print("下载成功:{$url}"."\n");
                        } else {
                              print("下载失败:{$url}"."\n");
                        }
                });
                $img->getDownload();
                print("=================我是分隔符================="."\n");
      }
}

// 请求耗时终点
Debug::remark('end');
// 计算请求耗时
$cost   = floatval(Debug::getRangeTime('begin','end',4));
// 计算内存消耗
$memory = strtolower(Debug::getRangeMem('begin','end'));
print("[耗时:".$cost."秒] [内存消耗:".$memory."]");

elightning 发表于 2021-5-15 02:58

php采集的精髓在于curl连接复用
这个库只实现了并发,没有实现连接复用
大量https的情况下,最影响效率的就是tcp三次握手+ssl四次握手
每个并发重复握手很没意义

另外php爬虫的弱势就是单线程,这个库采用的curl多重并发只是个消息队列机制解决不了单线程的问题
我目前喜欢golang结合php 多线程+连接复用 并发性能非常强悍 如果试过就绝对上瘾

牛皮菜 发表于 2021-5-9 11:44

学习学习

色色 发表于 2021-5-9 12:01

大佬图片下载地址能直接保存成文本吗

laogepj 发表于 2021-5-9 14:26

色色 发表于 2021-5-9 12:01
大佬图片下载地址能直接保存成文本吗

可以的,$retlist[$key]['img']就是是图片地址

大侠在路上 发表于 2021-5-31 11:28

感谢楼主分享,先学习一下。

yaobao78 发表于 2021-6-11 17:25

收藏了,刚好会PHP

罗婷 发表于 2021-6-13 23:48

elightning 发表于 2021-5-15 02:58
php采集的精髓在于curl连接复用
这个库只实现了并发,没有实现连接复用
大量https的情况下,最影响效率的 ...

http协议就是短链接啊 - - 咋复用 - -

sam喵喵 发表于 2021-6-13 23:52

扎克当年就用wget爬了一堆图片,PHP建站

五月何欢 发表于 2021-6-16 09:48

半次元的神经病,真该整治下国内的这种风气
页: [1] 2
查看完整版本: 表示不服,来个PHP批量(并发)爬虫下载小姐姐图片到本地