Mô tả các phương thức (v1)
JavaScript API này được coi là lỗi thời, chúng tôi khuyên bạn nên sử dụng API phiên bản 2
Lưu ý rằng một số phương thức yêu cầu chỉ định từ khóa yield
yield this.request()
yield this.request(method, url, queryParams, opts)
Nhận phản hồi HTTP theo yêu cầu, các đối số được chỉ định là:
method- phương thức yêu cầu (GET, POST...)url- liên kết để yêu cầuqueryParams- hash với các tham số get hoặc hash với thân của yêu cầu postopts- hash với các tùy chọn yêu cầu
Nếu sử dụng phương thức POST, thân yêu cầu có thể được truyền theo hai cách:
- chỉ cần liệt kê tên các biến và giá trị của chúng trong
queryParams. Ví dụ:
{
key: set.query,
id: 1234,
type: 'text'
}
- thông qua biến body trong
opts. Ví dụ:
body: 'key=' + set.query + '&id=1234&type=text'
opts.check_content
check_content: [ điều kiện1, điều kiện2, ...] - mảng các điều kiện để kiểm tra nội dung nhận được, nếu kiểm tra không đạt, yêu cầu sẽ được lặp lại với proxy khác.
Khả năng:
- sử dụng các chuỗi làm điều kiện (tìm kiếm theo sự xuất hiện của chuỗi)
- sử dụng các biểu thức chính quy làm điều kiện
- sử dụng các hàm kiểm tra riêng, trong đó dữ liệu và header phản hồi được truyền vào
- có thể chỉ định đồng thời nhiều loại điều kiện khác nhau
- để phủ định logic, hãy đặt điều kiện vào một mảng, ví dụ:
check_content: ['xxxx', [/yyyy/]]có nghĩa là yêu cầu sẽ được coi là thành công nếu dữ liệu nhận được chứa chuỗi con xxxx và đồng thời biểu thức chính quy /yyyy/ không tìm thấy sự trùng khớp trên trang
Để yêu cầu thành công, tất cả các kiểm tra được chỉ định trong mảng phải vượt qua
Ví dụ (trong phần bình luận chỉ định những gì cần thiết để yêu cầu được coi là thành công):
let response = yield this.request('GET', set.query, {}, {
check_content: [
/<\/html>|<\/body>/, //biểu thức chính quy này phải hoạt động trên trang nhận được
['XXXX'], //không được có chuỗi con này trên trang nhận được
'</html>', //phải có chuỗi con như vậy trên trang nhận được
(data, hdr) => {
return hdr.Status == 200 && data.length > 100;
} //hàm này phải trả về true
]
});
opts.decode
decode: 'auto-html' - tự động xác định bảng mã và chuyển đổi sang utf8
Các giá trị có thể:
auto-html- dựa trên tiêu đề, thẻ meta và nội dung trang (tùy chọn tối ưu được khuyến nghị)utf8- chỉ định rằng tài liệu ở bảng mã utf8<encoding>- bất kỳ bảng mã nào khác
opts.headers
headers: { ... } - hash với các tiêu đề, tên tiêu đề được chỉ định ở dạng chữ thường, có thể chỉ định cả cookie
Ví dụ:
headers: {
accept: 'image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8',
'accept-encoding': 'gzip, deflate, br',
cookie: 'a=321; b=test',
'user-agent' 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'
}
opts.headers_order
headers_order: ['cookie', 'user-agent', ...] - cho phép ghi đè thứ tự sắp xếp các tiêu đề
opts.recurse
recurse: N - số lần chuyển hướng tối đa, mặc định là 7, sử dụng 0 để tắt chuyển hướng
opts.proxyretries
proxyretries: N - số lần thử thực hiện yêu cầu, mặc định được lấy từ cài đặt của công cụ cào dữ liệu
opts.parsecodes
parsecodes: { ... } - danh sách các mã phản hồi HTTP mà công cụ cào dữ liệu sẽ coi là thành công, mặc định được lấy từ cài đặt của công cụ cào dữ liệu. Nếu chỉ định '*': 1 thì tất cả các phản hồi sẽ được coi là thành công.
Ví dụ:
parsecodes: {
200: 1,
403: 1,
500: 1
}
opts.timeout
timeout: N - thời gian chờ phản hồi tính bằng giây, mặc định được lấy từ cài đặt của công cụ cào dữ liệu
opts.do_gzip
do_gzip: 1 - xác định có sử dụng nén hay không (gzip/deflate/br), mặc định là bật (1), để tắt cần đặt giá trị 0
opts.max_size
max_size: N - kích thước phản hồi tối đa tính bằng byte, mặc định được lấy từ cài đặt của công cụ cào dữ liệu
opts.cookie_jar
cookie_jar: { ... } - hash với các cookie.
opts.attempt
attempt: N - chỉ định số thứ tự của lần thử hiện tại, khi sử dụng tham số này, trình xử lý lần thử tích hợp cho yêu cầu này sẽ bị bỏ qua
opts.browser
browser: 1 - tự động giả lập tiêu đề trình duyệt (1 - bật, 0 - tắt)
opts.use_proxy
use_proxy: 1 - ghi đè việc sử dụng proxy cho một yêu cầu riêng lẻ bên trong công cụ cào dữ liệu JS thay cho tham số toàn cục Use proxy (1 - bật, 0 - tắt)
opts.noextraquery
noextraquery: 0 - tắt việc thêm Extra query string vào url yêu cầu (1 - bật, 0 - tắt)
opts.save_to_file
save_to_file: file - cho phép tải tệp trực tiếp xuống đĩa, bỏ qua việc ghi vào bộ nhớ. Thay vì file, hãy chỉ định tên và đường dẫn để lưu tệp. Khi sử dụng tùy chọn này, mọi thứ liên quan đến data sẽ bị bỏ qua (kiểm tra nội dung trong check_content, response.data sẽ trống, v.v.).
opts.data_as_buffer
data_as_buffer: 0 - xác định trả về data dưới dạng chuỗi String (0) hoặc dưới dạng đối tượng Buffer (1), mặc định trả về chuỗi String
opts.bypass_cloudflare
bypass_cloudflare: 0 - tự động vượt qua bảo vệ JavaScript của CloudFlare bằng trình duyệt Chrome (1 - bật, 0 - tắt)
opts.follow_meta_refresh
follow_meta_refresh: 0 - cho phép chuyển hướng theo các redirect được khai báo qua thẻ HTML meta:
<meta http-equiv="refresh" content="time; url=..." />
opts.tlsOpts
tlsOpts: { ... } – cho phép truyền cài đặt cho các kết nối https
yield this.parser.request()
yield this.parser.request(parser, preset, overrideParams, query)
Nhận kết quả từ một công cụ cào dữ liệu khác (tích hợp sẵn hoặc một công cụ cào dữ liệu JS khác), các đối số được chỉ định là
parser- tên công cụ cào dữ liệu (SE::Google, JS::Custom::Example)preset- mẫu cài đặt của công cụ cào dữ liệu được gọioverrideParams- hash với các ghi đè cài đặt của công cụ cào dữ liệu được gọiquery- truy vấn
Trong overrideParams có thể ghi đè các tham số của công cụ cào dữ liệu được gọi, ngoài ra còn có các cờ sau:
overrideParams.resultArraysWithObjects
resultArraysWithObjects: 0 - xác định dạng trả về của các mảng kết quả từ công cụ cào dữ liệu được gọi:
- nếu bật (1) - sẽ trả về mảng các đối tượng
[{link: 'link1', anchor: 'anchor1'}, {link: 'link2', anchor: 'anchor2'}, ...] - nếu tắt (0) - sẽ trả về các mảng giá trị tiêu chuẩn
['link1', 'anchor1', 'link2', 'anchor2', ...]
overrideParams.needData
needData: 1 - xác định có truyền (1) hay không (0) trong phản hồi data/pages[], có thể được sử dụng để tối ưu hóa
tools.*
Đối tượng toàn cục tools, cho phép truy cập vào các hàm tích hợp của A-Parser (tương tự như các công cụ của template engine $tools.*).
tools.query không khả dụng, cần sử dụng this.query
this.doLog()
Cho biết việc ghi log tác vụ có được bật hay không, có thể được sử dụng làm cờ để tối ưu hóa, cho các trường hợp khi log không được ghi và đối số cho this.logger.put là một biểu thức phức tạp
this.logger.*
.put()
this.logger.put(message) - thêm dòng message vào log tác vụ
.putHTML()
this.logger.putHTML(code) - xuất mã HTML vào log tác vụ, mã này sẽ được hiển thị trong textarea
yield this.sleep()
yield this.sleep(sec)
Thiết lập độ trễ trong luồng trong số giây sec, có thể là số thập phân.
yield this.mutex.*
Mutex để đồng bộ hóa giữa các luồng, cho phép khóa một đoạn mã cho một luồng
.lock()
Chờ đợi lock, luồng đầu tiên chiếm được lock sẽ tiếp tục thực thi, các luồng khác sẽ chờ giải phóng lock
.unlock()
Giải phóng lock, luồng tiếp theo sẽ tiếp tục thực thi nếu nó đang chờ lock(.lock())
this.cookies.*
Làm việc với cookies cho yêu cầu hiện tại
.getAll()
Lấy mảng cookies
.setAll()
Thiết lập cookies, một mảng các cookies phải được truyền làm đối số
.set()
this.cookies.set(host, path, name, value) - thiết lập một cookie đơn lẻ
this.query.add()
this.query.add(query, maxLvl)
Thêm một truy vấn mới (query) với khả năng tùy chọn chỉ định mức tối đa (maxLvl), tương tự như tools.query.add() Có thể truyền một hash với các tham số làm truy vấn (query), hoạt động tương tự như Trình tạo truy vấn
Ví dụ:
this.query.add({
query: "http://site.com",
param1: "..",
...
});
this.proxy.*
Làm việc với Proxy
.next()
Đổi sang Proxy tiếp theo, Proxy cũ sẽ không được sử dụng cho yêu cầu hiện tại nữa
.ban()
Đổi và chặn Proxy (cần sử dụng khi dịch vụ chặn hoạt động theo IP), Proxy sẽ bị chặn trong khoảng thời gian được chỉ định trong cài đặt của công cụ cào dữ liệu (proxybannedcleanup)
.get()
Lấy Proxy hiện tại (Proxy cuối cùng được sử dụng để thực hiện yêu cầu)
.set()
this.proxy.set('http://127.0.0.1:8080', noChange = false) - thiết lập Proxy cho yêu cầu tiếp theo, tham số noChange là tùy chọn, nếu đặt là true thì Proxy sẽ không thay đổi giữa các lần thử
yield this.captcha.*
Làm việc với captcha
.recognize()
yield this.captcha.recognize(preset, image, type, overrides) - tải captcha để nhận dạng
image- dữ liệu nhị phân của hình ảnh để nhận dạngpreset- chỉ định mẫu thiết lập sẵn cho
Util::AntiGatetypechỉ định một trong các loại: 'jpeg', 'gif', 'png'
Kết quả sẽ là một hash với các trường:
answer- văn bản từ hình ảnhid- id của captcha, để có thể báo lỗi sau này quareportBaderror- lỗi văn bản nếu answer không được xác định
.recognizeFromUrl()
yield this.captcha.recognizeFromUrl(preset, url, overrides) - tương tự như phương thức trước, nhưng việc tải captcha sẽ được thực hiện tự động theo liên kết (url), không sử dụng Proxy
.reportBad()
yield this.captcha.reportBad(preset, id, overrides) - báo cho dịch vụ rằng captcha đã được giải sai
this.utils.*
.updateResultsData()
this.utils.updateResultsData(results, data) - phương thức để tự động điền $pages.$i.data và $data, cần gọi để thêm nội dung của trang kết quả
.urlFromHTML()
this.utils.urlFromHTML(url, base) - xử lý liên kết nhận được từ mã HTML - giải mã các thực thể (& v.v.), tùy chọn có thể truyền base - url cơ sở (ví dụ url của trang nguồn), bằng cách này có thể nhận được liên kết đầy đủ
.url.extractDomain()
this.utils.url.extractDomain(url, removeDefaultSubdomain) - phương thức nhận tham số đầu tiên là liên kết và trả về tên miền từ liên kết đó. Tham số thứ hai tùy chọn xác định có cắt bỏ tên miền phụ www khỏi tên miền hay không. Mặc định là 0 - tức là không cắt bỏ.
.url.extractTopDomain()
this.utils.url.extractTopDomain(url) - phương thức nhận tham số đầu tiên là liên kết và trả về tên miền từ liên kết đó, không có tên miền phụ.
.url.extractTopDomainByZone()
this.utils.url.extractTopDomainByZone(url) - phương thức nhận tham số đầu tiên là liên kết và trả về tên miền từ liên kết đó, bao gồm cả việc không có tên miền phụ. Hoạt động với tất cả các vùng khu vực
.url.extractMaxPath()
this.utils.url.extractMaxPath(url) - phương thức nhận một chuỗi và chọn ra url từ đó
.url.extractWOParams()
this.utils.url.extractWOParams(url)- phương thức nhận một liên kết và trả về chính liên kết đó được cắt bỏ đến chuỗi tham số. Tức là sẽ trả về url trước dấu ?
.removeHtml()
this.utils.removeHtml(string) - phương thức nhận một chuỗi và trả về chuỗi đó đã được làm sạch
khỏi các thẻ html
.removeNoDigit()
this.utils.removeNoDigit(string) - phương thức nhận một chuỗi, xóa tất cả trừ các chữ số và trả về kết quả
.removeComma()
this.utils.removeComma(string) - phương thức nhận một chuỗi, xóa các ký tự như .,\r\n và trả về kết quả
this.sessionManager.*
Để sử dụng phiên làm việc trong công cụ cào dữ liệu JS, trước tiên bạn cần khởi tạo Trình quản lý phiên làm việc. Việc này được thực hiện bằng hàm init()
init() {
this.sessionManager.init({
//tại đây bạn có thể thiết lập các tham số bổ sung
});
}
Trong this.sessionManager.init() có thể sử dụng các tham số sau:
name- tham số tùy chọn, cho phép ghi đè tên của công cụ cào dữ liệu sở hữu các phiên làm việc, mặc định bằng tên của công cụ cào dữ liệu nơi diễn ra quá trình khởi tạocanChangeProxy- tham số tùy chọn, khả năng thay đổi Proxy, mặc định là 1domain- tham số tùy chọn, chỉ định tìm kiếm các phiên làm việc trong số tất cả các phiên đã lưu cho công cụ cào dữ liệu này (nếu giá trị không được đặt), hoặc chỉ cho một tên miền cụ thể (cần chỉ định tên miền có dấu chấm ở phía trước, ví dụ.site.com)
Có một số hàm để làm việc với các phiên làm việc:
.get()
this.sessionManager.get() - nhận một phiên làm việc mới, cần gọi trước khi thực hiện yêu cầu
.reset()
this.sessionManager.reset() - xóa cookies và nhận một phiên làm việc mới. Cần gọi nếu yêu cầu với phiên làm việc hiện tại không thành công.
.save()
this.sessionManager.save() - lưu một phiên làm việc thành công hoặc lưu dữ liệu tùy ý vào phiên làm việc
results.<array>.addElement()
Phương thức results.<array>.addElement() cho phép điền vào các mảng trong results một cách thuận tiện hơn. Khi sử dụng nó, bạn không cần nhớ thứ tự các biến trong mảng và liệt kê chúng một cách thủ công.
results.serp.addElement({
link: 'https://google.com',
anchor: 'Google',
snippet: 'Loreps ipsum...',
});
Các phương thức init() và destroy()
Phương thức init() được gọi khi bắt đầu tác vụ, destroy() - khi kết thúc.
Ví dụ sử dụng:
const puppeteer = require("puppeteer");
let globalBrowser;
class Parser {
constructor() {
...
}
async init() {
globalBrowser = await puppeteer.launch();
};
async destroy() {
if(globalBrowser)
await globalBrowser.close();
}
}
Liên kết hữu ích
🔗 Ví dụ lưu tệp vào đĩa
Ví dụ minh họa cách lưu tệp trực tiếp vào đĩa
🔗 Ví dụ làm việc với phiên làm việc (session)
Sử dụng chức năng phiên làm việc trong các công cụ cào dữ liệu JavaScript
🔗 Ví dụ lưu dữ liệu trong phiên làm việc
Minh họa khả năng lưu trữ dữ liệu tùy ý trong phiên làm việc
🔗 Sử dụng results.addElement()
Ví dụ điền mảng dữ liệu bằng results.addElement() và minh họa sự khác biệt so với .push() thông thường