https://psycnet.apa.org/record/2016-47119-002
当我通过chrome(在私有窗口中)访问上述URL时,可以看到对应于以下curl
命令的第一个请求。但是,当我在命令行中调用此curl
命令时,Distil网络会显示<div id="distilIdentificationBlock"> </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请求之间的区别也很重要。
答案 0 :(得分:1)
没有区别。
要了解Distill(其网页抓取保护系统)的工作方式,您需要查看初始响应HTML:
当我在Chrome中提出请求并在开发工具中查看初始响应(确保选中“保留日志”)时,我看到响应实际上是一个简短的网页,其中包含嵌入式{{1} },它执行一些简单的“此用户代理是网络浏览器吗?”检查,例如运行脚本来查找在Web浏览器之外不存在的JavaScript DOM对象(假设HTTP用户代理完全能够运行脚本-<script>
和cURL
不是顺便说一下)。
如果脚本认为您的用户代理是网络浏览器,则它会使用动态生成的密码再次请求真实内容(我没有查看那的详细信息有效)-这就是为什么您无法使用wget
或cURL
重新请求真实内容的原因,因为每个请求的密码都是唯一的。
这是初始页面响应中的wget
元素的屏幕截图,请注意页面的HTML中缺少实际的实际内容。
如果您在浏览器中禁用了JavaScript,则将根本无法访问该网页。
这种防抓取系统可以保护网页免遭来自缺乏评估JavaScript手段的用户代理的请求-因此它将阻止<script>
,curl
,wget
,和浏览器内的HttpClient
/ fetch
(至少在没有进一步工作的情况下)。
您可能会认为该系统会使搜索引擎蜘蛛无法将网站编入索引-但这是一种古老的(并且根深蒂固的)信念和做法:因为直到2000年代后期,主要的搜索引擎蜘蛛(Google,Bing / Windows Live Search,Yahoo等)仅对原始HTML编制索引,并且未运行JavaScript;但是从那时起,搜索引擎蜘蛛便开始运行JavaScript,甚至开始不使用定制的蜘蛛HTML解析器引擎而是使用实际的网络索引来索引网站浏览器引擎(Google真正启动了它,以便它们可以索引大量脚本的网站,尤其是使用Angular,Vue等的单页应用程序)。在Microsoft工作时,我必须将Bing搜寻器系统用于某些产品研究项目,并且使用Internet Explorer的特殊版本来“运行”它访问的网页。