This commit is contained in:
make
2025-06-03 23:02:57 +08:00
parent 806429f948
commit 499882f1a4
10 changed files with 121 additions and 17 deletions

View File

@@ -716,6 +716,24 @@ namespace {
return false; return false;
} }
/**
* 从 URL、URI 或路径中提取小说id不带后缀
*
* @param [type] $path /30/30345/
* @return void
*/
function extractNovelId($path)
{
if (!is_string($path) || empty($path)) {
return null;
}
$segments = explode('/', trim($path, '/'));
$last = end($segments);
return is_numeric($last) ? $last : null;
}
/** /**
* 从 URL、URI 或路径中提取文件名(不带后缀) * 从 URL、URI 或路径中提取文件名(不带后缀)

View File

@@ -47,14 +47,15 @@ class Scheduler
*/ */
public function crawlFull() public function crawlFull()
{ {
var_dump('custom-crawlFull');
$AllCustomCrawlerModel = CustomCrawlerModel::select(); $AllCustomCrawlerModel = CustomCrawlerModel::select();
foreach ($AllCustomCrawlerModel as $CustomCrawlerModel) { foreach ($AllCustomCrawlerModel as $CustomCrawlerModel) {
if ( if (
$CustomCrawlerModel->pt_last_exec != 0 && $CustomCrawlerModel->pt_last_exec != 0 &&
($CustomCrawlerModel->pt_last_exec + $CustomCrawlerModel->pt_limit) > time() ($CustomCrawlerModel->pt_last_exec + $CustomCrawlerModel->pt_limit) > time()
) { ) {
var_dump('continue');
continue; continue;
} }

View File

@@ -46,6 +46,7 @@ class WenXueGuan
public function createCrawlWenXueGuanTask(array $arrData) public function createCrawlWenXueGuanTask(array $arrData)
{ {
$arrCcData = json_decode($arrData['cc_data'], true); $arrCcData = json_decode($arrData['cc_data'], true);
// var_dump($arrCcData);
foreach ($arrCcData as $intNSourceId) { foreach ($arrCcData as $intNSourceId) {
$arrTask = [ $arrTask = [
'callback' => [WxgScheduler::class, 'getNovelInfo'], 'callback' => [WxgScheduler::class, 'getNovelInfo'],

View File

@@ -107,6 +107,7 @@ class Scheduler
// return; // return;
$boolResult = $NovelPage->saveNovelInfo(); $boolResult = $NovelPage->saveNovelInfo();
// var_dump($boolResult);
// return; // return;
if ($boolResult == false) { if ($boolResult == false) {

View File

@@ -124,10 +124,12 @@ class NovelPage extends BasePage
$this->arrNovelInfo[$strKey] = $Item->attr('content'); $this->arrNovelInfo[$strKey] = $Item->attr('content');
}); });
if (!empty($this->arrNovelInfo['og_novel_category']) && $this->arrNovelInfo['og_novel_category'] == '玄幻小说') { if (!empty($this->arrNovelInfo['og_novel_category']) ) {
if($this->arrNovelInfo['og_novel_category'] == '玄幻小说' || $this->arrNovelInfo['og_novel_category'] == '武侠小说'){
$this->arrNovelInfo['og_novel_category'] = '玄幻修真'; $this->arrNovelInfo['og_novel_category'] = '玄幻修真';
} }
}
$this->getReletedNovel(); $this->getReletedNovel();
} }
@@ -242,6 +244,7 @@ class NovelPage extends BasePage
$arrUpdate = array_merge($arrUpdate, $arrNovelInfo); $arrUpdate = array_merge($arrUpdate, $arrNovelInfo);
$arrUpdate['n_related_novel'] = $this->arrRelatedNovel; $arrUpdate['n_related_novel'] = $this->arrRelatedNovel;
$arrUpdate['n_forge_novel'] = $this->arrForgeNovel; $arrUpdate['n_forge_novel'] = $this->arrForgeNovel;
$arrUpdate['n_category_pinyin'] = CategoryModel::getPinYin($this->arrNovelInfo['og_novel_category']); $arrUpdate['n_category_pinyin'] = CategoryModel::getPinYin($this->arrNovelInfo['og_novel_category']);
$arrUpdate['n_category_sex_en'] = CategoryModel::getSexEn($this->arrNovelInfo['og_novel_category']); $arrUpdate['n_category_sex_en'] = CategoryModel::getSexEn($this->arrNovelInfo['og_novel_category']);
$arrUpdate['n_category_sex_zh'] = CategoryModel::getSexZh($this->arrNovelInfo['og_novel_category']); $arrUpdate['n_category_sex_zh'] = CategoryModel::getSexZh($this->arrNovelInfo['og_novel_category']);

View File

@@ -96,17 +96,20 @@ class Scheduler
*/ */
public function getNovelInfo(array $arrFilter) public function getNovelInfo(array $arrFilter)
{ {
// var_dump('getNovelInfo------------------------------------------------------------');
$Site = $this->getSite(); $Site = $this->getSite();
$arrNovelPageList = $Site->getNovelPageList($arrFilter); $arrNovelPageList = $Site->getNovelPageList($arrFilter);
// var_dump($arrNovelPageList);
// var_dump('$arrNovelPageList------------------------------------------------------------');
$arrCover = []; $arrCover = [];
foreach ($arrNovelPageList as $NovelPage) { foreach ($arrNovelPageList as $NovelPage) {
// $arrNovel = $NovelPage->getNovelInfo(); // $arrNovel = $NovelPage->getNovelInfo();
// print_r($arrNovel); // print_r($arrNovel);
// return; // return;
// var_dump('$NovelPage------------------------------------------------------------');
$boolResult = $NovelPage->saveNovelInfo(); $boolResult = $NovelPage->saveNovelInfo();
// var_dump($boolResult);
// return; // return;
if ($boolResult == false) { if ($boolResult == false) {
@@ -130,6 +133,7 @@ class Scheduler
} }
$arrChapterList = $NovelPage->getChapters(); $arrChapterList = $NovelPage->getChapters();
// var_dump($arrChapterList);
$this->fetchChapter($NovelPage->intNId, $NovelPage->getData()['page'], $arrChapterList); $this->fetchChapter($NovelPage->intNId, $NovelPage->getData()['page'], $arrChapterList);
} }
@@ -147,9 +151,13 @@ class Scheduler
{ {
$intSliceSize = $this->intSlice; $intSliceSize = $this->intSlice;
$arrUri = []; $arrUri = [];
$strUri = '/list/lastupdate_%s_0_0_%s.html'; // $strUri = '/list/lastupdate_%s_0_0_%s.html';
$strUri = '/sort/%s_%s/';
$intEndCategory = $intEndPage = 10; $intEndCategory = 10;
$intEndPage = 10;
// $intEndCategory = 2;
// $intEndPage = 2;
for ($intCategoryKey = 0; $intCategoryKey < $intEndCategory; $intCategoryKey++) { for ($intCategoryKey = 0; $intCategoryKey < $intEndCategory; $intCategoryKey++) {
for ($intPage = 1; $intPage <= $intEndPage; $intPage++) { for ($intPage = 1; $intPage <= $intEndPage; $intPage++) {
@@ -159,6 +167,8 @@ class Scheduler
$arrUri = array_chunk($arrUri, $intSliceSize); $arrUri = array_chunk($arrUri, $intSliceSize);
// var_dump($arrUri);
// return ;
$arrTask = [ $arrTask = [
'callback' => [static::class, 'getLatestChapter'], 'callback' => [static::class, 'getLatestChapter'],
'data' => [], 'data' => [],
@@ -181,27 +191,34 @@ class Scheduler
$Site = $this->getSite(); $Site = $this->getSite();
$arrLatestListPageList = $Site->getLatestListPageList($arrFilter); $arrLatestListPageList = $Site->getLatestListPageList($arrFilter);
$arrNSourceId = []; $arrNSourceId = [];
foreach ($arrLatestListPageList as $LatestListPage) { foreach ($arrLatestListPageList as $LatestListPage) {
$arrResult = $LatestListPage->getNovelFilter(); $arrResult = $LatestListPage->getNovelFilter();
// var_dump($arrResult);
$arrNSourceId = array_merge($arrNSourceId, $arrResult); $arrNSourceId = array_merge($arrNSourceId, $arrResult);
} }
// var_dump($arrNSourceId);
$arrNSourceId = array_unique($arrNSourceId); $arrNSourceId = array_unique($arrNSourceId);
$arrNSourceId = array_values($arrNSourceId); $arrNSourceId = array_values($arrNSourceId);
$intSliceSize = $this->intSlice; $intSliceSize = $this->intSlice;
$arrFilter = []; $arrFilter = [];
// var_dump($arrNSourceId);
// return ;
foreach ($arrNSourceId as $intKey => $intNSourceId) { foreach ($arrNSourceId as $intKey => $intNSourceId) {
$arrFilter[] = [ $arrFilter[] = [
'n_source_id' => $intNSourceId, 'n_source_id' => $intNSourceId,
'page' => 0, 'page' => 0,
]; ];
// var_dump($intKey);
// var_dump($intSliceSize);
// var_dump($intKey % $intSliceSize);
// var_dump('---------------------------------------------');
if ($intKey % $intSliceSize == 0) { if ($intKey % $intSliceSize == 0) {
// var_dump('$intKey % $intSliceSize == 0');
$this->fetchNovel($arrFilter); $this->fetchNovel($arrFilter);
$arrFilter = []; $arrFilter = [];
} }

View File

@@ -49,13 +49,16 @@ class LatestListPage extends BasePage
if ($this->isMobile()) { if ($this->isMobile()) {
$arrFilter = $this->getQueryList()->find('div.wrap-box')->eq(0)->find('ul.sort_list li')->map(function ($li) { $arrFilter = $this->getQueryList()->find('div.wrap-box')->eq(0)->find('ul.sort_list li')->map(function ($li) {
$strUri = $li->find('a')->eq(0)->attr('href'); $strUri = $li->find('a')->eq(0)->attr('href');
return supperExtractFilename($strUri); $strNovelId = extractNovelId($strUri);
return (int)$strNovelId;
})->filter()->all(); })->filter()->all();
} else { } else {
$arrFilter = $this->getQueryList()->find('div.layout.layout2.layout-col2.fl ul.txt-list li')->map(function ($li) { $arrFilter = $this->getQueryList()->find('div.layout.layout2.layout-col2.fl ul.txt-list li')->map(function ($li) {
$strUri = $li->find('a')->eq(0)->attr('href'); $strUri = $li->find('a')->eq(0)->attr('href');
return supperExtractFilename($strUri); $strNovelId = extractNovelId($strUri);
return (int)$strNovelId;
return extractNovelId($strUri);
})->filter()->all(); })->filter()->all();
} }

View File

@@ -163,6 +163,7 @@ class Site
public function getNovelPageUri($intNSourceId, $intPage): string public function getNovelPageUri($intNSourceId, $intPage): string
{ {
$intNSourceId = int($intNSourceId);
$intUriFirst = intdiv($intNSourceId, 1000); $intUriFirst = intdiv($intNSourceId, 1000);
$strUri = ''; $strUri = '';
@@ -275,12 +276,16 @@ class Site
$arrPromises = []; $arrPromises = [];
foreach ($arrFilter as $intKey => $strUri) { foreach ($arrFilter as $intKey => $strUri) {
$arrPromises[$intKey] = $this->getClient()->getAsync($strUri); $arrPromises[$intKey] = $this->getClient()->getAsync($strUri);
} }
$arrResults = Promise\Utils::settle($arrPromises)->wait(); $arrResults = Promise\Utils::settle($arrPromises)->wait();
// var_dump($strUri);
// var_dump($arrResults);
$arrSuccessfulResults = array_filter($arrResults, function ($arrResult) { $arrSuccessfulResults = array_filter($arrResults, function ($arrResult) {
// var_dump($arrResult);
return $arrResult['state'] === 'fulfilled'; return $arrResult['state'] === 'fulfilled';
}); });
@@ -296,7 +301,7 @@ class Site
$arrLatestListPage[] = $LatestListPage; $arrLatestListPage[] = $LatestListPage;
} }
// var_dump($arrLatestListPage);
return $arrLatestListPage; return $arrLatestListPage;
} }

View File

@@ -12,6 +12,7 @@ use microserver\ProcessSanitizer;
use app\task\crawler\zw630\Scheduler as Zw630Scheduler; use app\task\crawler\zw630\Scheduler as Zw630Scheduler;
use app\task\crawler\zw74\Scheduler as Zw74Scheduler; use app\task\crawler\zw74\Scheduler as Zw74Scheduler;
use app\task\crawler\xbiqugu\Scheduler as XBiQuGeScheduler;
use app\task\crawler\youzhi\Scheduler as YouZhiScheduler; use app\task\crawler\youzhi\Scheduler as YouZhiScheduler;
use app\task\crawler\fengchao\Scheduler as FengChaoScheduler; use app\task\crawler\fengchao\Scheduler as FengChaoScheduler;
use app\task\crawler\wuxian\Scheduler as WuXianScheduler; use app\task\crawler\wuxian\Scheduler as WuXianScheduler;
@@ -59,6 +60,13 @@ class PlanTask
case 'PULL_74_ZW_NOVEL_LATEST': case 'PULL_74_ZW_NOVEL_LATEST':
self::pull74ZwNovelLatest(); self::pull74ZwNovelLatest();
break; break;
case 'PULL_XBIQUGE_NOVEL':
self::pullXBiQuGeNovel();
break;
case 'PULL_XBIQUGE_NOVEL_LATEST':
self::pullXBiQuGeNovelLatest();
break;
case 'PULL_YOU_ZHI_SHI_PIN': case 'PULL_YOU_ZHI_SHI_PIN':
self::pullYouZhiShiPin(); self::pullYouZhiShiPin();
break; break;
@@ -207,6 +215,39 @@ class PlanTask
$QueueManage->set($arrTask); $QueueManage->set($arrTask);
} }
/**
* Undocumented function
*
* @return void
*/
public static function pullXBiQuGeNovel()
{
$arrTask = [
'callback' => [XBiQuGeScheduler::class, 'crawlFull'],
'data' => []
];
$QueueManage = QueueManage::getInstance();
$QueueManage->set($arrTask);
}
/**
* Undocumented function
*
* @return void
*/
public static function pullXBiQuGeNovelLatest()
{
$arrTask = [
'callback' => [XBiQuGeScheduler::class, 'crawLatest'],
'data' => []
];
$QueueManage = QueueManage::getInstance();
$QueueManage->set($arrTask);
}
/** /**
* Undocumented function * Undocumented function
* *

View File

@@ -46,6 +46,20 @@ class PlanTaskSeeder
], ],
// [
// 'pt_name' => 'xbiqugu小说全量扫描',
// 'pt_code' => 'PULL_XBIQUGE_NOVEL',
// 'pt_enable' => 0,
// 'pt_limit' => 10 * 24 * 3600 * 3,
// ],
// [
// 'pt_name' => 'xbiqugu小说每日增量',
// 'pt_code' => 'PULL_XBIQUGE_NOVEL_LATEST',
// 'pt_enable' => 0,
// 'pt_limit' => 1 * 24 * 3600,
// ],
[ [
'pt_name' => '优质资源库全量采集', 'pt_name' => '优质资源库全量采集',
'pt_code' => 'PULL_YOU_ZHI_SHI_PIN', 'pt_code' => 'PULL_YOU_ZHI_SHI_PIN',