first commit

This commit is contained in:
2026-01-25 18:18:09 +08:00
commit 509312e604
8136 changed files with 2349298 additions and 0 deletions

View File

@ -0,0 +1,38 @@
<?php
namespace app\models\logics\commands\base;
use app\common\CurlApp;
class BaseCommandSpiderLogic
{
protected ?CurlApp $curl = null;
protected string $brandName = '';
protected string $baseUrl = '';
public function __construct()
{
ini_set('pcre.backtrack_limit', '-1');
$this->curl = new CurlApp();
}
public function exec()
{
$url = rtrim($this->baseUrl, '/') . '/fashion-shows/designer/' . $this->brandName;
// var_dump($url);
// list($request, $httpCode) = $curl->setUrl($url)->exec();
$request = $this->curl->setUrl($url)->exec();
if ($request) {
preg_match_all('/window.__PRELOADED_STATE__ = ([\s\S]*?);<\/script>/', $request, $matches);
$val = json_decode(current(end($matches)), true);
return $val['transformed']['runwayDesignerContent']['designerCollections'] ?? [];
} else {
// $this->logger->info('未找到数据.');
return [];
}
}
}

View File

@ -0,0 +1,190 @@
<?php
namespace app\models\logics\commands;
use app\common\CommonHelper;
use app\enums\SourceEnum;
use app\models\Brand;
use app\models\BrandRunway;
use app\models\BrandRunwayImages;
use app\models\BrandSource;
use app\models\logics\commands\base\BaseCommandSpiderLogic;
use yii\helpers\ArrayHelper;
class SpiderVogue extends BaseCommandSpiderLogic
{
protected string $baseUrl = 'https://www.vogue.com/';
public function __construct()
{
parent::__construct();
// $this->curl->setProxy('127.0.0.1', 58591);
}
public function setBrandName(string $name = ''): SpiderVogue
{
$this->brandName = $name;
return $this;
}
public function start()
{
$source = BrandSource::find()->where(['source' => SourceEnum::VOGEU->value()])->asArray()->all();
// var_dump(ArrayHelper::getColumn($source, 'brand_id'));
$i = 0;
$brandNameContainer = [];
$brandIdContainer = [];
foreach (Brand::find()->where(
['>','id', 5747] // 5897
)->each() as $item) {
$item['name'] = strtr($item['name'], [
' ' => '-',
'.' => '-'
]);
// var_dump(strtolower($item['name']));
// $runwayList = $this->setBrandName($item['name'])->_getBrandRunwayList(strtolower($item['name']));
echo $item['name'] . PHP_EOL;
$brandNameContainer[] = strtolower($item['name']);
$brandIdContainer[] = $item['id'];
$i++;
if ($i != 5) {
continue;
}
$runwayList = $this->_getBrandRunwayListMulti($brandNameContainer);
foreach ($runwayList as $index => $listItem) {
// var_dump('id---', $brandIdContainer[$index]);
// var_dump($listItem);
if (!$listItem) {
continue;
}
if (!$sourceModel = BrandSource::find()->where(['brand_id' => $brandIdContainer[$index], 'is_deleted' => 0])->one()) {
$sourceModel = new BrandSource();
$sourceModel->brand_id = $brandIdContainer[$index];
$sourceModel->source = SourceEnum::VOGEU->value();
$sourceModel->save();
var_dump($sourceModel->errors);
}
}
$brandNameContainer = $brandIdContainer = [];
$i = 0;
if (!$runwayList) {
continue;
}
var_dump($runwayList);
foreach ($runwayList as $runwayItem) {
var_dump($runwayItem['hed']);
if (!$model = BrandRunway::find()->where(['brand_id' => $item['id'], 'title' => $runwayItem['hed']])->one()) {
echo $runwayItem['hed'] . PHP_EOL;
$model = new BrandRunway();
$model->title = $runwayItem['hed'];
$model->brand_id = $item['id'];
$model->year = CommonHelper::getYear($runwayItem['hed']);
$model->cover = '';
$model->save();
var_dump($model->errors);
if (!$sourceModel = BrandSource::find()->where(['brand_id' => $item['id'], 'is_deleted' => 0])->one()) {
$sourceModel = new BrandSource();
$sourceModel->brand_id = $item['id'];
$sourceModel->source = SourceEnum::VOGEU->value();
$sourceModel->save();
var_dump($sourceModel->errors);
}
$pageUri = $runwayItem['url'];
$requestUrl = rtrim($this->baseUrl, '/') . $pageUri . '/slideshow/collection';
$detailData = $this->_getDetail($requestUrl);
preg_match_all('/window\.__PRELOADED_STATE__ = (.*?);</s', $detailData, $matches);
$saveUrl = $detailUrl = [];
if (count($matches) > 1) {
$val = json_decode(current($matches[1]), true);
$images = $val['transformed']['runwayGalleries']['galleries'][0]['items'] ?? false;
if ($images === false) {
echo '获取图片失败' . PHP_EOL;
// $this->logger->warning($requestUrl . '获取图片失败.');
return;
}
foreach (is_array($images) ? $images : [] as $img) {
$saveUrl[] = [
'src' => $img['image']['sources']['xxl']['url']
];
foreach ($img['details'] ?? [] as $detail) {
$detailUrl[] = ['src' => $detail['image']['sources']['xxl']['url']];
$brandModel = new BrandRunwayImages();
$brandModel->image = $detail['image']['sources']['xxl']['url'];
$brandModel->runway_id = $model->id;
$brandModel->brand_id = $item['id'];
$brandModel->save();
var_dump($brandModel->errors);
}
}
// $model->images = json_encode($saveUrl);
$model->cover = '';
$model->save();
}
}
}
}
}
public function getDetail($url): bool|string
{
return $this->curl->setUrl($url)->exec();
}
public function getBrandRunwayList(string $url)
{
$request = $this->curl->setUrl($url)->exec();
if ($request) {
preg_match_all('/window.__PRELOADED_STATE__ = ([\s\S]*?);<\/script>/', $request, $matches);
$val = json_decode(current(end($matches)), true);
return $val['transformed']['runwayDesignerContent']['designerCollections'] ?? [];
} else {
// $this->logger->info('未找到数据.');
return [];
}
}
private function _getBrandRunwayListMulti(array $brandNames = []): array
{
// $brandNames = [];
$resp = [];
foreach ($brandNames as $brandName) {
$url[] = rtrim($this->baseUrl, '/') . '/fashion-shows/designer/' . $brandName;
// var_dump($url);
// list($request, $httpCode) = $curl->setUrl($url)->exec();
}
$request = $this->curl->execMulti($url);
// var_dump($request);die;
foreach ($request as $item) {
if ($item) {
preg_match_all('/window.__PRELOADED_STATE__ = ([\s\S]*?);<\/script>/', $item, $matches);
$val = json_decode(current(end($matches)), true);
$resp[] = $val['transformed']['runwayDesignerContent']['designerCollections'] ?? [];
} else {
// $this->logger->info('未找到数据.');
$resp[] = [];
}
}
return $resp;
}
}