专栏名称: 看雪学苑
致力于移动与安全研究的开发者社区,看雪学院(kanxue.com)官方微信公众帐号。
目录
相关文章推荐
花果科技  ·  电脑微信史诗级更新,可以发朋友圈了! ·  昨天  
macrozheng  ·  入职的新公司是微服务项目,慌了! ·  2 天前  
macrozheng  ·  入职的新公司是微服务项目,慌了! ·  2 天前  
姜茶茶  ·  一个优秀的大厂市场人朋友,被优化了。 ·  3 天前  
姜茶茶  ·  一个优秀的大厂市场人朋友,被优化了。 ·  3 天前  
超前挖掘  ·  出海概念,强催化! ·  4 天前  
超前挖掘  ·  出海概念,强催化! ·  4 天前  
助研空间  ·  【PNAS】哥伦比亚大学Dennis ... ·  5 天前  
助研空间  ·  【PNAS】哥伦比亚大学Dennis ... ·  5 天前  
51好读  ›  专栏  ›  看雪学苑

Headless Chrome入门

看雪学苑  · 公众号  · 互联网安全  · 2017-05-04 18:11

正文

摘要


Headless Chrome 指在 headless 模式下运行谷歌浏览器。本质就是不用谷歌运行谷歌!它将由 Chromium 和 Blink 渲染引擎提供的所有现代网页平台的特征都转化成了命令行。

它有什么用?

Headless 浏览器是一种很好的工具,用于自动化测试和不需要可视化用户界面的服务器。例如,你想在一个网页上运行一些测试,从网页创建一个 PDF,或者只是检查浏览器怎样递交 URL。

警告:在 Mac 和 Linux 上的 Chrome 59 可以运行 Headless 模式。支持 Windows 的会很快提供。


开始 Headless(命令行界面)


开始 headless 模式的最简单方式就是用命令行打开谷歌浏览器。如果你已经安装了Chrome 59 以上版本,用 --headless 命令打开:

注意:--disable-gpu 命令是暂时需要,最后会消失。

chrome 命令必须指向你的谷歌浏览器的安装路径。不同的系统有不同的路径。因为我在 Mac 上安装,我给每个已经安装的谷歌浏览器版本都起了别名(aliase)。


命令行界面


有时候,你也许不需要在Headless Chrome中运行编程脚本。下面是一些有用的执行常见任务的命令行指令。

注意:运行这些命令时你同时需要--disable-gpu命令。

打印 DOM

   --dump-dom命令打印document.body.innerHTML到标准输出:

创建PDF

   --print-to-pdf 命令从网页创建一个PDF:


截图

获得一个页面的截图,使用 --screenshot 命令:


使用--screenshot命令会在当前工作目录中保存截图为screenshot.png。如果你想给整个页面截图,会有点复杂。有一个很好的博客可以解决你的问题,作者是David Schnurr ,题目为《把headless Chrome作为一个自动截图工具》。


不用浏览器用户界面调试谷歌浏览器?


当你用--remote-debugging-port=9222命令打开谷歌浏览器时,DevTools协议会被激活。该协议用于与谷歌浏览器内核进行交互和驱动headless浏览器实例。它也可以像Sublime、VS Code和Node一样用来远程调试一个程序。

因为没有浏览器用户界面用来看网页,你需要在另一个浏览器中连接到http://localhost:9222 来确保一切正常。你会看到一列可检查的网页,可以点击它们并看到使用了哪种Headless渲染。

                  用 DevTools 远程调试用户界面

从这开始,你可以像往常一样用熟悉的 DevTools 来检查、调试和调整网页了。如果你要用Headless编程模式,这个页面也会是一个有力的调试工具,让所有原始DevTools协议命令穿过电线,与浏览器进行交流。


使用编程模式(Node)


打开谷歌浏览器

在之前的部分,我们使用--headless --remote-debugging-port=9222命令手动打开谷歌。然而,为了全自动测试,你可能需要在应用程序中批量打开谷歌浏览器。

一种方式是用child_process:

但是当你需要一个可以跨平台运行的方案时,事情就变得复杂了。请看Chrome的硬编码。

使用Lighthouse的ChromeLauncher模块

Lighthouse是一种用来测试Web应用的神奇工具。人们没有意识到的一件事是它配置了一些很有用的工作在谷歌浏览器上的模块。其中一个就是ChromeLauncher。ChromeLauncher可以找到谷歌浏览器的安装位置,建立一个调试实例,启动浏览器,在程序完成后杀掉实例。最棒的是由于Node它可以跨平台工作!

注意:Lighthouse团队正在为 ChromeLauncher 探索一个有改进的API的独立的包。如果你有任何反馈请告诉我们。

默认情况下,ChromeLauncher 会启动金丝雀(Canary)版Chrome(如果它安装了),但是你可以手动选择默认使用哪个版本。为了使用它,首先要从npm上安装Lighthouse:


例子:用ChromeLauncher启动Headless模式

运行这个脚本不会做很多事,但是你可以在任务管理器中看到,谷歌浏览器启动了一个加载about:blank的实例。记住,不会有任何浏览器用户界面。我们是headless的。

