【发布时间】:2021-09-25 21:45:31
【问题描述】:
我有一个使用 HTMLParser 模块的 Python 网络爬虫。它报废的网站是http://consulta.siiau.udg.mx/wco/sspseca.consulta_oferta?ciclop=202120&cup=D&mostrarp=100000&ordenp=2
现在我需要做同样的事情,但 基于 Web 浏览器 使用 javascript,所以我尝试使用 axios 获取原始 HTML,但我不断收到 '对 XMLHttpRequest 的访问已被 CORS 策略阻止'.
我试过的是
axios.post('http://consulta.siiau.udg.mx/wco/sspseca.consulta_oferta', {
ciclop: '202120',
cup: 'D',
mostrarp: 10000,
ordennp: 2,
})
.then((response) => {
console.log(response)
})
和
axios.get('http://consulta.siiau.udg.mx/wco/sspseca.consulta_oferta?ciclop=202120&cup=D&mostrarp=100000&ordenp=2',
{ crossdomain: true }
)
.then((response) => {
console.log(response)
})
我知道在 javascript 中他们通常使用像 Puppeteer 内部的无头浏览器,但由于这个项目是一个网站 我不能使用 Node.js 模块。
目前我实现的解决方案是让服务器运行 Flask API 来处理 html 获取,然后将其发送回客户端进行处理,但如果客户端可以这样做,这将减轻我的服务器性能在他身边。
【问题讨论】:
-
如果你被 cors 拒绝,那么你的 api 中是否需要允许外部 cors
-
CORS 由浏览器强制执行。 Python 不是浏览器。
-
@Eloi 不,我的 API 只是从 Consulta.siiau.udg.mx 获取 html 数据的一种解决方法。客户端和我的 API 以及我的 API 和 Consulta.siiau.udg.mx 之间都没有 CORS 问题。
-
@tevemadar 我明白了,但是如果 Puppeteer 使用无头浏览器,为什么它不会被 CORS 阻止?我刚刚在try-puppeteer.appspot.com进行了测试
-
因为 Puppeteer 不在浏览器中运行(就像这里的 JavaScript 代码),所以它控制着一个浏览器。浏览器正在浏览给定的页面。但是现在你有了基于浏览器的 JavaScript,所以浏览器正在浏览你的页面,并试图从另一个站点获取数据——这就是 CORS 的“领域”。一个简单的解决方法是与您的页面(Python、PHP、节点等)共同托管一些服务器端代码,这些代码代理您的页面所需的任何外部数据。但这是以在服务器上运行活动代码为代价的。
标签: javascript python web-scraping