OneJAV – Bài toán crawl hết data site

Hiện tại site này có khoảng 5210 pages . Target là làm sao XGallery khi install trên 1 server mới thì có thể crawl hết data này ???

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

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Blog at WordPress.com.

Up ↑

%d bloggers like this: