setDescription('自动采集 https://theimpression.com/street-style'); } public function execute(InputInterface $input, OutputInterface $output): int { parent::execute($input, $output); $url = 'https://theimpression.com/street-style'; [$res, $httpCode] = $this->request($url); if ($httpCode != 200) { $this->debugPrint("{$url} 请求失败."); return 0; } // 取banner的图 (new Crawler($res)) ->filter('.parallax .mask-overlay')->each(function ($node) { $href = $node->attr('href'); $text = trim($node->attr('aria-label')); $this->debugPrint("标题: {$text}"); $this->debugPrint("链接: {$href}"); $this->getDetail($href, $text); }); $articleList = []; // 取前五十页 for ($i = 1; $i < 2; $i++) { $url = "https://theimpression.com/wp-json/codetipi-zeen/v1/block?paged={$i}&type=1&data%5Bargs%5D%5Bcat%5D=1"; [$res, $httpCode] = $this->request($url); if ($httpCode != 200) { $this->debugPrint("{$url} 请求失败."); return 0; } $res = json_decode($res, true); (new Crawler($res[1])) ->filter('article')->each(function (Crawler $node) use (&$articleList) { $href = $node->filter('.mask-img')->attr('href', ''); $title = $node->filter('.title-wrap')->text(''); if (!$href || !$title) { $this->debugPrint("找不到标题或链接."); return 0; } $this->getDetail($href, $title); }); } return 0; // return 0; } public function getDetail(string $url, $title) { $model = $this->getArticleModel(['title' => $title, 'platform' => static::getPlatform(), 'brand' => 0]); $model->title = $title; $model->platform = static::getPlatform(); $model->module = ArticleModuleEnum::STREET->value; $model->year = AppHelper::getYear($title); [$res, $httpCode] = $this->request($url); $model->source_url = $url; if ($httpCode != 200) { $this->debugPrint("{$url} 请求失败."); return 0; } $images = []; (new Crawler($res)) ->filter('figure a img')->each(function ($node) use (&$images) { if ($node->attr('src') && !isset($images[$node->attr('src')])) { $this->debugPrint("采集图片: {$node->attr('src')}"); $images[$node->attr('src')] = [ 'src' => $node->attr('src') ]; } }); if ($images) { $model->cover = current($images)['src']; $model->images = json_encode(array_values($images)); $model->save(); } } }