为了控制浏览器,我们需要DevTools协议!


检索网页信息


chrome-remote-interface是一个很好的 Node 包,提供了一些基于 DevTools 协议的高级API。你可以用它来编排 Headless Chrome,导航到网页,并获取这些网页的信息。

警告:DevTools 协议可以做很多有趣的事情,但是刚开始使用会有些艰难。我建议先花一点时间浏览《DevTools Protocol API Viewer》,然后阅读《chrome-remote-interface API》来学习它是如何封装原始协议的。

让我们安装这个包:


示例

  • 例子1——打印用户代理

得到如下形式的结果:HeadlessChrome/60.0.3082.0

  • 例子2 ——检查网站是否有Web应用清单

  •    例子3——用DOM API提取网页</span></p></li></ul><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><img referrerpolicy="no-referrer" data- referrerpolicy="no-referrer" src="http://mmbiz.qpic.cn/mmbiz_png/1UG7KPNHN8E3RSJXpdQx8FjldxJVv9bVGWibCvypM6VQ8MMfrrTolUM2aqppCPfWJNPJibibOFxdLBBkCWLVcMaRA/0?wx_fmt=png" data-type="png" data-ratio="0.9385542168674699" data-w="830" width="830" height="779"/></p><p><br/></p><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><span style="color: rgb(129, 39, 145);"><strong><span style="font-size: 16px;">更多资源</span></strong></span></p><hr/><p style="line-height: 1.75em; margin-bottom: 15px; margin-top: 25px;"><strong><span style="font-size: 16px;"/></strong><span style="font-size: 15px;">这有一些有用的入门资源:</span></p><ul style="list-style-type: circle;" class=" list-paddingleft-2"><li><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><span style="font-size: 15px;">  <strong> 文章</strong></span></p></li></ul><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><span style="font-size: 15px;">     《</span><a style="font-size: 15px; text-decoration: underline;"><span style="font-size: 15px;">DevTools Protocol</span></a><span style="font-size: 15px;">》——如何使用该协议的参考资料</span></p><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><span style="font-size: 15px;">     《DevTools Protocol Viewer》——API参考文档</span></p><ul style="list-style-type: circle;" class=" list-paddingleft-2"><li><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><span style="font-size: 15px;">   <strong>工具</strong></span></p></li></ul><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><span style="font-size: 15px;">      </span><a style="font-size: 15px; text-decoration: underline;"><span style="font-size: 15px;">chrome-remote-interface</span></a><span style="font-size: 15px;">——基于 DevTools协议的node模块</span></p><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><span style="font-size: 15px;">      </span><a style="font-size: 15px; text-decoration: underline;"><span style="font-size: 15px;">Lighthouse</span></a><span style="font-size: 15px;">——测试web应用的质量的自动化工具</span></p><ul style="list-style-type: circle;" class=" list-paddingleft-2"><li><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><span style="font-size: 15px;">   <strong>样例</strong></span></p></li></ul><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><span style="font-size: 15px;">     《</span><a style="font-size: 15px; text-decoration: underline;"><span style="font-size: 15px;">The Headless Web</span></a><span style="font-size: 15px;">》——作者Paul Kinlan发布的使用api.ai.和Headless的博客</span></p><p><br/></p><section label="Copyright Reserved by ipaiban.com." style="text-align: left; margin: 5px 0px 0px; border-width: medium; border-color: currentcolor; -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; padding: 10px; border-style: none;"><section style="display: inline-block; padding: 0.5em; border-radius: 3px; color: white; font-size: 1em; box-shadow: 0.1em 0.1em 0.2em rgb(165, 165, 165); background-color: rgb(0, 0, 0);"><p class="wihudong" style="color: rgb(255, 255, 255); line-height: 22px; font-size: 18px;">常见问题解答<br/></p></section></section><ul style="list-style-type: square;" class=" list-paddingleft-2"><li><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><strong><span style="font-size: 15px;">我需要 --disable-gpu 命令吗?</span></strong></p><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><span style="font-size: 15px;">现在需要。--disable-gpu 是用来处理一些 bug 时暂时需要的命令。在之后的谷歌浏览器版本中就不需要了。从 </span><a style="font-size: 15px; text-decoration: underline;"><span style="font-size: 15px;">https://crbug.com/546953#c152</span></a><span style="font-size: 15px;"> 和</span><a style="font-size: 15px; text-decoration: underline;"><span style="font-size: 15px;">https://crbug.com/695212</span></a><span style="font-size: 15px;"> 中了解更多。</span></p></li><li><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><strong><span style="font-size: 15px;">所以我仍然需要 Xvfb?</span></strong></p><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><span style="font-size: 15px;">不需要。Headless Chrome不需要用窗口,所以不需要像 Xvfb 一样的显示服务器。没有它你就可以进行自动化测试。</span></p></li><li><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><strong><span style="font-size: 15px;">Xvfb 是什么?</span></strong><span style="font-size: 15px;"><br/></span></p><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><span style="font-size: 15px;">Xvfb 是一个在类Unix系统中运行在内存的显示服务器,让你可以没有连接物理显示设备就能运行图形用户界面程序(比如谷歌浏览器)。许多人用Xvfb运行早期版本的谷歌浏览器来做“headless”测试。</span></p></li><li><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><strong><span style="font-size: 15px;">我是怎样创建 Docker 容器来运行 Headless Chrome 的?</span></strong></p><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><span style="font-size: 15px;">使用 </span><a style="font-size: 15px; text-decoration: underline;"><span style="font-size: 15px;">lighthouse-ci</span></a><span style="font-size: 15px;">。它有一个以 Ubuntu 作为基础镜像的 Dockerfile 实例,还可以在一个 App Engine Flexible 容器中安装+运行 Lighthouse。</span></p></li><li><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><strong><span style="font-size: 15px;">我可以把这个和 Selenium / WebDriver / ChromeDriver 一起用么?</span></strong></p><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><span style="font-size: 15px;">现在,Selenium 为谷歌浏览器开放了一个完整实例。换句话说,这是一个全自动方案但不是完全 headless 模式。不管怎样,Selenium 会在将来可以使用--headless。</span></p><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><span style="font-size: 15px;">如果你想试试,我建议参照文章《 </span><a style="font-size: 15px; text-decoration: underline;"><span style="font-size: 15px;">Running Selenium with Headless Chrome</span></a><span style="font-size: 15px;">》来设置你想要的。</span></p><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><span style="font-size: 15px;">注意:你在使用 </span><a style="font-size: 15px; text-decoration: underline;"><span style="font-size: 15px;">ChromeDriver</span></a><span style="font-size: 15px;"> 时或许会遇到 bug。截至本次写作时间,最新版本(2.29)只支持 Chrome 58。Headless Chrome 要求 Chrome 59 及更高版本。</span></p></li><li><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><strong><span style="font-size: 15px;">这个与 PhantomJS 有什么关系?</span></strong></p><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><span style="font-size: 15px;">Headless Chrome 和 PhantomJS 是相似的工具。它们都可以用来在 headless 环境下进行自动化测试。两者的主要不同是 Phantom 用一个更老版本的 WebKit 作为渲染引擎,而 Headless Chrome 使用最新版本的 Blink 作为渲染引擎。</span></p><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><span style="font-size: 15px;">现在,Phantom 也提供了一个比  </span><a style="font-size: 15px; text-decoration: underline;"><span style="font-size: 15px;">DevTools </span></a><span style="font-size: 15px;">协议更高级的 API。</span></p></li><li><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><strong><span style="font-size: 15px;">我在哪儿提交 bug?</span></strong></p><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><span style="font-size: 15px;">Headless Chrome 的 bug,请提交到</span><a style="font-size: 15px; text-decoration: underline;"><span style="font-size: 15px;">crbug.com</span></a><span style="font-size: 15px;">。</span></p><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px;"><span style="font-size: 15px;"> </span><a style="font-size: 15px; text-decoration: underline;"><span style="font-size: 15px;">DevTools</span></a><span style="font-size: 15px;"> 协议的 bug,请提交到 </span><a style="font-size: 15px; text-decoration: underline;"><span style="font-size: 15px;">github.com/ChromeDevTools/devtools-protocol</span></a><span style="font-size: 15px;">。</span></p></li></ul><p><br/></p><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px; text-align: center;"><span style="color: rgb(136, 136, 136);"><span style="font-size: 15px;">本文由 看雪翻译小组 Green奇 编译,来源 </span><span style="color: rgb(136, 136, 136); font-size: 15px;">Eric Bidelman@ Web</span>   <br/></span></p><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px; text-align: center;"><span style="color: rgb(136, 136, 136);"/></p><p style="text-align: center;"><span style="line-height: 28px; color: rgb(255, 76, 65); font-size: 15px; background-color: rgb(255, 255, 255);">戳👇 图片加入看雪翻译<span style="color: rgb(255, 76, 65); font-size: 15px; line-height: 28px; text-align: center; background-color: rgb(255, 255, 255);">小组</span>哦!</span></p><p style="text-align: center;"><span style="color: rgb(136, 136, 136); font-size: 14px; line-height: 28px; background-color: rgb(255, 255, 255);"/></p><p style="text-align: center;"><a href="http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458280357&idx=2&sn=9a41f0328e6f5853340dd6e605353616&chksm=b181512f86f6d839e20a9af0da2542ce2daa898161a5fbbb9f7fdeb9d82753caa881d0190002&scene=21#wechat_redirect" target="_blank"><img class="" data-ratio="0.48905109489051096" data-s="300,640" referrerpolicy="no-referrer" data- referrerpolicy="no-referrer" src="http://mmbiz.qpic.cn/mmbiz_png/1UG7KPNHN8E27I5AqhuDicW4qicJM5E47mWvpfCkTRomjtflr2OF367ibSkZibMZmVogQLqsryOP51L39drBk5BHBA/640?wx_fmt=png" data-type="png" data-w="411" style="visibility: visible !important; width: auto !important; height: auto !important;" width="auto"/></a></p><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px; text-align: center;"><span style="color: rgb(136, 136, 136);"> </span>   <br/></p><p style="white-space: normal; margin-top: 15px; margin-bottom: 15px; line-height: 1.75em;"><span style="max-width: 100%; color: rgb(79, 138, 187); font-size: 16px; box-sizing: border-box !important; overflow-wrap: break-word !important;"><strong style="max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">往期热门内容推荐</strong></span></p><hr style="font-size: 16px; line-height: 25.6px; white-space: normal; max-width: 100%; color: rgb(62, 62, 62); box-sizing: border-box !important; overflow-wrap: break-word !important; background-color: rgb(255, 255, 255);"/><p style="line-height: 25.6px; white-space: normal;"><br/></p><ul class=" list-paddingleft-2" style="width: 528.188px; line-height: 25.6px; white-space: normal;"><li><p><a href="http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458282758&idx=1&sn=a5348376b532fd80931cdcd0d2fb5caf&chksm=b1815b8c86f6d29ae12124f94f16b3e0401f13248af50cd2c48ad5c4ea512b79bddfa6bdf115&scene=21#wechat_redirect" target="_blank" style="font-size: 15px; text-decoration: none;"><span style="font-size: 15px;">看雪企业 SRC 上线内测</span></a><br/></p></li><li><p style="line-height: normal; margin-bottom: 10px; margin-top: 10px;"><span style="font-size: 15px;"><a href="http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458282630&idx=1&sn=61fcbc708235dec5d7897a0d7c315756&chksm=b1815a0c86f6d31a50ba1f9a39d876e28f2c71096100b28e961df185f7be94ec77b9199efd51&scene=21#wechat_redirect" target="_blank">等你来挑战!| 看雪 CTF 2017 攻击篇</a></span></p></li><li><p style="line-height: normal; margin-bottom: 10px; margin-top: 10px;"><span style="font-size: 15px;"><a href="http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458282621&idx=1&sn=15f5bc0fa2b0b34ae241668b23a3939b&chksm=b1815af786f6d3e1fd4bad2c336d725ec600551a6477bbc4c6af93167074ac83873aeba89938&scene=21#wechat_redirect" target="_blank">【终于等到你!】看雪 CTF 2017</a></span></p></li><li><p style="line-height: normal; margin-bottom: 10px; margin-top: 10px;"><a href="http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458282703&idx=1&sn=7ed476d577172ff4b4a93807dae2667c&chksm=b1815a4586f6d35373f6c5d783fa99a7bb7cf2fc35da914761a9cf2d9943a09c1aefb9febfbf&scene=21#wechat_redirect" target="_blank" style="font-size: 15px; text-decoration: none;"><span style="font-size: 15px;">春风十里,我在等你</span></a></p></li><li><p style="line-height: normal; margin-bottom: 10px; margin-top: 10px;"><span style="font-size: 15px;"><a href="http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458282766&idx=1&sn=085e5cf9a00e31ddc0ff43c858b3cb5b&chksm=b1815b8486f6d29245021ddf2adb665c85c8709e1c4aeafb54fbf99d3a6db24c7c527e961638&scene=21#wechat_redirect" target="_blank">使用最新的代码重用攻击绕过执行流保护(一)</a></span></p></li><li><p style="line-height: normal; margin-bottom: 10px; margin-top: 10px;"><a href="http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458282758&idx=2&sn=68099a77861c39f15d5646551a08a9cd&chksm=b1815b8c86f6d29ab49792fb843073e16ca35c48656e26209f37baa4b11cbbe3efd5980576c4&scene=21#wechat_redirect" target="_blank" style="font-size: 15px; text-decoration: none;"><span style="font-size: 15px;">菜鸟调试经典老游戏之富甲天下3</span></a><br/></p></li><li><p style="line-height: normal; margin-bottom: 10px; margin-top: 10px;"><span style="font-size: 15px;"><a href="http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458282745&idx=1&sn=2e3693524c618307c2f6d9b9ae6e33e7&chksm=b1815a7386f6d365ea02480a2e1bc49abd329963c34735c0b2ddcf35cd6714961d63a88a2101&scene=21#wechat_redirect" target="_blank">【干货】4 月看雪论坛精华汇总,总有一篇你想要的</a><br/></span></p></li><li><p style="line-height: normal; margin-bottom: 10px; margin-top: 10px;"><span style="font-size: 15px;">......<br/></span></p></li></ul><p style="white-space: normal; margin-top: 15px; margin-bottom: 15px; line-height: 1.75em;"><span style="font-size: 15px;">更多优秀文章,长按下方二维码,“<span style="font-size: 15px; max-width: 100%; color: rgb(0, 122, 170); box-sizing: border-box !important; overflow-wrap: break-word !important;">关注看雪学院公众号</span>”查看!</span></p><p style="white-space: normal; margin-top: 15px; margin-bottom: 15px; line-height: 1.75em;"><span style="font-size: 15px;"/></p><p><img class="" data-ratio="0.665625" data-s="300,640" referrerpolicy="no-referrer" data- referrerpolicy="no-referrer" src="http://mmbiz.qpic.cn/mmbiz_jpg/1UG7KPNHN8GO5feqcgwicabss2pxAHicTsWduvzjbuBncjreVXnLqATcd0ezNEmk39lmK4rkHXslhSbYmgSniam9g/640?wx_fmt=jpeg" data-type="jpeg" data-w="640" style="visibility: visible !important; width: auto !important; height: auto !important;" width="auto"/></p><p style="font-size: 16px; white-space: normal; max-width: 100%; min-height: 1em; color: rgb(62, 62, 62); margin-top: 15px; margin-bottom: 15px; line-height: 1.75em; box-sizing: border-box !important; overflow-wrap: break-word !important; background-color: rgb(255, 255, 255);"><span style="max-width: 100%; color: rgb(178, 178, 178); font-size: 14px; box-sizing: border-box !important; overflow-wrap: break-word !important;">看雪论坛:http://bbs.pediy.com/<br/></span></p><p style="font-size: 16px; white-space: normal; max-width: 100%; min-height: 1em; color: rgb(62, 62, 62); margin-top: 15px; margin-bottom: 15px; line-height: 1.75em; box-sizing: border-box !important; overflow-wrap: break-word !important; background-color: rgb(255, 255, 255);"><span style="max-width: 100%; color: rgb(178, 178, 178); font-size: 15px; box-sizing: border-box !important; overflow-wrap: break-word !important;">微信公众号 ID:ikanxue</span></p><p style="font-size: 16px; white-space: normal; max-width: 100%; min-height: 1em; color: rgb(62, 62, 62); margin-top: 15px; margin-bottom: 15px; line-height: 1.75em; box-sizing: border-box !important; overflow-wrap: break-word !important; background-color: rgb(255, 255, 255);"><span style="max-width: 100%; color: rgb(178, 178, 178); font-size: 15px; box-sizing: border-box !important; overflow-wrap: break-word !important;">微博:看雪安全</span></p><p style="line-height: 1.75em; margin-top: 15px; margin-bottom: 15px; text-align: left;"><span style="max-width: 100%; color: rgb(178, 178, 178); font-size: 15px; box-sizing: border-box !important; overflow-wrap: break-word !important;">投稿、合作:www.kanxue.com</span>   <br/></p> </div> </div> </div> </div> <div class="topic_buttons"> <div class="fr gray f11" style="line-height: 12px; padding-top: 3px; text-shadow: 0px 1px 0px #fff;"> </div> </div> </div> <div class="sep5"></div> <div class="box"> <div class="cell"> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <!-- jintian_wenzhi --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1837452791782084" data-ad-slot="8042312523" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> <div class="sep5"></div> <div class="sep10"></div> <div class="box"> <div class="cell"> <span class="gray">推荐文章</span> </div> <div class="cell"> <table cellpadding="0" cellspacing="0" border="0" width="100%"> <tbody> <tr> <td width="32" valign="top" align="center"> <img src="" referrerpolicy="no-referrer" class="avatar" style="max-width: 32px; max-height: 32px;" border="0" align="default"> </td> <td width="10" valign="top"></td> <td width="auto" valign="top" align="left"> <span class="item_hot_topic_title"> <span>花果科技</span>  ·  <a href="/t/aWt0TU1oOGx0aA==">电脑微信史诗级更新,可以发朋友圈了!</a> </span> <div class="sep5"></div> <span class="fade">昨天</span> </td> </tr> </tbody> </table> </div> <div class="cell"> <table cellpadding="0" cellspacing="0" border="0" width="100%"> <tbody> <tr> <td width="32" valign="top" align="center"> <img src="http://img2.jintiankansha.me/get?src=http://mmbiz.qpic.cn/mmbiz_jpg/CKvMdchsUwlfW9micyMDYicrNwiaTOEFRdmD0dWzTXJ5SViaTdXEJebr000UMmjcateQibDLv9WiaoAJxQTIBLIRfcIA/0?wx_fmt=jpeg" referrerpolicy="no-referrer" class="avatar" style="max-width: 32px; max-height: 32px;" border="0" align="default"> </td> <td width="10" valign="top"></td> <td width="auto" valign="top" align="left"> <span class="item_hot_topic_title"> <span>macrozheng</span>  ·  <a href="/t/eDBmaUZWTH!aRw==">入职的新公司是微服务项目,慌了!</a> </span> <div class="sep5"></div> <span class="fade">2 天前</span> </td> </tr> </tbody> </table> </div> <div class="cell"> <table cellpadding="0" cellspacing="0" border="0" width="100%"> <tbody> <tr> <td width="32" valign="top" align="center"> <img src="http://img2.jintiankansha.me/get?src=http://mmbiz.qpic.cn/mmbiz_jpg/CKvMdchsUwlfW9micyMDYicrNwiaTOEFRdmD0dWzTXJ5SViaTdXEJebr000UMmjcateQibDLv9WiaoAJxQTIBLIRfcIA/0?wx_fmt=jpeg" referrerpolicy="no-referrer" class="avatar" style="max-width: 32px; max-height: 32px;" border="0" align="default"> </td> <td width="10" valign="top"></td> <td width="auto" valign="top" align="left"> <span class="item_hot_topic_title"> <span>macrozheng</span>  ·  <a href="/t/eDBmaUZWTH!aRw==">入职的新公司是微服务项目,慌了!</a> </span> <div class="sep5"></div> <span class="fade">2 天前</span> </td> </tr> </tbody> </table> </div> <div class="cell"> <table cellpadding="0" cellspacing="0" border="0" width="100%"> <tbody> <tr> <td width="32" valign="top" align="center"> <img src="http://img2.jintiankansha.me/get?src=http://mmbiz.qpic.cn/sz_mmbiz_jpg/iaVYJDZicKaTKDS6jExaRVibmRiciaIQfKKyRYs7kojsVEEX04cWuHycDm8FJBPtxJCklBmSJot5lzicumE4HLpibicceg/0?wx_fmt=jpeg" referrerpolicy="no-referrer" class="avatar" style="max-width: 32px; max-height: 32px;" border="0" align="default"> </td> <td width="10" valign="top"></td> <td width="auto" valign="top" align="left"> <span class="item_hot_topic_title"> <span>姜茶茶</span>  ·  <a href="/t/ZlhrWmRXeHZmUw==">一个优秀的大厂市场人朋友,被优化了。</a> </span> <div class="sep5"></div> <span class="fade">3 天前</span> </td> </tr> </tbody> </table> </div> <div class="cell"> <table cellpadding="0" cellspacing="0" border="0" width="100%"> <tbody> <tr> <td width="32" valign="top" align="center"> <img src="http://img2.jintiankansha.me/get?src=http://mmbiz.qpic.cn/sz_mmbiz_jpg/iaVYJDZicKaTKDS6jExaRVibmRiciaIQfKKyRYs7kojsVEEX04cWuHycDm8FJBPtxJCklBmSJot5lzicumE4HLpibicceg/0?wx_fmt=jpeg" referrerpolicy="no-referrer" class="avatar" style="max-width: 32px; max-height: 32px;" border="0" align="default"> </td> <td width="10" valign="top"></td> <td width="auto" valign="top" align="left"> <span class="item_hot_topic_title"> <span>姜茶茶</span>  ·  <a href="/t/ZlhrWmRXeHZmUw==">一个优秀的大厂市场人朋友,被优化了。</a> </span> <div class="sep5"></div> <span class="fade">3 天前</span> </td> </tr> </tbody> </table> </div> <div class="cell"> <table cellpadding="0" cellspacing="0" border="0" width="100%"> <tbody> <tr> <td width="32" valign="top" align="center"> <img src="http://img2.jintiankansha.me/get?src=http://mmbiz.qpic.cn/mmbiz_jpg/ZDm0poCOhLbAFIHX7baePu6cmnYeqgGz5XFbq9Zya3sIWw2WvBn16Lj1lsAU7tLRO6ON9D3m2iczAOtoAnlJtXA/0?wx_fmt=jpeg" referrerpolicy="no-referrer" class="avatar" style="max-width: 32px; max-height: 32px;" border="0" align="default"> </td> <td width="10" valign="top"></td> <td width="auto" valign="top" align="left"> <span class="item_hot_topic_title"> <span>超前挖掘</span>  ·  <a href="/t/WWVLZkY5emxRbw==">出海概念,强催化!</a> </span> <div class="sep5"></div> <span class="fade">4 天前</span> </td> </tr> </tbody> </table> </div> <div class="cell"> <table cellpadding="0" cellspacing="0" border="0" width="100%"> <tbody> <tr> <td width="32" valign="top" align="center"> <img src="http://img2.jintiankansha.me/get?src=http://mmbiz.qpic.cn/mmbiz_jpg/ZDm0poCOhLbAFIHX7baePu6cmnYeqgGz5XFbq9Zya3sIWw2WvBn16Lj1lsAU7tLRO6ON9D3m2iczAOtoAnlJtXA/0?wx_fmt=jpeg" referrerpolicy="no-referrer" class="avatar" style="max-width: 32px; max-height: 32px;" border="0" align="default"> </td> <td width="10" valign="top"></td> <td width="auto" valign="top" align="left"> <span class="item_hot_topic_title"> <span>超前挖掘</span>  ·  <a href="/t/WWVLZkY5emxRbw==">出海概念,强催化!</a> </span> <div class="sep5"></div> <span class="fade">4 天前</span> </td> </tr> </tbody> </table> </div> <div class="cell"> <table cellpadding="0" cellspacing="0" border="0" width="100%"> <tbody> <tr> <td width="32" valign="top" align="center"> <img src="http://img2.jintiankansha.me/get?src=http://mmbiz.qpic.cn/sz_mmbiz_jpg/KibdQSg9jnobEEgmqEhib2uZiaC0CNniaiaBltJiaVpjt0EHqjuAGGUuCXOI3ZNC3dXrZX4Vx9H2weVFwtKCqKoNEoSQ/0?wx_fmt=jpeg" referrerpolicy="no-referrer" class="avatar" style="max-width: 32px; max-height: 32px;" border="0" align="default"> </td> <td width="10" valign="top"></td> <td width="auto" valign="top" align="left"> <span class="item_hot_topic_title"> <span>助研空间</span>  ·  <a href="/t/ZVBCNlB4eWFlWA==">【PNAS】哥伦比亚大学Dennis Kent院士:三叠纪末生命大灭绝与中央大西洋岩浆省喷发同步!</a> </span> <div class="sep5"></div> <span class="fade">5 天前</span> </td> </tr> </tbody> </table> </div> <div class="cell"> <table cellpadding="0" cellspacing="0" border="0" width="100%"> <tbody> <tr> <td width="32" valign="top" align="center"> <img src="http://img2.jintiankansha.me/get?src=http://mmbiz.qpic.cn/sz_mmbiz_jpg/KibdQSg9jnobEEgmqEhib2uZiaC0CNniaiaBltJiaVpjt0EHqjuAGGUuCXOI3ZNC3dXrZX4Vx9H2weVFwtKCqKoNEoSQ/0?wx_fmt=jpeg" referrerpolicy="no-referrer" class="avatar" style="max-width: 32px; max-height: 32px;" border="0" align="default"> </td> <td width="10" valign="top"></td> <td width="auto" valign="top" align="left"> <span class="item_hot_topic_title"> <span>助研空间</span>  ·  <a href="/t/ZVBCNlB4eWFlWA==">【PNAS】哥伦比亚大学Dennis Kent院士:三叠纪末生命大灭绝与中央大西洋岩浆省喷发同步!</a> </span> <div class="sep5"></div> <span class="fade">5 天前</span> </td> </tr> </tbody> </table> </div> <div class="cell"> <table cellpadding="0" cellspacing="0" border="0" width="100%"> <tbody> <tr> <td width="32" valign="top" align="center"> <img src="http://img2.jintiankansha.me/get?src=http://mmbiz.qpic.cn/mmbiz_png/RicPMLX2HvIqxg6XmCMuEdW2DunJ90403gEaDdYMpicpabUfmLiaYKticXuV4t0RwyTiaEKy9OG2DPXo2FlUqE4BkPw/0?wx_fmt=png" referrerpolicy="no-referrer" class="avatar" style="max-width: 32px; max-height: 32px;" border="0" align="default"> </td> <td width="10" valign="top"></td> <td width="auto" valign="top" align="left"> <span class="item_hot_topic_title"> <span>齐鲁晚报</span>  ·  <a href="/t/Z3RNYmJoMVhW!g==">枣庄教师编考试与往年撞题60%!考试中心:题库有限…</a> </span> <div class="sep5"></div> <span class="fade">7 年前</span> </td> </tr> </tbody> </table> </div> <div class="cell"> <table cellpadding="0" cellspacing="0" border="0" width="100%"> <tbody> <tr> <td width="32" valign="top" align="center"> <img src="http://img2.jintiankansha.me/get?src=http://mmbiz.qpic.cn/mmbiz_jpg/8cu01Kavc5alu3iam1P0reSsibVGIpEZq6EsCHzko2kf6UUnqO5Z8zL1aaCMOz2iaybYGljtLfyzpSy9ia65phozicA/0?wx_fmt=jpeg" referrerpolicy="no-referrer" class="avatar" style="max-width: 32px; max-height: 32px;" border="0" align="default"> </td> <td width="10" valign="top"></td> <td width="auto" valign="top" align="left"> <span class="item_hot_topic_title"> <span>极客公园</span>  ·  <a href="/t/YjBaRXBZRHZQbQ==">过年了,Flappy Bird 开发者又带来了好玩的新游戏!</a> </span> <div class="sep5"></div> <span class="fade">7 年前</span> </td> </tr> </tbody> </table> </div> <div class="cell"> <table cellpadding="0" cellspacing="0" border="0" width="100%"> <tbody> <tr> <td width="32" valign="top" align="center"> <img src="http://img2.jintiankansha.me/get?src=http://mmbiz.qpic.cn/mmbiz_jpg/0y9ibmULDTbC6uqzp4ib4Q4u7Wpo0IZxoNrJyqYBWDCxKEicRB8KZCKDXoGdh8lHvkIYkymWn9wIicIiaTQRSKUvP4g/0?wx_fmt=jpeg" referrerpolicy="no-referrer" class="avatar" style="max-width: 32px; max-height: 32px;" border="0" align="default"> </td> <td width="10" valign="top"></td> <td width="auto" valign="top" align="left"> <span class="item_hot_topic_title"> <span>杭州交通918</span>  ·  <a href="/t/OWRDaWlXVE04Mw==">杭州地铁的四个小伙伴 —— 四条城际铁路 新年也开始一路“奔跑” 详细建设进程最新出炉</a> </span> <div class="sep5"></div> <span class="fade">7 年前</span> </td> </tr> </tbody> </table> </div> <div class="cell"> <table cellpadding="0" cellspacing="0" border="0" width="100%"> <tbody> <tr> <td width="32" valign="top" align="center"> <img src="http://img2.jintiankansha.me/get?src=http://mmbiz.qpic.cn/mmbiz_jpg/eiccNfic7OE9LiaoUrdtibPBZ5uHWbicJdfI6XLQgqb613JAwwmgoojGOXcDbhENnU06ZSvLxABpgEmKx5076ibAEg1g/0?wx_fmt=jpeg" referrerpolicy="no-referrer" class="avatar" style="max-width: 32px; max-height: 32px;" border="0" align="default"> </td> <td width="10" valign="top"></td> <td width="auto" valign="top" align="left"> <span class="item_hot_topic_title"> <span>半月谈</span>  ·  <a href="/t/bkU3!WtxNnM4Sg==">【品读】你可以不平凡</a> </span> <div class="sep5"></div> <span class="fade">7 年前</span> </td> </tr> </tbody> </table> </div> <div class="cell"> <table cellpadding="0" cellspacing="0" border="0" width="100%"> <tbody> <tr> <td width="32" valign="top" align="center"> <img src="http://img2.jintiankansha.me/get?src=http://mmbiz.qpic.cn/mmbiz_jpg/HvCO9hyFZ6FuW6mSfZ9JAADTw36Msky3ktV8bQxABsLJqu2yU3xbe1CGN1ia6VZ5yUog0uVN8jibjpTiaKfNxohrg/0?wx_fmt=jpeg" referrerpolicy="no-referrer" class="avatar" style="max-width: 32px; max-height: 32px;" border="0" align="default"> </td> <td width="10" valign="top"></td> <td width="auto" valign="top" align="left"> <span class="item_hot_topic_title"> <span>可可英语</span>  ·  <a href="/t/Q1NKS3Rlc1Mzag==">商务英语活学活用|办公室里的咖啡和点心</a> </span> <div class="sep5"></div> <span class="fade">7 年前</span> </td> </tr> </tbody> </table> </div> </div> <div class="sep5"></div> <div class="box"> <div class="cell"> <script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <!-- jintian_wenzhi --> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-1837452791782084" data-ad-slot="8042312523" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> <div class="sep5"></div> </div> </div> <div class="c"></div> <div class="sep20"></div> </div> <div id="Bottom"> <div class="content footer"> <div class="inner"> <div class="sep10"></div> <div class="fr"> </div> <strong> <a href="http://www.sov5.org" class="dark" target="_blank">Sov5搜索</a>   <span class="snow">·</span>   <a href="http://baike.sov5.org" class="dark" target="_blank">小百科</a>   <span class="snow">·</span>   <a class="go-mobile" href="javascript:;">移动版</a> </strong> <div class="sep20"></div> 51好读 - 好文章就要读起来! </div> </div> </div> <script type="text/javascript" src="https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/highlight.js/9.2.0/highlight.min.js"></script> <script type="text/javascript" src="https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery/1.11.0/jquery.min.js"></script> <script type="text/javascript" src="https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/jqueryui/1.9.2/jquery-ui.min.js"></script> <script type="text/javascript" src="/static/js/vendors/jquery/jquery.autosize.js?v=ac4d62e3842f55aa2b78d2c2ef1af833"></script> <script type="text/javascript" src="/static/js/vendors/lscache/lscache.min.js?v=bf403ab76d287d394375662defac76c3"></script> <script type="text/javascript" src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/select2/3.0.0/select2.min.js"></script> <script type="text/javascript" src="https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery.selectboxit/3.8.0/jquery.selectBoxIt.min.js"></script> <script src="https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery.textcomplete/0.3.3/jquery.textcomplete.min.js" type="text/javascript"></script> <script type="text/javascript" src="/static/js/site/base/common.js?v=97646d06e4a04b2bf43b7b467cfd321e"></script> <script type="text/javascript" src="/static/js/site/base/v2ex.js?v=d41d8cd98f00b204e9800998ecf8427e"></script> <script type="text/javascript" src="/static/js/site/base/base.js?v=edcfd5298fe2acdc62d7fb498c373f99"></script> <!-- Google tag (gtag.js) --> <script async src="https://www.googletagmanager.com/gtag/js?id=G-0SBZ564CXS"></script> <script> window.dataLayer = window.dataLayer || []; function gtag() { dataLayer.push(arguments); } gtag('js', new Date()); gtag('config', 'G-0SBZ564CXS'); </script> <script> var _hmt = _hmt || []; (function () { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?55a854de13a9633b2937a3c24817fc7b"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> <script> (function () { var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> <!-- 多条广告如下脚本只需引入一次 --> <script type="text/javascript" src="//cpro.baidustatic.com/cpro/ui/cm.js" async="async" defer="defer"> </script> <script type="text/javascript" src="/static/js/site/post/post.js?v=e7935b685b5f2aef4de680492fd620cf"></script> <script type="text/javascript"> jQuery.browser = {}; (function () { jQuery.browser.msie = false; jQuery.browser.version = 0; if (navigator.userAgent.match(/MSIE ([0-9]+)\./)) { jQuery.browser.msie = true; jQuery.browser.version = RegExp.$1; } })(); </script> <script type="text/javascript" src="/static/js/site/post/post_common.js?v=15968870dc6780d5664012d59b217894"></script> <script type="text/javascript" src="https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery-hashchange/1.3/jquery.ba-hashchange.min.js"></script> <script type="text/javascript" src="/static/js/site/post/post_folder.js?v=d3abab84fa5b19533d2131bf98e690f7"></script> </body> </html>