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



我正在尝试从允许在其robots.txt文件中抓取数据的网页中抓取一些数据。 为了获得我想要的数据,我研究了网页在加载时发送的 API 请求,并确定了感兴趣的 API 请求。

如果我复制Brave -> Network选项卡中所示的请求 URL 并将其粘贴到新选项卡中,我会得到与网页加载时获得的 JSON 数据相同的 JSON 数据。但是,如果我将该请求复制为cURL命令,使用相同的标头、cookie 等,并在我的终端中执行它,我会得到一个 Cloudflarehtml页面,其中提到了captcha-bypass并有"正在检查您的浏览器......"消息。

我尝试将 cookie 从浏览器导出到文件,然后将它们与cURL一起使用,但它不起作用。我还尝试比较在不同时间发送的HTTP请求,以防时间戳之类的内容被添加到请求中,但它们是相同的。还有一件事:从浏览器发送 API 请求时,我没有解决任何验证码挑战,我只是取回 JSON。

我想知道服务器确定我不是仅通过HTTP请求使用浏览器的机制。

更新:我尝试使用 Tor 发送请求,在这种情况下,我返回了与请求cURL相同的页面。一段时间后,验证码会自行验证,JSON数据会像在常规浏览器中一样加载。

正如一些评论所暗示的那样,cURL没有显示相同输出的原因是服务器将首先提供一个 html 页面,其中一些 JavaScript 代码会自动执行。执行代码后,将请求并显示实际数据。

我不确定为什么在开发工具的Network选项卡中看不到它,也没有在获取响应时在浏览器中的任何地方指示它。

我通过尝试通过 Tor 发送 api 请求来解决这个问题。这是唯一在发送重定向请求之前显示正在发生某些事情的浏览器。

最后,我按照skyez的建议,用puppeteer自动化了这个。

最新更新