Chuyển đến nội dung chính

Mô tả các phương thức (v1)

cảnh báo

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ầu
  • queryParams - hash với các tham số get hoặc hash với thân của yêu cầu post
  • opts - 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ọi
  • overrideParams - hash với các ghi đè cài đặt của công cụ cào dữ liệu được gọi
  • query - 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.*).

ghi chú

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ạng
  • preset - chỉ định mẫu thiết lập sẵn cho Util::AntiGateUtil::AntiGate
  • type chỉ đị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 ảnh
  • id - id của captcha, để có thể báo lỗi sau này qua reportBad
  • error - 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$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ể (&amp; 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ạo
  • canChangeProxy - tham số tùy chọn, khả năng thay đổi Proxy, mặc định là 1
  • domain - 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()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