Một số vấn đề
- Không thể 1 lần crawl hết được. Bị block IP, bị timeout, bị error etc …
- Giả sử crawl từng page. Nhưng đến page thứ 200 thì 404 … K lẽ stop ???
Vậy thì sao ?
- 1 con schedule chạy khoảng 5m / lần
- 1 con Command chạy và … lưu temporary: Trang tiếp theo sẽ cần crawl, count số lần 404. Nếu vượt quá ngưỡng cho phép ! Stop ! Không làm gì tiếp.
Tuy nhiên vẫn còn 1 issue nhỏ: Con schedule kia vẫn cứ chạy hoài 😐
case 'fully':
$tmpFile = 'onejav.tmp';
$tmpData = [1, 0];
if (Storage::disk('local')->exists($tmpFile)) {
$tmpData = explode(':', Storage::disk('local')->get($tmpFile));
$tmpData[0] = (int) $tmpData[0];
$tmpData[1] = isset($tmpData[1]) ? $tmpData[1] : 0;
}
// Init with page 1
if ($tmpData[0] === 0) {
$tmpData[0] = 1;
}
if ($tmpData[1] === 4) {
return;
}
$crawler = app(\App\Services\Crawler\Onejav::class);
$results = $crawler->getItemLinks('https://onejav.com/new?page='.$tmpData[0]);
$tmpData[0]++;
// 404 then count ++
if (!$results) {
$tmpData[1]++;
} else {
// Reset count
$tmpData[1] = 0;
}
$this->progressBar = $this->createProgressBar();
$this->progressBar->setMessage('', 'status');
$this->progressBar->setMaxSteps($results->count());
$this->itemsProcess($results);
Storage::disk('local')->put($tmpFile, $tmpData[0]++.':'.$tmpData[1]++);
break;
Thật ra mình suy nghĩ
- Nếu trigger lần đầu qua 1 con job
- Bản thân con job sẽ chạy nếu thoả điều kiện cho next page thì nó tự trigger 1 con job tiếp theo. Còn không thì thôi. Đồng nghĩa không còn job nữa.
Tuy nhiên mình chưa không chế được thời gian mà con job chạy. Cũng như làm vậy thì phải manual trigger job 1 lần. Nhưng job rõ ràng có lợi hơn vì nếu bị fail ( không phải do thật sự hết pages mà do network hay các tình huống khác ) thì vẫn có thể retry.
Leave a Reply