Scrapy – Vấn đề tràn bộ nhớ khi start_requests với số urls quá lớn

Nếu spider của bạn có số urls khi start_requests quá lớn (>100.000 urls) có thể gây ra các vấn đề về bộ nhớ. Để giải quyết vấn đề này, chúng ta có thể start_requests với số lượng ít url và tiếp tục bổ sung request cho spider về sau.

Giải pháp

Giải pháp cơ bản là chạy lặp spider mà mỗi lần chỉ thực hiện một số ít các requests. Khi số request trên được thực hiện xong thì sẽ bổ sung thêm request cho spider. Tham khảo sơ đồ dưới đây:

Scrapy chạy lặp spider để giới hạn số urls trong start_requests
Scrapy chạy lặp spider để giới hạn số urls trong start_requests

Scrapy cung cấp signal (tín hiệu) spider_idle cho biết khi nào spider rỗi (tức là hết số requests). Khi Scrapy bật tín hiệu này, chúng ta có thể bổ sung thêm số request vào cho spider. Tham khảo spider_idle tại: https://doc.scrapy.org/en/latest/topics/signals.html#spider-idle.

Dưới đây là source code tham khảo

Tạo lớp middleware

Trong project tạo file middleware.py để handle signal spider_idle và bổ sung thêm request cho spider

Spider sử dụng middleware vừa tạo

Trong Spider chúng ta định nghĩa làm start_requests mà thực hiện giới hạn số request. Mã nguồn như dưới đây:

Trong đó, hàm readUrlFromSomewhere là do bạn tự định nghĩa để bổ sung số urls vào cho hàm start_requests.

Như vậy, với cách trên, chúng ta có thể giải quyết được vấn đề khi số lượng start_requests quá lớn. Chúng ta cũng có thể sử dụng giải pháp này để chạy 1 spider mãi mãi nhằm cập nhật trạng thái của dữ liệu.

Chúc các bạn thành công !


Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *