使用 Crawlera 代理的 Puppeteer
Puppeteer with Crawlera Proxy
我无法通过具有身份验证的代理发出人偶请求。
已尝试两个代理 url 身份验证:--proxy-server=u:p@proxy.crawlera.com:8010
还有木偶师page.authenticate(u,p)
还在ERR_NO_SUPPORTED_PROXIES
我的代码:
require('dotenv').config();
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
ignoreHTTPSErrors: true,
args: ['--proxy-server=proxy.crawlera.com:8010']
});
const page = await browser.newPage();
await page.setExtraHTTPHeaders({
'Proxy-Authorization':
'Basic ' +
Buffer.from(`${process.env.CRAWLERA_APIKEY}:`).toString('base64')
});
page.on('console', (...args) => console.log('PAGE LOG:', ...args));
const path = `https://www.andersonassociates.net/`;
await page.setViewport({ width: 1680, height: 895 });
try {
console.log('before-goto', path);
var start = +new Date();
var resp = await page.goto(path, {
timeout: 0,
waitUntil: 'domcontentloaded'
});
console.log('after-goto', path);
var end = +new Date();
console.log('start-end-diff', (end - start) / 1000);
if (!resp.ok) {
browser.close();
return { status: resp.status, error: `ASIN NOT OK. ${resp.status}` };
}
console.log('goto', path);
} catch (error) {
console.log('page.goto ERROR', error.stack.split('\n'));
browser.close();
return { error: error.toString(), stack: error.stack.split('\n') };
}
try {
await page.screenshot({ path: `tmp/anderson.png`, fullPage: true });
console.log('screenshot');
browser.close();
} catch (e) {
browser.close();
console.log('screenshot error', e.stack.split('\n'));
}
})();
更新!
你能提供你正在做的代码示例吗?
请记住,page.authenticate 需要将对象传递给函数。并且必须在执行任何其他操作之前设置凭据。
您可以尝试这样的操作:
await page.authenticate({username, password});
await page.goto(myURL, {waitUntil: 'networkidle0'});
你可以使用 proxy-chain npm 包。
示例:
const puppeteer = require('puppeteer');
const proxyChain = require('proxy-chain');
(async() => {
const oldProxyUrl = 'http://u:p@proxy.crawlera.com:8010';
const newProxyUrl = await proxyChain.anonymizeProxy(oldProxyUrl);
// Prints something like "http://127.0.0.1:45678"
console.log(newProxyUrl);
const browser = await puppeteer.launch({
args: [`--proxy-server=${newProxyUrl}`],
});
})();
您可以在 blogpost 中阅读更多相关信息。
我也使用 Crawlera 作为我的代理服务,已经使用了 proxy-chain & page.authenticate
方法,但没有运气,我认为这是 Crawlera 提供的空密码造成的,我使用 [=12 解决了=]:
const browser = await puppeteer.launch({
ignoreHTTPSErrors: true, // To allow https url
args: ['--proxy-server=proxy.crawlera.com:8010']
});
const page = await browser.newPage();
await page.setExtraHTTPHeaders({
'Proxy-Authorization': 'Basic ' + Buffer.from('<APIKEY>:').toString('base64'),
});
希望对您有所帮助。
Here 我了解了如何将 Crawlera 设置为 Puppeteer 的代理提供商。
博客 post 指出:
⚠️ Note: Puppeteer 1.17 and bundled Chromium 76.0.3803.0 are recommended. The latest Chromium snapshot that can be used with Puppeteer 1.18+ is r669921 (in later versions Proxy-Authorization header, required for sending Crawlera credentials, is blocked).
因此,为了使用 Docker 部署解决方案,这意味着 to setup for pupeteer 我需要下载特定版本的 Chromium,Puppeteer 不保证它会工作。
解决方案是使用 proxy-chain 和 anonymizeProxy
方法并在启动浏览器时设置 ignoreHTTPSErrors: true
我无法通过具有身份验证的代理发出人偶请求。
已尝试两个代理 url 身份验证:--proxy-server=u:p@proxy.crawlera.com:8010
还有木偶师page.authenticate(u,p)
还在ERR_NO_SUPPORTED_PROXIES
我的代码:
require('dotenv').config();
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
ignoreHTTPSErrors: true,
args: ['--proxy-server=proxy.crawlera.com:8010']
});
const page = await browser.newPage();
await page.setExtraHTTPHeaders({
'Proxy-Authorization':
'Basic ' +
Buffer.from(`${process.env.CRAWLERA_APIKEY}:`).toString('base64')
});
page.on('console', (...args) => console.log('PAGE LOG:', ...args));
const path = `https://www.andersonassociates.net/`;
await page.setViewport({ width: 1680, height: 895 });
try {
console.log('before-goto', path);
var start = +new Date();
var resp = await page.goto(path, {
timeout: 0,
waitUntil: 'domcontentloaded'
});
console.log('after-goto', path);
var end = +new Date();
console.log('start-end-diff', (end - start) / 1000);
if (!resp.ok) {
browser.close();
return { status: resp.status, error: `ASIN NOT OK. ${resp.status}` };
}
console.log('goto', path);
} catch (error) {
console.log('page.goto ERROR', error.stack.split('\n'));
browser.close();
return { error: error.toString(), stack: error.stack.split('\n') };
}
try {
await page.screenshot({ path: `tmp/anderson.png`, fullPage: true });
console.log('screenshot');
browser.close();
} catch (e) {
browser.close();
console.log('screenshot error', e.stack.split('\n'));
}
})();
更新!
你能提供你正在做的代码示例吗?
请记住,page.authenticate 需要将对象传递给函数。并且必须在执行任何其他操作之前设置凭据。
您可以尝试这样的操作:
await page.authenticate({username, password});
await page.goto(myURL, {waitUntil: 'networkidle0'});
你可以使用 proxy-chain npm 包。
示例:
const puppeteer = require('puppeteer');
const proxyChain = require('proxy-chain');
(async() => {
const oldProxyUrl = 'http://u:p@proxy.crawlera.com:8010';
const newProxyUrl = await proxyChain.anonymizeProxy(oldProxyUrl);
// Prints something like "http://127.0.0.1:45678"
console.log(newProxyUrl);
const browser = await puppeteer.launch({
args: [`--proxy-server=${newProxyUrl}`],
});
})();
您可以在 blogpost 中阅读更多相关信息。
我也使用 Crawlera 作为我的代理服务,已经使用了 proxy-chain & page.authenticate
方法,但没有运气,我认为这是 Crawlera 提供的空密码造成的,我使用 [=12 解决了=]:
const browser = await puppeteer.launch({
ignoreHTTPSErrors: true, // To allow https url
args: ['--proxy-server=proxy.crawlera.com:8010']
});
const page = await browser.newPage();
await page.setExtraHTTPHeaders({
'Proxy-Authorization': 'Basic ' + Buffer.from('<APIKEY>:').toString('base64'),
});
希望对您有所帮助。
Here 我了解了如何将 Crawlera 设置为 Puppeteer 的代理提供商。
博客 post 指出:
⚠️ Note: Puppeteer 1.17 and bundled Chromium 76.0.3803.0 are recommended. The latest Chromium snapshot that can be used with Puppeteer 1.18+ is r669921 (in later versions Proxy-Authorization header, required for sending Crawlera credentials, is blocked).
因此,为了使用 Docker 部署解决方案,这意味着 to setup for pupeteer 我需要下载特定版本的 Chromium,Puppeteer 不保证它会工作。
解决方案是使用 proxy-chain 和 anonymizeProxy
方法并在启动浏览器时设置 ignoreHTTPSErrors: true