Puppeteer cors 错误
Posted
技术标签:
【中文标题】Puppeteer cors 错误【英文标题】:Puppeteer cors mistake 【发布时间】:2019-02-07 07:46:58 【问题描述】:您好,我在使用 puppeteer 的代码中遇到问题,cors 错误是随机发生的,但在我的 80% 的测试中。这是我的代码,感谢您的帮助。顺便说一句,服务器响应是
CORS 策略已阻止从源“https://www.nike.com”获取“https://secure-store.nike.com/eu/services/jcartService/?action=addItem&rt=json&country=GB®ion=eu&lang_locale=en_GB&catalogId=1&productId=12238990&qty=1&skuId=21502246”的访问权限:请求的资源上不存在“Access-Control-Allow-Origin”标头。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。
const puppeteer = require('puppeteer');
const jsonfile = require('jsonfile')
function evaluate_click(element,page)
page.evaluate((el) =>
el.click()
,element);
async function bot()
const browser = await puppeteer.launch(headless: false)
const page = await browser.newPage()
setTimeout(function()
browser.close()
,120000)
await page.goto('https://www.nike.com/gb/launch/t/air-max-deluxe-midnight-navy-laser-orange-persian-violet/')
await page.waitForSelector('button.ncss-btn-accent.ncss-brand.pt3-sm.pb3-sm.pt2-lg.pb2-lg.u-uppercase.ta-sm-c.u-full-width')
await page.click('button.ncss-btn-accent.ncss-brand.pt3-sm.pb3-sm.pt2-lg.pb2-lg.u-uppercase.ta-sm-c.u-full-width')
await page.waitFor(1000)
await page.waitForSelector('button[aria-haspopup="true"]')
await page.click('button[aria-haspopup="true"]')
await page.waitForXPath("//ul[contains(@class,'')]//li[11]//button[1]")
var select_size = await page.$x("//ul[contains(@class,'')]//li[11]//button[1]")
await evaluate_click(select_size[0],page)
await page.waitFor(1000)
await page.waitForSelector('button.ncss-brand.ncss-btn-black.pb3-sm.prl5-sm.pt3-sm.u-uppercase.u-full-width')
await page.click('button.ncss-brand.ncss-btn-black.pb3-sm.prl5-sm.pt3-sm.u-uppercase.u-full-width')
await page.waitForSelector('a[data-qa="checkout-link"]')
await page.click('a[data-qa="checkout-link"]')
机器人()
【问题讨论】:
【参考方案1】:您可以将--disable-web-security
标志传递给puppeteer.launch()
以禁用网络安全:
const browser = await puppeteer.launch(
args: [
'--disable-web-security',
],
headless: false,
);
【讨论】:
现在需要更多的标志,在这个线程中查看我的答案 你好格兰特米勒,我们可以用无头来做吗:真的吗?在我的本地机器上它工作正常,但是当我将我的代码部署到实时服务器时,它不能使用错误标志,我使用这个端点来获取 instagram 用户instagram.com/web/search/topsearch/… 当我尝试使用屏幕截图时,我在屏幕截图中看到错误页面,但在本地主机中它的工作很好。谢谢。【参考方案2】:现在需要这些标志:
"--disable-features=IsolateOrigins", "--disable-site-isolation-trials"
await puppeteer.launch(
headless: headless,
devtools: true,
args: [
'--disable-web-security',
'--disable-features=IsolateOrigins',
'--disable-site-isolation-trials'
]
);
还要确保您拥有最新版本的 puppeteer,因为它会在 puppeteer@1.8.0
中出现这些标志而崩溃。
您可以检查是否在以下位置禁用了隔离: chrome://process-internals
建议在 https://***.com/a/51320323/337587
有关标志的更多信息: https://www.chromium.org/Home/chromium-security/site-isolation
【讨论】:
感谢您更新的标志列表。在(撰写本文时)最新版本的 Chrome 中,仅使用 --disable-web-security 对我不起作用,我还必须使用您在此处建议的标志。谢谢。【参考方案3】:当 Chrome 94 开始强制执行 "Private Network Access" (CORS-RFC1918) 时,我们遇到了“公共”网络同时访问“私有”和“本地”网络的问题,导致 CORS 错误。
对我们有用的是添加--disable-features=BlockInsecurePrivateNetworkRequests
。
【讨论】:
当你不能使用那种开关时,有没有解决办法?就像服务器返回某种标头一样?以上是关于Puppeteer cors 错误的主要内容,如果未能解决你的问题,请参考以下文章
puppeteer 无法安装:错误:无法设置 Chromium r782078!设置“PUPPETEER_SKIP_DOWNLOAD”环境变量以跳过下载
Puppeteer - 协议错误(Page.navigate):目标已关闭