相同的https请求在浏览器和cURL/Node.js中得到不同的响应

8e2ybdfx  于 2022-11-13  发布在  Node.js
关注(0)|答案(1)|浏览(246)

我尝试从一个允许在robots.txt文件中进行数据抓取的网页中抓取一些数据。为了获得我想要的数据,我查看了网页在加载时发送的API请求,并确定了感兴趣的API请求。
如果我复制Brave -> Network标签中的请求URL并将其粘贴到新标签中,我会得到与网页加载时相同的JSON数据。但是,如果我将该请求复制为cURL命令,并使用相同的头文件、cookie等,然后在我的终端中执行它,我看到一个Cloudflare html页面,其中提到了captcha-bypass,并显示了“正在检查浏览器...”消息。
我试过将cookie从浏览器导出到一个文件中,然后在cURL中使用它们,但是没有用。我也试过比较在不同时间发送的HTTP请求,以防像时间戳这样的东西被添加到请求中,但是它们是一样的。还有一件事:当从浏览器发送API请求时,我不会遇到任何要解决的验证码问题,我只会得到JSON。
我想知道服务器是通过什么机制确定我没有使用浏览器的。

UPDATE:我试着用Tor发送请求,在这种情况下,我得到了与cURL请求相同的页面。过了一段时间,验证码会自己验证,JSON数据会像在普通浏览器中一样加载。

axr492tv

axr492tv1#

正如一些评论所指出的,cURL没有显示相同输出的原因是服务器首先提供一个html页面,其中一些javascript代码会自动执行,代码执行后,实际的数据会被请求并显示。
我不知道为什么在dev工具的Network标签中看不到这一点,也不知道为什么在获取响应时在浏览器的任何地方都看不到这一点。
我试着通过Tor发送api请求,这是唯一一个在发送重定向请求之前显示出有什么事情发生的浏览器。
最后,我按照skyez的建议,使用puppeteer自动完成了这个过程。

相关问题