Trong phần này chúng ta sẽ tìm hiểu một số tham số cấu hình Scrapy.
Các cấp độ cấu hình
Scrapy cho phép chúng ta chỉnh sửa các thiết lập ở 4 cấp độ, mức độ càng cao thì độ ưu tiên càng lớn.
Cấp độ đầu tiên là các thiết lập mặc định trong file scrapy/settings/default_settings.py.
Và đây là nơi mà chúng ta thường sẽ không để í tới, nếu không muốn nói là đừng đụng vào.
Cấp độ tiếp theo là ở file settings.py
trong thư mục của mỗi project khi chúng tạo một project. Thông thường chúng ta sẽ hay chỉnh sửa ở đây tùy vào nhu cầu của mỗi project.
Cấp độ thứ 3 nằm trong phần định nghĩa thuộc tính custom_settings
của mỗi lớp Spider được tạo ra.
Cấp độ cuối cùng là thiết lập ở phần command khi chạy các lệnh trên Console như chúng ta đã từng làm trong các phần trước.
Ở đây chúng ta sẽ chủ yếu tìm hiểu một số thiết lập thường dùng.
CONCURRENT_REQUEST
Đây là tham số quy định số lượng request tối đa mà Scrapy được phép gửi cùng một lúc.
Chúng ta có thể dùng lệnh scrapy settings
để xem tham số này như sau:
$ scrapy settings --get CONCURRENT_REQUESTS 16
Tham số này được quy định mặc định trong Scrapy là 16. Tuy nhiên tham số này cũng được định nghĩa riêng trong mỗi project ở file settings.py
, và thông thường là 32 request. Tuy nhiên tham số này được nằm trong comment trong khi tạo project, do đó Scrapy vẫn thường lấy giá trị 16 mặc định. Chúng ta có thể uncomment dòng CONCURRENT_REQUESTS
trong file này của project nào đó để Scrapy sử dụng tham số này cho riêng project đó.
... CONCURRENT_REQUESTS = 32 ...
Chúng ta có thể sửa lại thành bất cứ con số nào mà chúng ta muốn, và phải chạy lệnh scrapy settings
trong thư mục của project thì mới thấy tham số này của riêng project đó.
Ngoài ra chúng ta có thể sửa tham số bằng này dòng lệnh như sau:
$ scrapy settings --get CONCURRENT_REQUESTS -s CONCURRENT_REQUESTS=9 19
Lưu ý là việc chỉnh sửa qua dòng lệnh chỉ có tác dụng khi chạy lệnh đó, sau đó mọi thứ sẽ trờ lại như cũ.
Cấu hình logging
LOG_LEVEL
Khi cào dữ liệu từ các spider thì Scrapy thường output ra rất nhiều thứ, nhưng chúng đều có các mức độ từ thấp tới cao, theo thức tự DEBUG
> INFO
> WARNING
> ERROR
> CRITICAL,
tùy vào loại output đó nằm ở mức độ nào mà nó có được in ra hay không.
Để thiết lập cấp độ Log thì chúng ta thêm dòng sau vào file settings.py
:
LOG_ LEVEL = 'INFO'
Lưu ý là các output ở cấp độ cao hơn vẫn được in ra, ví dụ ở đây chúng ta thiết lập là INFO
, tức là chỉ có những output thuộc DEBUG
là không được in ra, còn lại từ INFO
-> CRITICAL
đều vẫn được in.
LOG_ENABLED
Tham số này quy định Scrapy có output mọi thứ hay không.
... LOG_ENABLED = True/False ...
LOG_STDOUT
Tham số này cho biết có đưa những thứ từ các hàm in chuỗi ra không, chẳng hạn như hàm print().
... LOG_STDOUT = True/False ...
Cấu hình hiệu suất
Việc cấu hình hiệu suất làm việc của Scrapy sẽ được bàn kĩ hơn trong các phần sau, ở đây mình chỉ nói sơ qua. Một tham số có liên quan đến hiệu suất đã được nói ở trên là CONCURRENT_REQUESTS,
nhằm quy định số lượng request được gửi đi tại một thời điểm. Tham số này cũng có thể được dùng để bảo vệ server của chúng ta khi chúng ta cào quá nhiều dữ liệu trên nhiều website cùng một lúc.
Ngoài ra còn có 2 tham số là CONCURRENT_REQUESTS_PER_DOMAIN
và CONCURRENT_REQUESTS_PER_IP
quy định số lượng requets tối đa được gửi đi tại một thời điểm trên mỗi tên miền hoặc địa chỉ IP. Nhưng nếu chúng ta thiết lập cho tham số CONCURRENT_REQUESTS_PER_IP
thì Scrapy sẽ không quan tâm đến tham số CONCURRENT_REQUESTS_PER_DOMAIN
nữa.
Một tham số khác là CONCURRENT_ITEMS,
có chức năng giới hạn số lượng Item có thể trích xuất từ các response tại một thời điểm. Tuy vậy thì tham số này thường không có gì đáng quan tâm, bởi chúng ta thường hay cào 1 Item trên 1 response. Tham số này mặc định là 100, và như vậy là cứ mỗi request được gửi đi – tức là có 1 response được gửi về thì có thể có tối đa 100 Item được trích xuất, nên nếu có 16 request/response được gửi đi/trả về thì chúng ta có thể gặp trường hợp là có tới 1600 Items đang được lưu lên cơ sở dữ liệu (nếu chúng ta có dùng CSDL).
Một tham số khác có ảnh hưởng đến hiệu suất là DOWNLOAD_TIMEOUT,
quy định thời gian tối đa có thể đợi trước khi hủy 1 request nếu chưa có response trả về. Tham số này mặc định là 180 giây, tức 3 phút.
Ngoài ra, Scrapy còn có tham số DOWNLOAD_DELAY
– quy định thời gian đợi giữa các lần gửi request là random(0, DOWNLOAD_DELAY
). Lí do có tham số này là vì có một số website đo tần suất gửi request để biết được có phải là bên gửi là một con bot đang auto hay không (vì một số site không thích bot auto). Tuy nhiên chúng ta có thể tắt tham số này bằng cách thiết lập RANDOMIZE_DOWNLOAD_DELAY=False
.
Một tham số khác có thể giúp tăng tốc hiệu suất là DNSCACHE_ENABLED=True/False
, giúp lưu lại địa chỉ máy chủ DNS trong bộ nhớ cache để sử dụng cho các request lần sau.
Dừng hoạt động Scrapy
Scrapy có một vài tham số giúp hủy cào dữ liệu khi có một điều kiện nào đó được thỏa mãn. Ví dụ:
Dừng cào dữ liệu sau khi đã cào được 10 item
$ scrapy crawl basic -s CLOSESPIDER_ITEMCOUNT=10
Dừng cào dữ liệu sau khi đã cào được 10 trang.
$ scrapy crawl basic -s CLOSESPIDER_PAGECOUNT=10
Dừng cào dữ liệu sau khi đã hết 10 giây.
$ scrapy crawl basic -s CLOSESPIDER_TIMEOUT=10