Tetapan Proxy Puppeteer, Menyambungkan dengan --proxy-server dan page.authenticate
Panduan ini menerangkan cara menyambung HTTP proxy Socks5Proxy ke --proxy-server dan pengesahan page.authenticate dalam Puppeteer, sambungan SOCKS5, dan kod untuk melancarkan pelayar dengan pelbagai IP.
Bagaimana proxy berfungsi dalam Puppeteer?
Puppeteer menentukan proxy melalui argumen yang dihantar semasa melancarkan Chrome. Dengan memasukkan alamat dalam --proxy-server, semua halaman dalam pelayar tersebut akan menggunakan proxy yang sama. Nama pengguna dan kata laluan untuk HTTP proxy tidak boleh dimasukkan sebagai argumen, jadi anda perlu menghantarnya melalui page.authenticate selepas membuka halaman. Puppeteer akan menjawab secara automatik apabila proxy meminta pengesahan.
Contoh menggunakan IP 198.51.100.23, port HTTP 8000, port SOCKS5 1080, username spx_user, dan password spx_pass.
npm install puppeteerBagaimana cara menghubungkan HTTP proxy dan autentikasi?
Tambahkan --proxy-server=198.51.100.23:8000 dalam args launch, dan selepas membuat halaman dengan newPage, hantar nama pengguna dan kata laluan ke page.authenticate. Pengesahan diperlukan untuk setiap halaman, jadi ulangi panggilan yang sama setiap kali membuat halaman baru.
Situs HTTPS juga terbuka. Browser membuat tunnel CONNECT dan berkomunikasi secara terenkripsi di dalamnya.
import puppeteer from "puppeteer";
const browser = await puppeteer.launch({
headless: true,
args: ["--proxy-server=http://198.51.100.23:8000"],
});
const page = await browser.newPage();
await page.authenticate({ username: "spx_user", password: "spx_pass" });
await page.goto("https://api.ipify.org", { waitUntil: "domcontentloaded" });
console.log(await page.evaluate(() => document.body.innerText)); // proxy IP
await browser.close();Bagaimana untuk menggunakan proksi SOCKS5?
Masukkan alamat socks5:// ke dalam --proxy-server. Namun, Chrome tidak menyokong pengesahan ID dan kata laluan untuk SOCKS proksi, jadi page.authenticate tidak terpakai untuk SOCKS5. Untuk menyambung melalui SOCKS5, gunakan pengesahan IP dengan mendaftarkan IPv4 pelayan di mana kod ini dijalankan pada papan pemuka.
Jika persekitaran anda memerlukan sambungan dengan nama pengguna dan kata laluan, cara paling mudah adalah menggunakan port HTTP IP yang sama. Lokasi yang dilihat oleh laman web sasaran adalah sama kerana IP yang sama.
import puppeteer from "puppeteer";
const browser = await puppeteer.launch({
args: ["--proxy-server=socks5://198.51.100.23:1080"], // server IP is authorized in the dashboard
});
const page = await browser.newPage();
await page.goto("https://api.ipify.org");
console.log(await page.evaluate(() => document.body.innerText));
await browser.close();Bagaimana untuk membuka pelayar dengan pelbagai IP?
Chrome hanya menggunakan satu proxy per browser yang dijalankan, jadi jika Anda memerlukan IP yang berbeda, Anda harus menjalankan browser secara terpisah. Kode di bawah ini menerima daftar ip:port:user:pass dari API dan membuka browser satu per satu dengan 3 yang pertama, lalu mencetak IP yang terlihat di setiap halaman.
Membuka banyak pelayar akan menggunakan banyak memori. Adalah disyorkan untuk menetapkan bilangan pelayar yang boleh dijalankan secara serentak dengan menggunakan barisan tugas.
import puppeteer from "puppeteer";
const KEY = "YOUR_API_KEY";
const res = await fetch("https://socks5proxy.io/api/v1/proxies/download?format=ip:port:user:pass&protocol=http", {
headers: { Authorization: "Bearer " + KEY },
});
const lines = (await res.text()).trim().split("\n").slice(0, 3);
await Promise.all(lines.map(async (line) => {
const [ip, port, user, pass] = line.trim().split(":");
const browser = await puppeteer.launch({ args: ["--proxy-server=http://" + ip + ":" + port] });
try {
const page = await browser.newPage();
await page.authenticate({ username: user, password: pass });
await page.goto("https://api.ipify.org", { timeout: 30000 });
console.log(ip, await page.evaluate(() => document.body.innerText));
} finally {
await browser.close();
}
}));Bagaimana untuk membuka halaman dengan lebih pantas?
Melalui proksi, gambar, fon dan video semuanya diterima melalui proksi, menggunakan lebih banyak bandwidth dan masa. Jika anda hanya memerlukan teks dan data, menyekat permintaan gambar dan fon dengan page.setRequestInterception boleh mempercepatkan kelajuan dan menjimatkan bandwidth bulanan pelan kongsi.
Nilai waitUntil juga penting. networkidle0 menunggu sehingga semua permintaan selesai dan mungkin lambat, jadi lebih baik menggunakan page.waitForSelector untuk terus ke langkah seterusnya sebaik elemen yang diperlukan kelihatan.
await page.setRequestInterception(true);
page.on("request", (req) => {
const type = req.resourceType();
if (type === "image" || type === "font" || type === "media") req.abort();
else req.continue();
});Bolehkah saya menggunakan IP yang berbeza untuk setiap halaman dalam satu pelayar?
--proxy-server Chrome diterapkan ke seluruh browser, sehingga sulit untuk memberikan IP yang berbeda per halaman. Puppeteer 22 ke atas memungkinkan Anda menggunakan proxy yang berbeda per konteks dengan menambahkan opsi proxyServer ke browser.createBrowserContext. Konteks memiliki cookie dan penyimpanan yang terpisah, sehingga cocok untuk pekerjaan per akun.
Halaman yang dibuat dalam konteks juga bisa menggunakan page.authenticate untuk mengirimkan username dan password. Ini menggunakan lebih sedikit memori dibandingkan membuka beberapa browser.
import puppeteer from "puppeteer";
const browser = await puppeteer.launch();
const context = await browser.createBrowserContext({ proxyServer: "http://198.51.100.23:8000" });
const page = await context.newPage();
await page.authenticate({ username: "spx_user", password: "spx_pass" });
await page.goto("https://api.ipify.org");
console.log(await page.evaluate(() => document.body.innerText));
await context.close();
await browser.close();Apa yang perlu diselaraskan untuk kelihatan seperti pengguna dari negara tersebut?
Gunakan page.setExtraHTTPHeaders untuk Accept-Language dan page.emulateTimezone untuk zon waktu mengikut negara IP. Jika bahasa dan zon waktu berbeza dengan negara IP, halaman mungkin muncul dalam bahasa yang salah atau paparan tarikh berbeza.
Atur ukuran layar dengan page.setViewport, dan jika Anda membutuhkan layar ponsel, gunakan pengaturan perangkat dari KnownDevices di puppeteer dan teruskan ke page.emulate.
await page.setExtraHTTPHeaders({ "Accept-Language": "ja-JP,ja;q=0.9" });
await page.emulateTimezone("Asia/Tokyo");
await page.setViewport({ width: 1366, height: 900 });Bagaimana mengekalkan pelayar dengan stabil untuk tugas yang berjalan lama?
Untuk tugas berjalan sepanjang hari, lebih stabil menutup dan membuka semula penyemak imbas selepas memproses sejumlah halaman berbanding terus menggunakannya. Penyemak imbas lama menggunakan lebih banyak memori dan satu ralat boleh menghentikan semua tugas.
Pastikan memanggil page.close dengan try dan finally pada setiap halaman, dan tambahkan timeout pada goto untuk mengelakkan terhenti pada halaman yang tidak responsif. Jika tugas gagal, cuba lagi dengan membuka penyemak imbas baru dengan proxy lain.
Merekod masa sambungan dan ralat mengikut proksi membantu anda mengenal pasti proksi yang perlahan dan menghubungi pusat khidmat pelanggan dashboard atau menukar kelompok tugas.
Bagaimana cara menyelesaikan kesalahan yang sering terjadi?
net::ERR_INVALID_AUTH_CREDENTIALS atau 407 bermaksud nilai page.authenticate salah atau tidak dipanggil selepas newPage. Pastikan anda memanggilnya sebelum goto untuk setiap halaman.
net::ERR_PROXY_CONNECTION_FAILED bermaksud alamat atau port salah. Pastikan anda menggunakan port HTTP untuk alamat HTTP dan port SOCKS5 untuk alamat SOCKS5. Jika sambungan SOCKS5 ditolak, semak sama ada IP keluar server didaftarkan dalam pengesahan IP.