Lập Trình Web Scraping Với Perl: Hướng Dẫn Từng Bước Cho Năm 2026
Advanced Data Extraction Specialist
Tóm tắt:
- Perl vẫn là lựa chọn thực tiễn cho việc thu thập dữ liệu web khi nó đã là một phần của ngăn xếp dữ liệu hoặc quy trình. Sử dụng
HTTP::Tinycho các yêu cầu nhỏ,LWP::UserAgentđể kiểm soát HTTP phong phú hơn,HTML::TreeBuilderđể phân tích DOM, vàWWW::Mechanizecho cookies, liên kết, và biểu mẫu. - Không phân tích HTML tùy ý bằng biểu thức chính quy. Phân tích tài liệu thành một cây, chọn các phần tử theo thuộc tính, xác thực các trường bắt buộc, và ghi đầu ra UTF-8 bằng một bộ mã hóa CSV hoặc JSON thực sự.
- Các khách hàng HTTP đơn giản của Perl không thực thi JavaScript. Xác nhận xem dữ liệu cần thiết có tồn tại trong phản hồi ban đầu trước khi thêm một trình duyệt hoặc lớp hiển thị được quản lý.
- Proxy giải quyết các yêu cầu về định tuyến và vị trí; chúng không sửa chữa bộ chọn hoặc hiển thị một trang. Đối với các trang công cộng động hoặc bảo vệ mạnh mẽ, một API được quản lý có thể trả về HTML cho cùng một trình phân tích Perl.
- Trình thu thập chính của hướng dẫn này đã được thử nghiệm với Perl 5.34.1,
libwww-perl6.83,HTML-Tree5.07,Text-CSV2.06, vàWWW::Mechanize2.22 trên trang thực hành an toàn Books to Scrape.
Thu thập dữ liệu web bằng Perl là một lựa chọn hợp lý khi một tổ chức đã có các tập lệnh Perl, triển khai CPAN và chuyên môn xử lý văn bản. Một chương trình Perl ngắn có thể lấy một trang, duyệt HTML, xác thực hồ sơ và xuất ra CSV hoặc JSON sạch mà không cần giới thiệu một môi trường thực thi mới.
Các giới hạn cũng quan trọng không kém. Các khách hàng HTTP tĩnh nhìn thấy phản hồi của máy chủ, không phải DOM được hiển thị bởi trình duyệt. Các trang web hiện đại có thể tải dữ liệu sau khi khởi động trang, yêu cầu một phiên, hoặc áp dụng các điều khiển lưu lượng. Thiết kế đúng giúp giữ việc phân tích trong Perl trong khi chỉ thay đổi lớp thu thập dữ liệu khi mục tiêu yêu cầu.
Hướng dẫn này xây dựng thiết kế đó từng bước.
Khi nào bạn nên sử dụng Perl cho việc thu thập dữ liệu web?
Sử dụng Perl khi:
- Perl đã được cài đặt và hỗ trợ trong môi trường sản xuất;
- nguồn quay lại HTML hoặc JSON hữu ích mà không cần thực thi trình duyệt;
- nhiệm vụ phụ thuộc vào xử lý văn bản trưởng thành và chuyển đổi tệp;
- trình thu thập phải tích hợp với một công việc ETL hoặc báo cáo Perl hiện có;
- nhóm đánh giá cao một tập lệnh nhỏ, có thể kiểm toán hơn một ngăn xếp tự động hóa trình duyệt.
Hãy xem xét một môi trường thực thi khác hoặc một API được quản lý khi nguồn phụ thuộc nhiều vào JavaScript phía khách, trạng thái trình duyệt tương tác, API đa phương tiện, hoặc một framework có hỗ trợ tốt hơn bên ngoài Perl. Điểm mấu chốt không phải là làm cho Perl bắt chước mọi khả năng của trình duyệt. Mục tiêu là để Perl sở hữu các phần mà nó xử lý tốt: điều phối HTTP, phân tích, xác thực, và đầu ra.
Tài liệu CPAN chính thức giải thích cách Perl giải quyết, xây dựng, thử nghiệm, và cài đặt các mô-đun. Ghi lại các phiên bản trong một bản ghi triển khai hoặc hình ảnh sau khi xác thực chúng trong môi trường của bạn.
Chọn mô-đun thu thập dữ liệu Perl đúng
| Mô-đun | Sử dụng tốt nhất | JavaScript | Hỗ trợ phiên | Nguồn cài đặt |
|---|---|---|---|---|
HTTP::Tiny |
Khách hàng GET/POST nhỏ với phụ thuộc tối thiểu | Không | Thủ công | Phần lõi của Perl trên nhiều cài đặt |
LWP::UserAgent |
Tiêu đề, cookies, proxy, thời gian chờ, chuyển hướng | Không | Có, với một hộp cookie | LWP::UserAgent |
HTML::TreeBuilder |
Phân tích HTML thành một cây dễ duyệt | Không | Không áp dụng | HTML::TreeBuilder |
WWW::Mechanize |
Theo dõi liên kết, gửi biểu mẫu, giữ cookies | Không | Có | WWW::Mechanize |
Text::CSV |
Đầu ra CSV nhận thức tiêu chuẩn | Không áp dụng | Không áp dụng | Text::CSV |
JSON::PP |
Mã hóa hoặc giải mã JSON mà không cần mở rộng biên dịch | Không áp dụng | Không áp dụng | Bao gồm với Perl |
Tài liệu LWP::UserAgent hiện tại đề cập đến các chuyển hướng, thời gian chờ, cookies, xác thực, và các phương thức proxy. Tài liệu WWW::Mechanize rõ ràng rằng mô-đun này không thực thi JavaScript.
Thiết lập một dự án Perl có thể lặp lại
Điều kiện tiên quyết:
- Perl 5;
cpanhoặccpanm;- một thư mục dự án có thể ghi;
- truy cập HTTPS ra ngoài;
- quyền thu thập dữ liệu công khai của mục tiêu.
Tạo một dự án và cài đặt các mô-đun chính xác đã sử dụng trong ví dụ đầy đủ:
bash
mkdir perl-books-scraper
cd perl-books-scraper
cpanm LWP@6.83 HTML::Tree@5.07 Text::CSV@2.06 WWW::Mechanize@2.22
perl -MLWP -MHTML::TreeBuilder -MText::CSV -MWWW::Mechanize -e 'print "các mô-đun đã sẵn sàng\n"'
Các phiên bản này đã được xác minh dựa trên các kho gói của chúng trong khi soạn thảo. Nếu một trình quản lý gói hệ điều hành cung cấp các mô-đun cũ hơn, hãy sử dụng một thư viện cục bộ của dự án thay vì thay thế các thành phần Perl hệ thống.
Các tệp cho hướng dẫn này là:
perl-books-scraper/
├── scrape_books.pl
├── books.csv
└── books.json
Thực hiện một yêu cầu nhỏ với HTTP::Tiny
HTTP::Tiny là đủ khi nhiệm vụ là “gửi một yêu cầu và kiểm tra phản hồi.” Nó trả về một hash với status, reason, headers, và content.
perl
use strict;
use warnings;
use HTTP::Tiny;
my $url = 'https://books.toscrape.com/';
```perl
my $response = HTTP::Tiny->new(
agent => 'PublicCatalogResearch/1.0',
timeout => 20,
)->get($url);
die "Yêu cầu không thành công: $response->{status} $response->{reason}\n"
unless $response->{success};
print "Đã nhận " . length($response->{content}) . " byte\n";
Điều này hữu ích cho việc kiểm tra endpoint và các feed JSON. Đối với cookies, thông tin đăng nhập proxy, đối tượng phản hồi chi tiết, hoặc xử lý chuyển hướng phong phú hơn, hãy sử dụng LWP::UserAgent.
Xây dựng một trình thu thập dữ liệu LWP và HTML::TreeBuilder hoàn chỉnh
Ví dụ chịu lực này thu thập các thẻ sản phẩm hiển thị trên trang chủ Books to Scrape, xác thực từng bản ghi và ghi cả CSV và JSON.
Khối mã này cần truy cập mạng tới books.toscrape.com và bốn mô-đun đã cài đặt ở trên. Nó không cần thông tin đăng nhập.
perl
use strict;
use warnings;
use utf8;
use HTML::TreeBuilder;
use JSON::PP qw(encode_json);
use LWP::UserAgent;
use Text::CSV;
binmode STDOUT, ':encoding(UTF-8)';
binmode STDERR, ':encoding(UTF-8)';
my $url = $ENV{TARGET_URL} || 'https://books.toscrape.com/';
my $ua = LWP::UserAgent->new(
agent => 'PublicCatalogResearch/1.0',
timeout => 20,
max_size => 2_000_000,
);
$ua->protocols_allowed(['https']);
my $response = $ua->get($url);
die "Lỗi HTTP: " . $response->status_line . "\n"
unless $response->is_success;
my $content_type = $response->header('Content-Type') || '';
die "Đã nhận không phải HTML, nhận được $content_type\n"
unless $content_type =~ m{text/html}i;
my $tree = HTML::TreeBuilder->new;
$tree->ignore_unknown(0);
$tree->parse_content($response->decoded_content);
my @records;
for my $card ($tree->look_down(_tag => 'article', class => qr/\bproduct_pod\b/)) {
my $link = $card->look_down(_tag => 'h3')->look_down(_tag => 'a');
my $price = $card->look_down(_tag => 'p', class => qr/\bprice_color\b/);
my $stock = $card->look_down(_tag => 'p', class => qr/\binstock\b/);
next unless $link && $price && $stock;
my $title = $link->attr('title') || $link->as_trimmed_text;
my $href = $link->attr('href') || '';
push @records, {
title => $title,
price => $price->as_trimmed_text,
stock => $stock->as_trimmed_text,
url => $href,
};
}
$tree->delete;
die "Kiểm tra chấp nhận không thành công: không có bản ghi sản phẩm hoàn chỉnh\n" unless @records;
my $csv = Text::CSV->new({ binary => 1, eol => "\n" })
or die "Không thể khởi tạo bộ mã hóa CSV\n";
open my $csv_fh, '>:encoding(UTF-8)', 'books.csv'
or die "Không thể ghi file books.csv: $!\n";
$csv->print($csv_fh, [qw(title price stock url)]);
for my $record (@records) {
$csv->print($csv_fh, [@{$record}{qw(title price stock url)}]);
}
close $csv_fh;
open my $json_fh, '>:encoding(UTF-8)', 'books.json'
or die "Không thể ghi file books.json: $!\n";
print {$json_fh} JSON::PP->new->utf8(0)->canonical->pretty->encode(\@records);
close $json_fh;
print "Đã chấp nhận " . scalar(@records) . " bản ghi sản phẩm\n";
Chạy nó:
bash
perl scrape_books.pl
head -n 4 books.csv
perl -MJSON::PP -0777 -e 'decode_json(<STDIN>); print "JSON hợp lệ\n"' < books.json
Kiểm tra chấp nhận là rất quan trọng. Một trang HTTP 200 vẫn có thể là một màn hình đăng nhập, trang thách thức, thông điệp bảo trì, hoặc mẫu đã thay đổi. Một bộ thu thập sản xuất nên xác thực các trường mong đợi và cách ly các đầu ra không mong muốn thay vì ghi chúng vào tập dữ liệu chính.
Tại sao không phân tích HTML bằng biểu thức chính quy?
Perl có một động cơ biểu thức chính quy tuyệt vời, nhưng HTML là một cây với các phần tử lồng nhau, thuộc tính tùy chọn, thực thể ký tự, script, bình luận và đánh dấu không hợp lệ. Một mẫu hoạt động trên một ảnh chụp thường bị gãy khi đổi khoảng trắng hoặc thứ tự thuộc tính.
Sử dụng biểu thức chính quy cho giá trị sau khi chọn—ví dụ, chuẩn hóa một chuỗi giá. Sử dụng trình phân tích HTML để định vị phần tử.
Tài liệu tham khảo HTML::TreeBuilder mô tả look_down, thuộc tính phần tử, trích xuất văn bản, và dọn dẹp cây rõ ràng. Gọi $tree->delete sẽ giải phóng các tham chiếu vòng sau khi phân tích.
Độ bền của bộ chọn đến từ các mỏ neo ngữ nghĩa:
- Các loại phần tử và mã lớp ổn định;
- Các thuộc tính
data-*nhằm lưu trữ trạng thái ứng dụng; - Các trường đã được đánh dấu theo sơ đồ;
- Nhãn gần các giá trị;
- Kiểm tra chấp nhận cho các trường bắt buộc.
Tránh các giả định vị trí như “div thứ ba chứa giá”.
Giữ phiên và gửi biểu mẫu với WWW::Mechanize
WWW::Mechanize mở rộng LWP::UserAgent với các liên kết, biểu mẫu, cookie và trợ lý lịch sử. Nó hữu ích cho các quy trình làm việc bằng biểu mẫu được ủy quyền và kiểm thử ứng dụng khi trang trả về HTML bình thường.
Ví dụ này sử dụng một URL và tên trường biểu mẫu là điều kiện tiên quyết vì các biểu mẫu khác nhau giữa các trang. Chỉ sử dụng nó trên một ứng dụng bạn sở hữu hoặc được ủy quyền để kiểm thử.
perl
use strict;
use warnings;
use WWW::Mechanize;
my $mech = WWW::Mechanize->new(
agent => 'Kiểm tra Biểu mẫu Được Ủy quyền/1.0',
autocheck => 1,
timeout => 20,
);
vi
$mech->get($ENV{AUTHORIZED_FORM_URL});
$mech->submit_form(
form_name => 'search',
fields => { query => 'tài liệu' },
);
print $mech->title . "\n";
Không đặt tên người sử dụng hoặc mật khẩu trong một script công khai. Đọc bí mật từ môi trường được bảo vệ hoặc trình quản lý bí mật, và giữ nội dung phản hồi ra khỏi nhật ký khi nó có thể chứa dữ liệu tài khoản.
Cấu hình một proxy trong LWP::UserAgent
Một proxy là thích hợp khi yêu cầu là một khu vực đã chọn, một lối ra đã được phê duyệt ổn định, hoặc phân tách giữa các công việc thu thập. Nó không làm cho một mục tiêu không được ủy quyền trở nên chấp nhận được.
Khối sau là một ví dụ cấu hình yêu cầu thông tin xác thực proxy thuộc sở hữu của người đọc:
perl
use strict;
use warnings;
use LWP::UserAgent;
for my $name (qw(PROXY_HOST PROXY_PORT PROXY_USER PROXY_PASSWORD)) {
die "Đặt $name\n" unless defined $ENV{$name} && length $ENV{$name};
}
my $proxy = sprintf(
'%s://%s:%s@%s:%s',
'http',
$ENV{PROXY_USER},
$ENV{PROXY_PASSWORD},
$ENV{PROXY_HOST},
$ENV{PROXY_PORT},
);
my $ua = LWP::UserAgent->new(timeout => 20);
$ua->proxy([qw(http https)], $proxy);
my $response = $ua->get('https://example.com/');
die $response->status_line unless $response->is_success;
print $response->decoded_content;
Giữ thông tin xác thực proxy trong môi trường và che đậy chúng khỏi các báo cáo ngoại lệ. Trang Giải pháp Proxy Không Rác giúp lập bản đồ các tùy chọn cư trú, trung tâm dữ liệu, ISP tĩnh và IPv6 đến yêu cầu lưu lượng.
Xử lý thất bại mà không làm hỏng dữ liệu
Sự kiên cường bắt đầu với các kết quả rõ ràng, có giới hạn:
- từ chối mã trạng thái HTTP không thành công;
- giới hạn kích thước phản hồi và thời gian yêu cầu;
- xác nhận
Content-Type; - xác thực danh tính trang mong đợi;
- yêu cầu các trường xác định một bản ghi hoàn chỉnh;
- viết đầu ra mới vào một đường dẫn tạm thời và chỉ đổi tên sau khi xác thực;
- gửi các trang không mong đợi vào một thư mục cách ly với metadata an toàn;
- phát hành nhật ký có cấu trúc mà không có thông tin xác thực hoặc thân phản hồi.
Xem xét 403, 429, và HTML không mong đợi như là tín hiệu để dừng lại và điều tra chính sách, tốc độ, thay đổi mục tiêu, hoặc sự phù hợp với việc thu thập. Đừng tạo ra một vòng lặp thất bại không giới hạn.
Cũng tôn trọng Giao thức Loại Trừ Robot, các điều khoản mục tiêu, luật riêng tư, và ngân sách yêu cầu cụ thể cho nguồn. Đối với các cuộc thu thập lớn hơn, lưu trữ một URL chuẩn và băm nội dung để cùng một trang không bị xử lý hai lần.
Biết khi nào trang yêu cầu JavaScript
Kiểm tra phản hồi thô trước khi giả định rằng việc kết xuất trình duyệt là cần thiết:
- Mở công cụ phát triển của trình duyệt.
- Tải lại trang và xác định phản hồi mạng chứa dữ liệu cần thiết.
- So sánh phản hồi đó với đầu ra
LWP::UserAgent. - Tìm kiếm trong HTML một tên sản phẩm đã biết hoặc định danh bản ghi.
- Nếu dữ liệu đến từ một điểm cuối JSON công khai, hãy sử dụng điểm cuối được ủy quyền đó trực tiếp.
- Nếu dữ liệu chỉ tồn tại sau khi thực thi trình duyệt, hãy chuyển việc thu thập sang một lớp kết xuất.
WWW::Mechanize không phải là một động cơ JavaScript. Các mô-đun Perl điều khiển trình duyệt tồn tại, nhưng chúng thêm các tệp nhị phân trình duyệt, khả năng tương thích trình điều khiển, cách ly quy trình, và yêu cầu tài nguyên lớn hơn. Điều này có thể hợp lý cho một hệ thống nội bộ nhỏ; nhưng hiếm khi là một bản nâng cấp kiểu 'drop-in' cho một scraper tĩnh.
Khi các hoạt động trình duyệt trở thành dự án chính, hãy kiểm tra một URL đại diện thông qua Universal Scraping API và so sánh đầu ra được chấp nhận, độ trễ, và nỗ lực vận hành.
Gọi Universal Scraping API từ Perl
Đường dẫn được quản lý giữ cho trình phân tích hạ nguồn trong Perl. API thực hiện việc thu thập trang và trả về kết quả; Perl xác thực và chuyển đổi nó.
Khối này yêu cầu SCRAPELESS_API_KEY và một TARGET_URL được ủy quyền. Xác nhận các trường yêu cầu hiện tại trong hướng dẫn nhanh Universal Scraping API trước khi sử dụng trong sản xuất.
perl
use strict;
use warnings;
use HTTP::Tiny;
use JSON::PP qw(encode_json decode_json);
my $token = $ENV{SCRAPELESS_API_KEY} or die "Đặt SCRAPELESS_API_KEY\n";
my $target = $ENV{TARGET_URL} or die "Đặt TARGET_URL\n";
my $response = HTTP::Tiny->new(timeout => 60)->post(
'https://api.scrapeless.com/api/v1/scraper/request',
{
headers => {
'Content-Type' => 'application/json',
'x-api-token' => $token,
},
content => encode_json({
actor => 'unlocker.webunlocker',
input => { url => $target },
}),
},
);
die "Lỗi API: $response->{status} $response->{reason}\n";
trừ phi $response->{success};
my $payload = decode_json($response->{content});
die "Phản hồi API không chứa dữ liệu\n" trừ khi tồn tại $payload->{data};
print JSON::PP->new->canonical->pretty->encode($payload->{data});
Ranh giới này được thiết kế đơn giản:
- Scrapeless giữ quyền sở hữu về việc thu thập trang và các hoạt động mạng;
- Perl nắm giữ phạm vi mục tiêu, xác thực phản hồi, phân tích và lưu trữ;
- tổ chức sở hữu quyền hạn, lưu trữ và sử dụng dữ liệu.
Xuất CSV và JSON sạch
CSV và JSON phục vụ các hệ thống hạ nguồn khác nhau.
Chọn CSV khi kết quả phẳng và sẽ được đưa vào Excel, nhập cơ sở dữ liệu hoặc công cụ phân tích. Sử dụng Text::CSV; nó trích dẫn chính xác dấu phẩy, dòng mới và dấu ngoặc kép.
Chọn JSON khi các bản ghi chứa các mảng, đối tượng lồng nhau, hoặc siêu dữ liệu như URL nguồn, thời gian thu thập và trạng thái xác thực. JSON::PP là di động và tạo ra JSON tuân thủ tiêu chuẩn.
Đối với quy trình làm việc chuyển dữ liệu web đến các nhà phân tích, xem thu thập dữ liệu web trong Excel với Power Query và API. Đối với lựa chọn đầu ra API, đọc hướng dẫn định dạng phản hồi Scrapeless.
Mỗi bản ghi nên mang đủ thông tin nguồn gốc để kiểm tra:
- URL nguồn;
- thời gian thu thập;
- phiên bản phân tích hoặc sơ đồ;
- ngôn ngữ hoặc khu vực khi cần thiết;
- băm nội dung;
- trạng thái chấp nhận.
Danh sách kiểm tra sản xuất cho các trình thu thập Perl
Trước khi lập lịch cho tập lệnh:
- Nguồn và các trường đã được ủy quyền.
- Các chỉ dẫn và điều khoản robots của mục tiêu đã được xem xét.
- Các phiên bản module đã được cố định và thử nghiệm.
- Bí mật đến từ các biến môi trường được bảo vệ.
- Bộ phân tích sử dụng các bộ chọn cấu trúc, không phải regex HTML tùy ý.
- Kích thước phản hồi, thời gian, loại nội dung và các trường yêu cầu đã được giới hạn.
- Các trang không mong đợi được đưa vào vùng cách ly.
- Nhật ký không bao gồm thông tin xác thực và nội dung nhạy cảm.
- Đầu ra CSV và JSON đảm bảo an toàn về mã hóa.
- Các yêu cầu trang động có quyết định thu thập rõ ràng.
- Các chỉ số đếm các bản ghi được chấp nhận, không chỉ yêu cầu.
Giữ Perl tập trung vào hợp đồng dữ liệu
Perl mạnh mẽ nhất khi trình thu thập có một hợp đồng rõ ràng: lấy một nguồn hợp pháp, phân tích các cấu trúc đã biết, xác thực các bản ghi hoàn chỉnh và viết đầu ra định lượng. Điều đó vẫn hữu ích cho dù HTML đến trực tiếp từ LWP::UserAgent, qua một proxy, hoặc từ một API tạo viên được quản lý.
Bắt đầu với phương pháp nhỏ nhất hoạt động. Nếu trang là động hoặc được bảo vệ mạnh, giữ nguyên bộ phân tích Perl đã xác thực và chỉ thay thế phần thu thập. So sánh các tùy chọn giá hiện tại của Scrapeless, sau đó tạo một tài khoản Scrapeless và thử một URL công khai đại diện trước khi cam kết vào một cuộc di cư lớn hơn.
Câu hỏi thường gặp
Perl có còn tốt cho thu thập dữ liệu web vào năm 2026 không?
Có, đặc biệt đối với các nhóm có một môi trường Perl hiện có và các mục tiêu trả lại HTML hoặc JSON hữu ích. Perl có các module HTTP, phân tích HTML, phiên, CSV và JSON phát triển mạnh. Công việc nặng về trình duyệt có thể dễ dàng hơn thông qua một lớp thu thập được quản lý hoặc một ngăn xếp tự động hóa hỗ trợ khác.
Module Perl nào tốt nhất cho thu thập dữ liệu web?
Sử dụng HTTP::Tiny cho một khách hàng tối thiểu, LWP::UserAgent cho kiểm soát yêu cầu phong phú hơn, HTML::TreeBuilder cho phân tích HTML, và WWW::Mechanize cho các liên kết, biểu mẫu, cookie và lịch sử phiên. Hầu hết các dự án thực tế kết hợp một khách hàng HTTP với một bộ phân tích và một trình mã hóa đầu ra.
LWP::UserAgent có thực thi JavaScript không?
Không. Nó lấy phản hồi HTTP nhưng không chạy JavaScript của trang. Nếu dữ liệu cần thiết không có trong phản hồi, hãy sử dụng một điểm cuối JSON được ủy quyền, một công cụ điều khiển trình duyệt, hoặc một API tạo viên được quản lý.
Có nên sử dụng regex Perl để phân tích HTML không?
Không, không cho cấu trúc tài liệu. Sử dụng một bộ phân tích HTML để xác định các phần tử, sau đó sử dụng biểu thức thông thường để chuẩn hóa văn bản đã chọn khi cần thiết.
Làm thế nào để sử dụng một proxy với Perl?
Tạo một LWP::UserAgent và gọi phương thức proxy của nó cho các giao thức cần thiết. Đọc máy chủ proxy, cổng, tên người dùng và mật khẩu từ các biến môi trường được bảo vệ.
Thu thập dữ liệu web có hợp pháp không?
Tính hợp pháp phụ thuộc vào khu vực pháp lý, phương thức truy cập, điều khoản mục tiêu, loại dữ liệu và mục đích sử dụng. Hạn chế việc thu thập dữ liệu công khai được ủy quyền, tôn trọng các chỉ dẫn robots và giới hạn nguồn, giảm thiểu dữ liệu cá nhân, và có được tư vấn pháp lý cho các chương trình có rủi ro cao hơn.
Tại Scrapless, chúng tôi chỉ truy cập dữ liệu có sẵn công khai trong khi tuân thủ nghiêm ngặt các luật, quy định và chính sách bảo mật trang web hiện hành. Nội dung trong blog này chỉ nhằm mục đích trình diễn và không liên quan đến bất kỳ hoạt động bất hợp pháp hoặc vi phạm nào. Chúng tôi không đảm bảo và từ chối mọi trách nhiệm đối với việc sử dụng thông tin từ blog này hoặc các liên kết của bên thứ ba. Trước khi tham gia vào bất kỳ hoạt động cạo nào, hãy tham khảo ý kiến cố vấn pháp lý của bạn và xem xét các điều khoản dịch vụ của trang web mục tiêu hoặc có được các quyền cần thiết.



