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&region=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 无法打开 chrome(出现错误)

puppeteer 无法安装:错误:无法设置 Chromium r782078!设置“PUPPETEER_SKIP_DOWNLOAD”环境变量以跳过下载

Puppeteer - 协议错误(Page.navigate):目标已关闭

Puppeteer 错误:未下载 Chromium 修订版

如何解决错误:Puppeteer 中的 net::ERR_CONNECTION

puppeteer:console.log 在评估中触发错误“未处理的承诺拒绝”