浏览器请求和curl请求有什么区别?

时间:2020-05-28 21:32:21

标签: javascript google-chrome http curl firefox

https://psycnet.apa.org/record/2016-47119-002

当我通过chrome(在私有窗口中)访问上述URL时,可以看到对应于以下curl命令的第一个请求。但是,当我在命令行中调用此curl命令时,Distil网络会显示<div id="distilIdentificationBlock">&nbsp;</div> 来检测到它。

这对我来说很奇怪,因为这是第一个请求。除非curl和chrome发送的请求之间没有区别,否则Distil网络无法分辨出机器人或真实浏览器发送的请求。有人知道curl请求和chrome请求之间有什么区别吗?

curl 'https://psycnet.apa.org/record/2016-47119-002' \
  -H 'Connection: keep-alive' \
  -H 'Pragma: no-cache' \
  -H 'Cache-Control: no-cache' \
  -H 'Upgrade-Insecure-Requests: 1' \
  -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36' \
  -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9' \
  -H 'Sec-Fetch-Site: none' \
  -H 'Sec-Fetch-Mode: navigate' \
  -H 'Sec-Fetch-User: ?1' \
  -H 'Sec-Fetch-Dest: document' \
  -H 'Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7' \
  --compressed

P.S。如果我使用firefox提取相应的curl命令,则问题相同。因此,Firefox请求和curl请求之间的区别也很重要。

1 个答案:

答案 0 :(得分:1)

没有区别。

要了解Distill(其网页抓取保护系统)的工作方式,您需要查看初始响应HTML:

当我在Chrome中提出请求并在开发工具中查看初始响应(确保选中“保留日志”)时,我看到响应实际上是一个简短的网页,其中包含嵌入式{{1} },它执行一些简单的“此用户代理是网络浏览器吗?”检查,例如运行脚本来查找在Web浏览器之外不存在的JavaScript DOM对象(假设HTTP用户代理完全能够运行脚本-<script>cURL不是顺便说一下)。

如果脚本认为您的用户代理是网络浏览器,则它会使用动态生成的密码再次请求真实内容(我没有查看的详细信息有效)-这就是为什么您无法使用wgetcURL重新请求真实内容的原因,因为每个请求的密码都是唯一的。

这是初始页面响应中的wget元素的屏幕截图,请注意页面的HTML中缺少实际的实际内容。

enter image description here

如果您在浏览器中禁用了JavaScript,则将根本无法访问该网页。

这种防抓取系统可以保护网页免遭来自缺乏评估JavaScript手段的用户代理的请求-因此它将阻止<script>curlwget,和浏览器内的HttpClient / fetch(至少在没有进一步工作的情况下)。

您可能会认为该系统会使搜索引擎蜘蛛无法将网站编入索引-但这是一种古老的(并且根深蒂固的)信念和做法:因为直到2000年代后期,主要的搜索引擎蜘蛛(Google,Bing / Windows Live Search,Yahoo等)仅对原始HTML编制索引,并且未运行JavaScript;但是从那时起,搜索引擎蜘蛛便开始运行JavaScript,甚至开始不使用定制的蜘蛛HTML解析器引擎而是使用实际的网络索引来索引网站浏览器引擎(Google真正启动了它,以便它们可以索引大量脚本的网站,尤其是使用Angular,Vue等的单页应用程序)。在Microsoft工作时,我必须将Bing搜寻器系统用于某些产品研究项目,并且使用Internet Explorer的特殊版本来“运行”它访问的网页。