Axios请求被CORS拦截但Python HTMLParser爬虫不受影响如何解决?
问题说明
此前使用Python的HTMLParser模块开发的网络爬虫可正常爬取目标站点http://consulta.siiau.udg.mx/wco/sspseca.consulta_oferta?ciclop=202120&cup=D&mostrarp=100000&ordenp=2 的数据,现在需要迁移到浏览器端用JavaScript实现同等功能,使用Axios请求原始HTML时持续触发Access to XMLHttpRequest has been blocked by CORS policy错误。
已尝试的请求写法
POST请求
axios.post('http://consulta.siiau.udg.mx/wco/sspseca.consulta_oferta', { ciclop: '202120', cup: 'D', mostrarp: 10000, ordennp: 2, }) .then((response) => { console.log(response) })
带crossdomain参数的GET请求
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) })
当前项目为纯前端网页项目,无法使用Node.js生态的Puppeteer等无头浏览器方案,现有实现是通过Flask服务端代理请求后返回HTML给前端处理,希望找到纯前端侧方案降低服务端性能压力。
解决方案
CORS是浏览器原生强制执行的同源安全策略,只要目标站点未配置允许你所在域名的跨域请求规则,纯前端没有任何办法绕过限制直接发起常规HTTP请求获取数据,所有可行的实现方案本质都依赖第三方中转,可选择的适配方案如下:
- 公共CORS代理:你可以使用公开的CORS代理服务,在你的请求URL前拼接代理服务前缀即可完成请求,注意公共代理的稳定性、速率限制都没有保障,仅适合开发测试阶段使用,不推荐生产环境部署。
- JSONP请求:如果目标站点支持JSONP返回格式,你可以改用JSONP方式发起GET请求,Axios本身不支持JSONP,可引入第三方JSONP依赖包或者手写原生JSONP实现。该方案仅支持GET请求,且由于你需要获取的是原始HTML内容,适配性极低。
- 优化现有服务端代理:这是生产环境最稳妥的方案,你可以给现有Flask代理服务加一层请求缓存,相同参数的请求直接返回缓存结果,无需每次都请求源站,可大幅降低服务端性能开销,同时可控性、稳定性都远高于其他前端方案。
- 浏览器插件绕过:如果是面向个人使用的工具类页面,可引导用户安装支持关闭CORS校验的浏览器插件,插件会修改浏览器的CORS校验规则,直接允许跨域请求。该方案仅适合小众场景,无法面向普通公网用户使用。
内容的提问来源于stack exchange,提问作者YoomarXD
相关产品推荐
相关产品推荐

