整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Web 防爬指南

至少让其更难抓取)

这篇文章我翻译自:https://github.com/JonasCz/How-To-Prevent-Scraping,因为最近在看一些反爬的资料,无意间在 Github 发现这篇文章,我觉得写很全面,所以想要翻译一下,顺便进行吸收。另外让我觉得非常赞的是这个文章从服务端和前端的角度都做了分析,我们应该从哪些点去做优化,而且每个点都举了例子,有些还给出了注意点。虽然文中有些提到的一些点很基础,也有很多我们目前在业务中也在使用,但是我还是从中吸收到了一些新东西,里面文中外部链接有很多,但是公众号这里不允许外链,所以大家可以点击文末最后的"阅读原文"到 Github 去查看,Github Markdown 的排版可能也比这里更好 : )。

(最后,有些仓促,可能有些注意不到的措别字,还请多多包涵)

提示:这篇文章是我 Stack Overflow 这个问题回答的扩展,我把它整理在 Github 因为它实在是太长了,超过了 Stack Overflow 的字数限制(最多 3 万个字,这文章已经超过 4 万字)

欢迎大家修改、完善还有分享,本文使用 CC-BY-SA 3.0 许可。

本质上说,防抓的目的在于增加脚本或机器获取你网站内容的难度,而不要影响真实用户的使用或搜索引擎的收录

不幸的是这挺难的,你需要在防抓和降低真实用户以及搜索引擎的可访问性之间做一下权衡。

为了防爬(也称为网页抓取、屏幕抓取、网站数据挖掘、网站收割或者网站数据获取),了解他们的工作原理很重要,这能防止他们能高效爬取,这个就是这篇文章的主要内容。

通常情况下,抓取程序的目的是为了获取你网站特定的信息,比如文章内容、搜索结果、产品详情还有网站上艺术家或者相册信息。他们爬取这些内容用于维护他们自己的网站(甚至通过你的内容赚钱!),或者制作和你网站不一样的前端界面(比如去做移动 APP),还有一些可能作为个人研究或分析使用。

实际上,有特别多的爬虫类型,而且他们的爬取方式都不太相同:

  • 蜘蛛,比如 Google's bot 或者网站复制工具 HTtrack,他们访问你的网站,而且在页面中寻找链接后递归的去爬取以获取页面的数据。有时候他们只用于获取特定数据,而不会全部爬取,通常结合 HTML 分析器在页面中获取想要的数据。
  • Shell 脚本,有时候,通用的 Unix 工具也被用来爬取:wget 或者 curl 用于下载页面,用 Grep (Regex) 去分析获取想要的数据,一般都会写一个 Shell 脚本。这些都是最简单的爬虫,也是最脆弱的一类爬虫(Don't ever try parse HTML with regex !),所以是最早发现和防范的爬虫。
  • HTML 爬取器和分析器,会基于 Jsoup、Scrapy 还有其他一些工具。和 shell 脚本基于正则类似,他们呢基于特定模式(pattern)分析你的 HTML 结构从而获取想要的数据。举个例子:如果你的网站有搜索功能,那这个爬虫可能会模拟提交一个搜索的 HTTP 请求,然后从搜索结果页中获取所有的链接和标题,有时候会构造有成千上百不同的请求,只是为了获取标题和链接而已。这是最常见的一类爬虫。
  • 屏幕爬取,比如会基于 Selenium 或者 PhantomJS,他们实际上会通过真实浏览器打开你的网站,因此也会运行你网站的 JavaScript、AJAX 或者其他的,然后他们从你的页面获取自己想要的文本内容,通常:基于浏览器的爬取很难处理,他们运行脚本,渲染 HTML,就像真实用户一样访问你的网站。
    • 等页面加载完毕, JavaScript 也执行之后,从浏览器获取 HTML 结构,然后用 HTML 分析器去获取想要的数据或者文本。这是常见做法,所以有很多方法可以防止这类 HTML 分析器或爬虫。
    • 获取加载完页面的屏幕截图,然后使用 OCR 分析从截屏中获取想要的数据。这类不唱将,而且只有非常想要你网站内容的爬虫才会使用。
  • Web爬取服务,比如 ScrapingHub 或者 Kimono。实际上,很多人的工作就是找出如何爬取你的页面获取其中内容并给其他人使用。他们又是会用大量的代理甚至修改 IP 地址来绕过频率限制和封禁,所以他们反爬的关键对象。毫无疑问,防止专业的爬取服务是非常困难的,但是如果你增加爬取的难度,或者增加他们找出爬取方法的时间,那这些人(或者付钱让他们做的人)可能会放弃爬取你的网站。
  • 把你的网站页面通过 frames 嵌入其他站点,或者把你的页面嵌入移动 APP。虽然没有什么技术含量,但是确实也是个问题,比如移动 APP(Android 和 iOS)可以嵌入你的网站,甚至可以注入一些自定义的 CSS 和 JavaScript,所以可以完全改变你网站的外观,然后只展示想要的信息,比如只展示文章内容或者搜索结果,然后隐藏你网站的 headers、footers 还有广告。
  • 人肉复制粘贴:人肉复制和粘贴你网站的内容到其他地方。很遗憾,这个没有好的方法加以防范。

以上不同的爬虫类型有很多相同点,很多爬虫的行为也很相似,即使他们使用了不同的技术或者方案去爬取你的内容。

这些大多数都是我自己的想法,我在写爬虫时也遇到许多困难,还有一些是来源于网络。

如何反爬

一些常见的检测和防止爬虫的方法:

监控你的日志和请求;当发现异常行为时限制访问

周期性的检查你的日志,如果发现有异常活动表明是自动爬取(爬虫),类似某一个相同的 IP 很多相同的行为,那你就可以阻止或限制访问。

一些常用的方法:

  • 频率限制
  • 只 允许用户(或爬虫)在一段时间内访问特定的次数,举个例子,某个 IP 或用户只允许一分钟搜索很少的次数。 这个会减慢爬虫的爬取速度,让他们变得低效。 如果次数特别多或者比真实用户多很多,那你也可以显示验证码页面。
  • 检测异常行为如果你能看到异常行为,比如同一个 IP 有很多相同的请求,有些会翻很多页或者访问一些异常的页码,你可以拒绝访问或者在后续的请求中展示验证码。
  • 不要只通过 IP 检测和限制,也要用其他的用户标识如果你做了访问限制或频率限制,不要只简单的根据单个 IP 地址去做;你可以通过其他的标识和方法去识别一个用户或爬虫。一些可以帮你识别用户/爬虫的标识:
    • 用户填写表单的速度,还有他们点击按钮的位置
    • 你可以通过 JavaScript 获取很多信息,比如屏幕的大小 / 分辨率,时区,安装的字体等等,你可以用这些去识别用户
    • 携带的 HTTP 头,特别是 User-Agent

    举个例子,如果某个 IP 请求了你网站很多次,所有的访问都有相同的 UserAgent 、屏幕尺寸(JavaScript 检测),还有全都使用同样的方式和固定的时间间隔点击同一个按钮,那它大概是一个屏幕爬虫;你可以临时限制相似的请求(比如 只限制来自那个 IP 特定 User-Agent 和 屏幕尺寸的请求),这样你不会误伤同样使用这个 IP 的真实用户,比如共享网络链接的用户。

    更进一步,当你发现相似的请求,但是来自不同的 IP 地址,表明是分布式爬虫(使用僵尸网络或网络代理的爬虫)。如果你收到类似大量的请求,但是他们来自不同的 IP 地址,你可以拒绝访问。再强调一下,小心不经意限制了真实用户。

    这种方法对那种运行 JavaScript 的屏幕爬虫比较有效,因为你可以获得他们大量的信息。

    Stack Exchange 上关于 Secruity 的相关问题:

    How to uniquely identify users with the same external IP address?

    Why do people use IP address bans when IP addresses often change? 关于仅使用 IP 的其他限制

  • 使用验证码,而不是临时限制访问对于频率限制,最简单的方式就是临时限制访问,然而使用验证码会更好,看下面关于验证码的部分。
  • 要求注册和登录

    如果可行,要求创建用户才可以查看你的内容。这个可以很好遏制爬虫,但很容易遏制真实用户:

    • 如果你要求必须创建账户和登录,你可以精准跟踪用户和爬虫的行为。这样的话,你可以很简单就能检测到有爬取行为的账户,然后封禁它。像频率限制或检测滥用(比如段时间大量搜索)就变得简单,你也可以不仅仅通过 IP 去识别爬虫。

    为了防止爬虫创建大量的用户,你应该:

    • 注册时需要提供 email 地址,发送一个验证链接到邮箱,而且这个链接必须被打开才可以激活这个账户。一个邮箱只允许一个账户使用。
    • 在注册或创建用户时,必须通过验证码验证,为了防止创建用户的自动脚本。

    要求注册用户对用户和搜索引擎来说不友好;如果你要求必须注册才可以看文章,那用户也可能直接离开。

    阻止来自云服务商和抓取服务的 IP

    有时爬虫会被运行在云服务商,比如 Amazon Web Services 或 Google App Engine,或者其他 VPS。限制这些来自云服务商的 IP 地址访问你的网站(或出验证码)。你可以可以直接对来自爬取服务的 IP 地址限制访问。

    类似的,你也可以限制来自代理或 VPN 的 IP 地址,因为很多爬虫会使用它们来防止被检测到。

    但是要知道限制来自代理服务器或 VPN 的 IP,也很容易影响到真实用户。

    当你封禁时不要展示具体错误信息

    如果你要封禁或限制访问,你应该确保不要把导致封禁的原因告诉爬虫,他们会根据提示修改自己的爬虫程序。所以下面的这些错误最好不要出现:

    • 你的 IP 访问太多次了,请重试
    • 错误,没有 User Agent

    想法的,展示一些不包含原因的友好信息会更好,比如下面的信息会更好:

    • 对不起,有些不对劲。如果问题持续出现,你可以联系 helpdesk@example.com 以获取支持。

    如果真实用户看到这个错误页面,这个对真实用户来说也十分友好。在后续访问中,你也可以考虑展示验证码而不是直接封禁,如果真实用户看到这个错误信息,对于合法用户也会联系你。

    如果有爬虫访问,请使用验证码

    验证码(Captcha,“Completely Automated Test to Tell Computers and Humans Apart”)对于防爬十分有效。不幸的是,它也很容易惹恼用户。

    因此,如果你发现疑似爬虫,而且想要阻止它的爬取行为,而不是封禁它以免它是真实用户。你可以考虑显示验证码在你再次允许访问之前。

    使用验证码的注意事项:

    • 不要造轮子,使用类似 Google 的 reCaptcha 的一些服务:比你自己实现一套验证码服务要简单太多,对于用户来说,也比识别模糊或扭曲的文字更友好(用户一般只需要点击一下),而且相对于你自己提供的简单验证码图片,爬虫也更难去破解
    • 不要在 HTML 结构中包含验证码答案:我曾经看到过一个网站在它自己页面上有验证码的答案,(虽然隐藏很好)所以让验证码根本就没有用。不要做类似的事情。再强调一次,用像 reCaptcha 的服务,你将不会有类似的问题(如果你正确地使用它)

    将你的文字转为图片

    你可以在服务端将文字渲染成图片显示,他将防止简单的爬虫去获取文字内容。

    然而,这个对于屏幕阅读器、搜索引擎、性能还有一些其他一些事情都不太好。这个在某些方面也是不违法的(源于访问性问题,eg. the Americans with Disabilities Act),而且对于一些 OCR 爬虫也能非常简单的规避,所以不要采用这种方式。

    你也可以用 CSS sprites 做类似的事情,但是也有相同的问题。

    不要暴露你完整的数据

    如果可以的话,不要让脚本/爬虫能获取你所有的数据。举个例子:你有一个新闻站,有大量的个人文章。你应该确保文章只能通过你自己网站的搜索到,如果你网站不是到处都有你的文章还有链接,那么确保它们只能被搜索功能访问到。这意味着如果一个脚本想要获取你网站的所有文章,就必须通过你站点文章中所有可能的短语去进行搜索,从而获取所有的文章列表,但是这个会非常耗时,而且低效,从而让爬虫放弃。

    以下操作会让你完全暴露:

    • 爬虫/脚本并不想/需要获取所有的数据
    • 你站点文章的链接看起来是这种方式 example.com/article.php?articleId=12345 ,这样做(或类似的其他做法)会让爬虫很简单的迭代 articleID 就能获取你所有的文章
    • 还有一些其他方式获取所有的文章,比如写一个脚本去递归的爬取你文章中其他文章的链接
    • 搜索一些常用的词比如 "一" 或者 "的" 将会暴露几乎所有的内容。所以这点是要注意的(你可以通过只返回 top 10 或 top 20 来避免这个问题)
    • 你的文章需要被搜索引擎收录

    不要暴露你的 API、节点或其他类似的东西

    确保你不会暴露你的任何 API,很多时候都是无意间暴露。举个例子,如果你正在使用 AJAX 或 Adobe Flash 的网络请求 或 Java Applet(千万不要用!)来加载你的数据,从这些网络请求中找到要请求的 API 十分简单,比如可以进行反编译然后在爬虫程序中使用这些接口。确保你混淆了你的 API 并且其他人要用它会非常难破解。

    阻止 HTML 解析器和爬取器

    由于 HTML 解析器是通过分析页面特定结构去获取内容,我们可以故意修改这些结构来阻止这类爬虫,甚至从根本上他们获取内容。下面大多数做法对其他类型爬虫如搜索引擎蜘蛛、屏幕爬虫也有效。

    经常修改你的 HTML 结构

    处理 HTML 的爬虫通过分析特定可识别的部分来处理 HTML。举个例子:如果你所有的页面都有 id 为 article-contentdiv 结构,然后里面有你的文章内容,那要获取你站点所有文章内容是十分简单的,只要解析那个 article-content 那个 div 就可以了,然后有这个结构的爬虫就可以把你的文章随便用在什么地方。

    如果你常常修改 HTML 还有你页面的结构, 那这类爬虫就不能一直使用。

    • 你可以经常修改你 HTML 的 idclass ,甚至让他能自动改变。所以,如果你的 div.article-content 变成 div.a4c36dda13eaf0 ,而且每周都会变化,那么爬虫一开始可能能正常工作,但是一周之后就不能使用了。同时也确保修改你 id/class的长度,这样也可以避免爬虫使用类似 div.[any-14-characters] 来找到想要的 div
    • 如果无法从标记中找到所需的内容,则抓取工具将通过HTML的结构方式进行查找。所以,如果你的所有文章都有类似的结构,比如每个 div ,并且里面通过 h1 放文章的标题,爬虫将基于这个结构获取文章内容。同样的,为了防止这个,你可以在你的 HTML 添加/删除 额外的标记,周期并且随机做,eg. 添加额外的 divspan 。对于服务端渲染的程序,这应该不会很难。

    注意事项:

    • 它的实现、维护和调试都是很复杂困难的
    • 你要注意缓存。特别是你修改你 HTML 元素的 id 或 class 时,也要去修改相应的 CSS 和 JavaScript 文件,这意味着每次修改都要修改这些,而浏览器每次都要重新下载他们。这将导致页面打开慢也会导致服务端负载升高。不过这也不是一个大问题,如果你只是一个星期改变一次。
    • 聪明的爬虫仍然能推断出你文章的位置,比如,页面上大块的文本大概率是文章内容。这个让爬虫从页面找到、获取想要的数据。Boilerpipe 就是这样做的。

    本质上来说,就是确保爬虫从相似页面获取想要的内容变得不那么容易。

    可以参考这个 PHP 的实现:How to prevent crawlers depending on XPath from getting page contents

    基于用户地理位置修改 HTML

    这个和前一个类似。如果你根据不同用户的位置/国家(根据 IP 获取)来提供不同的 HTML,这个可能会破坏将站点 HTML 给用户的爬虫。比如,如果有人写了一个移动 APP 来抓取你的站点,一开始可以用,但是对于不同地区的用户就不起作用了,因为他们会获取到不同的 HTML 结构,嵌入式的 HTML 将不不能正常使用。

    经常改变 HTML,并与爬虫斗智斗勇!

    举个例子:你有一个包含搜索功能的网站, example.com/search?query=somesearchquery 的搜索结果是下面的 HTML 结构:

    <div class="search-result">
    
      <h3 class="search-result-title">Stack Overflow has become the world's most popular programming Q & A website</h3>
    
      <p class="search-result-excerpt">The website Stack Overflow has now become the most popular programming Q & A website, with 10 million questions and many users, which...</p>
    
      <a class"search-result-link" href="/stories/stack-overflow-has-become-the-most-popular">Read more</a>
    
    </div>
    
    (And so on, lots more identically structured divs with search results)
    

    你可以猜到这个非常容易爬取:一个爬虫需要做的就只是访问搜索链接,然后从返回的 HTML 分析想要的数据。除了定期修改上面 HTML 的内容,你也可以 保留旧结构的 id 和 class,然后使用 CSS 进行隐藏,并使用假数据进行填充,从而给爬虫投毒 。比如像下面这样:

    <div class="the-real-search-result">
    
      <h3 class="the-real-search-result-title">Stack Overflow has become the world's most popular programming Q & A website</h3>
    
      <p class="the-real-search-result-excerpt">The website Stack Overflow has now become the most popular programming Q & A website, with 10 million questions and many users, which...</p>
    
      <a class"the-real-search-result-link" href="/stories/stack-overflow-has-become-the-most-popular">Read more</a>
    
    </div>
    
    
    
    
    <div class="search-result" style="display:none">
    
      <h3 class="search-result-title">Visit example.com now, for all the latest Stack Overflow related news !</h3>
    
      <p class="search-result-excerpt">EXAMPLE.COM IS SO AWESOME, VISIT NOW! (Real users of your site will never see this, only the scrapers will.)</p>
    
      <a class"search-result-link" href="http://example.com/">Visit Now !</a>
    
    </div>
    
    (More real search results follow)
    

    这意味着基于 id 或 class 获取特定数据的爬虫仍然能继续工作,但是他们将会获取假数据甚至广告,而这些数据真实用户是看不到的,因为他们被 CSS 隐藏了。

    与爬虫斗智斗勇:在页面插入假的、不可见的蜜罐数据

    对上个例子进行补充,你可以在你的 HTML 里面增加不可见的蜜罐数据来抓住爬虫。下面的例子来补充之前说的搜索结果:

    <div class="search-result" style="display:none">
    
      <h3 class="search-result-title">This search result is here to prevent scraping</h3>
    
      <p class="search-result-excerpt">If you're a human and see this, please ignore it. If you're a scraper, please click the link below :-)
    
      Note that clicking the link below will block access to this site for 24 hours.</p>
    
      <a class"search-result-link" href="/scrapertrap/scrapertrap.php">I'm a scraper !</a>
    
    </div>
    
    (The actual, real, search results follow.)
    

    一个来获取所有内容的爬虫将会被找到,就像获取其他结果一样,访问链接,查找想要的内容。一个真人将不会看到(因为使用 CSS 隐藏),而且更不会访问这个链接。而正规或者期望的蜘蛛比如谷歌的蜘蛛将不会访问这个链接,因为你可以将 /scrapertrap/ 加入你的 robots.txt 中(不要忘记增加)

    你可以让你的 scrapertrap.php 做一些比如限制这个 IP 访问的事情,或者强制这个 IP 之后的请求出验证码。

    • 不要忘记在你的 robots.txt 中添加禁止访问 /scrapertrap/ 的规则避免所有的搜索引擎不会中招
    • 你可以/应该和上个经常更换 HTML 结构的例子一起使用
    • 也要经常修改它,因为爬虫可能会周期性的了解并不去访问它。修改蜜罐 URL 和文本。同时要考虑使用 id 属性或外部的 CSS 来取代内联的 CSS,要不然爬虫将会学会防止爬取所有包含隐藏属性 style 的节点。并且只是偶尔启用它, 这样爬虫一开始正常工作,但是过段时间就不起作用。这个同样也适用于上个例子。
    • 要注意可能会有恶意的人在论坛发布像 [img]http://yoursite.com/scrapertrap/scrapertrap.php[img] ,然后当正常用户访问然后点击到你的蜜罐链接。所以上个注意事项中经常更换你的蜜罐链接是非常重要的,当然你也可以检查 Referer。

    当识别为爬虫时,提供假的或无用的数据

    如果你确定某个访问是爬虫,你可以提供假的或者无用的数据;这将破坏爬虫从你网站获取的数据。你还应该把它和真实数据进行混淆,这样爬虫就不知道他们获取的到底是真的还是假的数据。

    举个例子:如果你有一个新闻站,你检测到了一个爬虫,不要去直接封禁它,而是提供假的或者随机生成的文章,那爬虫获取的数据将会被破坏。如果你将假数据和真实的数据进行混淆,那爬虫很难获取到他们想要的真实文章。

    不要接受没有 UserAgent 的请求

    很多懒惰的程序员不会在他们的爬虫发请求时带上 UserAgent,而所有的浏览器包括搜索引擎蜘蛛都会携带。

    如果请求你时没有携带 UserAgent header 头,你可以展示验证码,或者直接封禁或者限制访问(或者像上面说的提供假数据或者其他的)

    这个非常简单去避免,但是作为一种针对书写不当的爬虫,是值得去做的。

    不要接受 UserAgent 是通用爬虫或在爬虫黑名单的请求

    很多情况下,爬虫将会使用真实浏览器或搜索引擎爬虫绝对不会使用的 UserAgent,比如:

    • "Mozilla" (就只有这个,我曾经看到过一些爬虫的问题用这个,但真实浏览器绝对不会用)
    • "Java 1.7.43_u43" (Java 的 HttpUrlConnection 的默认 UserAgent)
    • "BIZCO EasyScraping Studio 2.0"
    • "wget", "curl", "libcurl",.. (基础爬虫有时候会用 Wget 和 cURL)

    如果你发现一些爬虫使用真实浏览器或合法蜘蛛绝对不会使用的 UserAgent,你可以将其添加到你的黑名单中。

    检查 Referer header 头

    对上一章节的补充,你也可以检查 [Referer] (https://en.wikipedia.org/wiki/HTTP_referer header) (是的,它是 Referer,而不是 Referrer),一些懒惰的爬虫可能不会携带的这个,或者只是每次都携带一样的(有时候是 “google.com”)。举个例子,如果用户是从站内搜索结果页点击进入文章详情的,那要检查 Referer 这个 header 头是否存在还要看搜索结果页的打点。

    注意:

    • 真实浏览器并不总是携带 Referer;
    • 很容易被避免

    还是,作为一种防止简单爬虫的方法,也值得去实现。

    如果不请求资源(CSS,images),它可能不是真实浏览器

    一个真实浏览器(通常)会请求和下载资源比如 CSS 和 图片。HTML 解析器和爬取器可能只关心特定的页面和内容。

    你可以基于访问你资源的日志,如果你看到很多请求只请求 HTML,那它可能就是爬虫。

    注意搜索引擎蜘蛛、旧的移动设备、屏幕阅读器和设置错误的设备可能也不会请求资源。

    要求使用 Cookie;使用它们来跟踪用户和爬虫行为

    访问你网站时,你可以要求 cookie 必须开启。这个能识别没有经验和爬虫新手,然而爬虫要携带 Cookie 也十分简单。如果你要求开启 Cookie,你能使用它们来追踪用户和爬虫的行为,然后基于此来实现频率限制、封禁、或者显示验证码而不仅仅依赖 IP 地址。

    举个例子:当用户进行搜索时,设置一个唯一的 Cookie。当搜索结果加载出来之后,验证这个 Cookie。如果一个用户打开了所有的搜索结果(可以从 Cookie 中得知),那很可能就是爬虫

    使用 Cookie 可能是低效的,因为爬虫也可以携带 Cookie 发送请求,也可以根据需要丢弃。如果你的网站只能在开启 Cookie 时使用,你也不能关闭 Cookie 的用户提供服务。

    要注意如果你使用 JavaScript 去设置和检测 Cookie,你能封禁那些没有运行 JavaScript 的爬虫,因为它们没办法获取和发送 Cookie。

    使用 JavaScript 和 AJAX 加载内容

    你可以在页面加载完成之后,使用 JavaScript + AJAX 来加载你的内容。这个对于那些没有运行 JavaScript 的 HTML 分析器来说将无法取得数据。这个对于没有经验或者新手程序员写的爬虫非常有效。

    注意:

    • 使用 JavaScript 加载内容将会降低用户体验和性能;
    • 搜索引擎也不会运行 JavaScript,因此不会对你的内容进行收录。这对于搜索结果来说可能不是问题,但是要注意其他页面,比如文章页面;
    • 写爬虫的程序员获取到加载内容的 API 后可以直接使用它

    混淆你的数据和网络请求,不要让其直接通过脚本就能获取

    如果你用 Ajax 和 JavaScript 加载你的数据,在传输的时候要混淆一下。比如,你可以在服务器端 encode 你的数据(比如简单的使用 base64 或 负载一些的多次混淆、位偏移或者是进行加密),然后在客户端在 Ajax 获取数据之后再进行 decode。这意味着如果有人要抓包获取你的请求就不能直接看到你页面如何加载数据,而且那些人也不能直接通过 API 获得你的数据,如果想要获取数据,就必须要去解密你的算法。

    • 如果你用 Ajax 加载数据,那你应该强制在页面加载之后才可以获取,比如要求获取数据必须包含 session 信息,这些你可以在页面加载的时候嵌入到 JavaScript 或 HTML 中
    • 你也可以直接把混淆的数据嵌入到 HTML 中,然后用 JavaScript 去解密然后再显示它们,这样的话,你就不需要再使用 Ajax 去做额外的请求。这样做可以让那些不运行 JavaScript 的 HTML 解析器更难获取你的数据,他们必须要反解你的 JavaScript(没错,JavaScript 也要做混淆)
    • 你应该经常更换混淆方法以免爬虫找出方法揭秘它

    下面是一些这个方式的缺点:

    • 实现、维护和调试都非常麻烦
    • 虽然让爬虫变得不容易抓取,但是对于截屏类的爬虫来说,它们实际上会运行 JavaScript,所以能获取到数据(不过很多简单的 HTML 解释器不会运行 JavaScript)
    • 如果真实用户禁用了 JavaScript,那你的网站将不能正常显示
    • 性能和页面加载速度会受到影响

    其他非技术做法

    你的服务器供应商可能提供搜索引擎蜘蛛或爬虫的防御:

    比如,CloudFlare 提供反蜘蛛和反爬虫的防御,你只需要直接启用它就可以了,另外 AWS 也提供类似服务。而且 Apache 的 mod_evasive 模块也能让你很轻松地实现频率限制。

    直接告诉别人不要抓取,会有人尊重而且停止抓取

    你应该直接告诉人们不要抓取你的网站,比如,在你的服务条款中表明。有些人确实会尊重它,而且不在你允许的情况下不会再去抓取数据。

    寻求律师的援助

    律师们知道如何处理侵犯版权的事情,而且他们可以发送律师函。DMCA(译者注:Digital Millennium Copyright Act,数字千年版权法案,是一个美国版权法律) 也能提供援助。

    直接提供 API 获取你的数据

    这看起来适得其反,但是你可以要求标明来源并包含返回你站点的链接。甚至也可以售卖你的 API 而赚取费用。

    还有就是,Stack Exchange 提供了 API,但是必须要标明来源。

    其他补充

    • 要在用户体验和反爬之间做权衡:你做的每个举措都有可能在某种程度上影响用户体验,所以你必须要权衡和妥协;
    • 不要忘你的移动站点和 APP:如果你的站点有移动版,要小心爬虫也可以通过它爬取你的数据。或者说你有移动 APP,他们也可以截屏分析,或者可以抓取你的网络请求去直接找到你的 RESTful 的 API 直接使用;
    • 如果你对一些特定浏览器提供了特定的版本,比如对很老的 IE 版本提供网站的阉割版,不要忘记爬虫也可以直接爬取它;
    • 选出集中最适合你的策略结合起来使用,而不是只用一种;
    • 爬虫可以抓取其他爬虫:如果有个网站显示的内容都是从你网站爬取的,那另外一个爬虫也可以直接爬取那个网站。

    有哪些最有效的方法 ?

    以我自己写和帮忙别人写爬虫的经验,我认为最有效的方法是:

    • 经常修改 HTML 的结构
    • 蜜罐和假数据
    • 使用混淆的 JavaScript、Ajax 还有 Cookie
    • 频率限制、爬虫检测和请求封禁

    扩展阅读:

    • 维基百科关于 Web 爬虫的文章,其中提到了很多 Web 爬虫的相关技术和爬虫类型,看完如何进行 web 爬取的一些信息,也不要忘记看一看爬取的合法性。

    最后祝你在保护你网站的内容坎坷路上一路顺风...

    作者:h1z3y3

    来源:微信公众号: 360搜索技术团队

    出处:https://mp.weixin.qq.com/s?__biz=MzA5ODIxODE2Ng==&mid=2651137205&idx=1&sn=664a46d66f132c96780750d4e9b206eb

    防火墙”可以阻挡“黑客”的进攻吗?

    "防火墙"这个词大家应该都听说过或者应用过,每个人的电脑、手机几乎都会安装一些的主流的防火墙软件,工作的企事业单位网络里都会安装硬件防火墙。那么这些防火墙能阻挡住黑客的攻击吗?今天我就和大家分享一下这个话题!

    一、首先我们需要知道防火墙的原理或者说主要功能

    1、什么是防火墙?

    官方定义:防火墙也被称为防护墙,它是一种位于内部网络与外部网络之间的网络安全系统,可以将内部网络和外部网络隔离。通常,防火墙可以保护内部/私有局域网免受外部攻击,并防止重要数据泄露。在没有防火墙的情况下,路由器会在内部网络和外部网络之间盲目传递流量且没有过滤机制,而防火墙不仅能够监控流量,还能够阻止未经授权的流量。

    简单理解:防火墙是由软件或者软件和硬件组成的系统,它处于安全的网络(通常是内部局域网)和不安全的网络之间,根据由系统管理员设置的访问控制规则,对数据流进行过滤。

    2、防火墙基本分类和工作原理

    1) 包过滤防火墙

    这是第一代防火墙,又称为网络层防火墙,在每一个数据包传送到源主机时都会在网络层进行过滤,对于不合法的数据访问,防火墙会选择阻拦以及丢弃。这 种防火墙的连接可以通过一个网卡即一张网卡由内网的IP地址,又有公网的IP地址和两个网卡一个网卡上有私有网络的IP地址,另一个网卡有外部网络的IP 地址。

    第一代防火墙和最基本形式防火墙检查每一个通过的网络包,或者丢弃,或者放行,取决于所建立的一套规则。这称为包过滤防火墙。

    本质上,包过滤防火墙是多址的,表明它有两个或两个以上网络适配器或接口。例如,作为防火墙的设备可能有两块网卡(NIC),一块连到内部网络,一块连到公共的Internet。防火墙的任务,就是作为"通信警察",指引包和截住那些有危害的包。

    包过滤防火墙检查每一个传入包,查看包中可用的基本信息(源地址和目的地址、端口号、协议等)。然后,将这些信息与设立的规则相比较。如果已经设立了阻断telnet连接,而包的目的端口是23的话,那么该包就会被丢弃。如果允许传入Web连接,而目的端口为80,则包就会被放行。

    多个复杂规则的组合也是可行的。如果允许Web连接,但只针对特定的服务器,目的端口和目的地址二者必须与规则相匹配,才可以让该包通过。

    最后,可以确定当一个包到达时,如果对该包没有规则被定义,接下来将会发生什么事情了。通常,为了安全起见,与传入规则不匹配的包就被丢弃了。如果有理由让该包通过,就要建立规则来处理它。

    建立包过滤防火墙规则的例子如下:

    对来自专用网络的包,只允许来自内部地址的包通过,因为其他包包含不正确的包头部信息。这条规则可以防止网络内部的任何人通过欺骗性的源地址发起攻击。而且,如果黑客对专用网络内部的机器具有了不知从何得来的访问权,这种过滤方式可以阻止黑客从网络内部发起攻击。

    在公共网络,只允许目的地址为80端口的包通过。这条规则只允许传入的连接为Web连接。这条规则也允许与Web连接使用相同端口的连接,所以它并不是十分安全。

    丢弃从公共网络传入的包,而这些包都有你的网络内的源地址,从而减少IP欺骗性的攻击。

    丢弃包含源路由信息的包,以减少源路由攻击。要记住,在源路由攻击中,传入的包包含路由信息,它覆盖了包通过网络应采取得正常路由,可能会绕过已有的安全程序。

    2) 状态/动态检测防火墙

    状态/动态检测防火墙,试图跟踪通过防火墙的网络连接和包,这样防火墙就可以使用一组附加的标准,以确定是否允许和拒绝通信。它是在使用了基本包过滤防火墙的通信上应用一些技术来做到这点的。

    当包过滤防火墙见到一个网络包,包是孤立存在的。它没有防火墙所关心的历史或未来。允许和拒绝包的决定完全取决于包自身所包含的信息,如源地址、目的地址、端口号等。包中没有包含任何描述它在信息流中的位置的信息,则该包被认为是无状态的;它仅是存在而已。

    一个有状态包检查防火墙跟踪的不仅是包中包含的信息。为了跟踪包的状态,防火墙还记录有用的信息以帮助识别包,例如已有的网络连接、数据的传出请求等。

    例如,如果传入的包包含视频数据流,而防火墙可能已经记录了有关信息,是关于位于特定IP地址的应用程序最近向发出包的源地址请求视频信号的信息。如果传入的包是要传给发出请求的相同系统,防火墙进行匹配,包就可以被允许通过。

    一个状态/动态检测防火墙可截断所有传入的通信,而允许所有传出的通信。因为防火墙跟踪内部出去的请求,所有按要求传入的数据被允许通过,直到连接被关闭为止。只有未被请求的传入通信被截断。

    如果在防火墙内正运行一台服务器,配置就会变得稍微复杂一些,但状态包检查是很有力和适应性的技术。例如,可以将防火墙配置成只允许从特定端口进入的通信,只可传到特定服务器。如果正在运行Web服务器,防火墙只将80端口传入的通信发到指定的Web服务器。

    状态/动态检测防火墙可提供的其他一些额外的服务有:

    将某些类型的连接重定向到审核服务中去。例如,到专用Web服务器的连接,在Web服务器连接被允许之前,可能被发到SecutID服务器(用一次性口令来使用)。

    拒绝携带某些数据的网络通信,如带有附加可执行程序的传入电子消息,或包含ActiveX程序的Web页面。

    跟踪连接状态的方式取决于包通过防火墙的类型:

    TCP包。当建立起一个TCP连接时,通过的第一个包被标有包的SYN标志。通常情况下,防火墙丢弃所有外部的连接企图,除非已经建立起某条特定规则来处理它们。对内部的连接试图连到外部主机,防火墙注明连接包,允许响应及随后再两个系统之间的包,直到连接结束为止。在这种方式下,传入的包只有在它是响应一个已建立的连接时,才会被允许通过。

    UDP包。UDP包比TCP包简单,因为它们不包含任何连接或序列信息。它们只包含源地址、目的地址、校验和携带的数据。这种信息的缺乏使得防火墙确定包的合法性很困难,因为没有打开的连接可利用,以测试传入的包是否应被允许通过。可是,如果防火墙跟踪包的状态,就可以确定。对传入的包,若它所使用的地址和UDP包携带的协议与传出的连接请求匹配,该包就被允许通过。和TCP包一样,没有传入的UDP包会被允许通过,除非它是响应传出的请求或已经建立了指定的规则来处理它。对其他种类的包,情况和UDP包类似。防火墙仔细地跟踪传出的请求,记录下所使用的地址、协议和包的类型,然后对照保存过的信息核对传入的包,以确保这些包是被请求的。

    3) 应用程序代理防火墙

    应用程序代理防火墙实际上并不允许在它连接的网络之间直接通信。相反,它是接受来自内部网络特定用户应用程序的通信,然后建立于公共网络服务器单独的连接。网络内部的用户不直接与外部的服务器通信,所以服务器不能直接访问内部网的任何一部分。

    另外,如果不为特定的应用程序安装代理程序代码,这种服务是不会被支持的,不能建立任何连接。这种建立方式拒绝任何没有明确配置的连接,从而提供了额外的安全性和控制性。

    例如,一个用户的Web浏览器可能在80端口,但也经常可能是在1080端口,连接到了内部网络的HTTP代理防火墙。防火墙然后会接受这个连接请求,并把它转到所请求的Web服务器。

    这种连接和转移对该用户来说是透明的,因为它完全是由代理防火墙自动处理的。

    代理防火墙通常支持的一些常见的应用程序协议有:

    HTTP

    HTTPS/SSL

    SMTP

    POP3

    IMAP

    NNTP

    TELNET

    FTP

    IRC

    应用程序代理防火墙可以配置成允许来自内部网络的任何连接,它也可以配置成要求用户认证后才建立连接。要求认证的方式由只为已知的用户建立连接的这种限制,为安全性提供了额外的保证。如果网络受到危害,这个特征使得从内部发动攻击的可能性大大减少。

    4) NAT

    讨论到防火墙的主题,就一定要提到有一种路由器,尽管从技术上讲它根本不是防火墙。网络地址转换(NAT)协议将内部网络的多个IP地址转换到一个公共地址发到Internet上。

    NAT经常用于小型办公室、家庭等网络,多个用户分享单一的IP地址,并为Internet连接提供一些安全机制。

    当内部用户与一个公共主机通信时,NAT追踪是哪一个用户作的请求,修改传出的包,这样包就像是来自单一的公共IP地址,然后再打开连接。一旦建立了连接,在内部计算机和Web站点之间来回流动的通信就都是透明的了。

    当从公共网络传来一个未经请求的传入连接时,NAT有一套规则来决定如何处理它。如果没有事先定义好的规则,NAT只是简单的丢弃所有未经请求的传入连接,就像包过滤防火墙所做的那样。

    可是,就像对包过滤防火墙一样,你可以将NAT配置为接受某些特定端口传来的传入连接,并将它们送到一个特定的主机地址。

    5) 个人主机防火墙

    现在网络上流传着很多的个人防火墙软件,它是应用程序级的。主机防火墙是一种能够保护个人计算机系统安全的软件,它可以直接在用户的计算机上运行,使用与状态/动态检测防火墙相同的方式,保护一台计算机免受攻击。通常,这些防火墙是安装在计算机网络接口的较低级别上,使得它们可以监视传入传出网卡的所有网络通信。

    一旦安装上个人防火墙,就可以把它设置成"学习模式",这样的话,对遇到的每一种新的网络通信,个人防火墙都会提示用户一次,询问如何处理那种通信。然后个人防火墙便记住响应方式,并应用于以后遇到的相同那种网络通信。

    例如,如果用户已经安装了一台个人Web服务器,个人防火墙可能将第一个传入的Web连接作上标志,并询问用户是否允许它通过。用户可能允许所有的Web连接、来自某些特定IP地址范围的连接等,个人防火墙然后把这条规则应用于所有传入的Web连接。

    基本上,你可以将个人防火墙想象成在用户计算机上建立了一个虚拟网络接口。不再是计算机的操作系统直接通过网卡进行通信,而是以操作系统通过和个人防火墙对话,仔细检查网络通信,然后再通过网卡通信。

    6) Web应用防火墙

    Web应用防火墙是通过执行一系列针对HTTP/HTTPS的来专门为Web应用提供保护的一款产品,当WEB应用越来越为丰富的同时,WEB 服务器以其强大的计算能力、处理性能及蕴含的较高价值逐渐成为主要攻击目标。SQL注入、网页篡改、网页挂马等安全事件,频繁发生。因此诞生了针对这一些安全隐患的防火墙,与上述防火墙不同,WAF工作在应用层,因此对Web应用防护具有先天的技术优势。基于对Web应用业务和逻辑的深刻理解,WAF对来自Web应用程序客户端的各类请求进行内容检测和验证,确保其安全性与合法性,对非法的请求予以实时阻断,从而对各类网站站点进行有效防护。

    主要特点:

    WAF不仅仅只是防御Web的http访问,可以对Web应用做到全方位的立体防护。可以防范:

    · 常见的命令注入攻击,利用网页漏洞将含有操作系统或软件平台命令注入到网页访问语句中以盗取数据或后端服务器的控制权

    · SQL 注入,找到数据查询语句漏洞,通过数据库查询代码窃取或修改数据库中的数据

    · 跨站脚本攻击,利用网站漏洞攻击访问该站点的用户,用户登陆或认证信息;

    · 各种HTTP 协议攻击,利用http的协议漏洞进行攻击;

    · 机器人、 爬虫和扫描,通过机器人,爬虫,和扫描工具自动抓取网站数据以及对网站进行自动攻击;

    · 常见的应用程序配置错误 (如 Apache、 IIS 等),利用Web发布程序的配置漏洞或者已知bug进行攻击

    主要功能:

    ①防攻击:功能主要关注Web应用并试图入侵网络服务器的攻击事件过程。可以覆盖OWASP TOP 10、WASC、PCI DSS等标准,包括、、攻击等。

    ②防漏洞:可对网站中的敏感信息、服务器信息进行屏蔽或伪装,达到避免数据泄露的隐患。成功的攻击往往需要利用服务器的IP、操作系统信息、应用信息、服务器出错信息、数据库出错信息,KS-WAF接管所有返回给客户端的信息,并可中止会话,避免黑客利用敏感信息及服务器信息发动攻击、各类黑客入侵攻击。

    ③防挂马:随着监管部门的打击力度逐渐加强,挂马攻击的数量越来越少,与此同时,地下逐渐转向了。为了应对这个情况,KS-WAF系统内置了针对当前流行的暗链攻击建立的恶意指纹库,在服务器端已被植入暗链的情况下可准确识别并进行报警,协助管理员清除暗链代码。

    ④URL检测:通过实现URL级别的,对客户端请求进行检测,如果发现图片、文件等资源信息的来自于其它网站,则阻止请求,节省因盗用资源链接而消耗的带宽和性能。

    ⑤防爬虫:将爬虫行为分为搜索引擎爬虫及扫描程序爬虫,可屏蔽特定的搜索引擎爬虫节省带宽和性能,也可屏蔽扫描程序爬虫,避免网站被恶意抓取页面。

    ⑥防挂马:通过检查HTML页面中特征、用户提交数据,查看是否出现、Javascript引用挂马源URL及其他挂马特征以决定是否拦截请求。

    ⑦抗DDos:支持TCP Flood和HTTP Flood类型的拒绝服务攻击,通过简单有效的方式缓解拒绝服务攻击。

    ⑨攻击源定位:通过记录攻击者的源IP,进行分析和定位后,通过进行定位展现,帮助运维攻击来源。

    7) 下一代防火墙

    上面所述的几乎都是传统意义的防火墙,下一代是一款可以全面应对应用层威胁的高性能。通过深入洞察网络流量中的用户、应用和内容,并借助全新的高性能单路径异构并行处理,能够为用户提供有效的应用层一体化安全防护,帮助用户安全地开展业务并简化用户的架构。

    下一代防火墙和传统防火墙的区别:

    下一代防火墙是一款可以全面应对应用层威胁的高性能防火墙。通过深入洞察网络流量中的用户、应用和内容,并借助全新的高性能单路径异构并行处理引擎,能够为用户提供有效的应用层一体化安全防护,帮助用户安全地开展业务并简化用户的网络安全架构。

    传统防火墙功能:具有数据包过滤、网络地址转换(NAT)、协议状态检查以及VPN功能等功能。相对而言,下一代防火墙检测更加细。

    下一代防火墙自身属性:

    (1) 标准的第一代防火墙功能:具有、(NAT)、协议状态检查以及VPN功能等。

    (2) 集成式而非托管式网络入侵防御:支持基于漏洞的签名与基于威胁的签名。IPS与防火墙间的协作所获得的性能要远高于部件的叠加,如:提供推荐防火墙规则,以阻止持续某一载入IPS及有害流量的地址。这就证明,在下一代防火墙中,互相关联作用的是防火墙而非由操作人员在控制台制定与执行各种解决方案。高质量的集成式IPS引擎与签名也是下一代防火墙的主要特性。所谓集成可将诸多特性集合在一起,如:根据针对注入恶意软件网站的IPS检测向防火墙提供推荐阻止的地址。

    (3) 业务识别与全栈可视性:采用非端口与协议vs仅端口、协议与服务的方式,识别应用程序并在执行网络安全策略。

    (4) 超级智能的防火墙: 可收集防火墙外的各类信息,用于改进阻止决策,或作为优化阻止规则的基础。范例中还包括利用目录集成来强化根据用户身份实施的阻止或根据地址编制黑名单与白名单。

    (5) 支持新信息流与新技术的集成路径升级,以应对未来出现的各种威胁。

    下一代防火墙工作流程:

    数据包入站处理阶段

    入站主要完成数据包的接收及L2-L4层的数据包解析过程,并且根据解析结果决定是否需要进入处理流程,否则该数据包就会被丢弃。在这个过程中还会判断是否经过VPN,如果是,则会先进行解密后再做进一步解析。

    主引擎处理阶段

    主引擎处理大致会经历三个过程:策略匹配及创建会话、应用识别、内容检测。 创建会话信息。当数据包进入主引擎后,首先会进行会话查找,看是否存在该数据包相关的会话。如果存在,则会依据已经设定的策略进行匹配和对应。否则就需要创建会话。具体步骤简述为:进行转发相关的信息查找;而后进行NAT相关的查找;最后进行防火墙的策略查找,检查策略是否允许。如果允许则按照之前的建立对应的会话,如果不允许则丢弃该数据包。

    应用识别

    数据包进行完初始的防火墙匹配并创建对应会话信息后,会进行应用识别检测和处理,如果该应用为已经可识别的应用,则对此应用进行识别和标记并直接进入下一个处理流程。如果该应用为未识别应用,则需要进行应用识别子流程,对应用进行特征匹配,协议解码,行为分析等处理从而标记该应用。应用标记完成后,会查找对应的应用,如果策略允许则准备下一阶段流程;如果策略不允许,则直接丢弃。

    内容检测

    主引擎工作的最后一个流程为内容检测流程,主要是需要对数据包进行深层次的协议解码、内容解析、等操作,实现对数据包内容的完全解析;然后通过查找相对应的内容安全策略进行匹配,最后依据安全策略执行诸如:丢弃、报警、记录日志等动作。

    数据包出站处理阶段

    当数据包经过内容检测模块后,会进入出站处理流程。首先系统会路由等信息查找,然后执行QOS,IP数据包分片的操作,如果该数据走VPN通道的话,还需要通过VPN加密,最后进行数据转发。

    与统一策略的关系

    统一策略实际上是通过同一套安全策略将处于不同层级的安全模块有效地整合在一起,在策略匹配顺序及层次上实现系统智能匹配,其主要的目的是为了提供更好的。举个例子:有些产品HTTP的检测,URL过滤是通过代理模块做的,而其他协议的是用另外的引擎。 用户必须明白这些模块间的依赖关系,分别做出正确的购置才能达到需要的功能,而统一策略可以有效的解决上述问题。

    二、防火墙是否能阻挡住黑客攻击?

    答案:是否定的

    下面我就说说原由!!!

    首先传统防火墙的缺陷:

    1.传统防火墙的并发连接数限制容易导致拥塞或者溢出

    由于要判断、处理流经防火墙的每一个包,因此防火墙在某些流量大、并发请求多的情况下,很容易导致拥塞,成为整个网络的瓶颈影响性能。而当防火墙溢出的时候,整个防线就如同虚设,原本被禁止的连接也能从容通过了。

    2.传统防火墙对服务器合法开放的端口的攻击大多无法阻止

    某些情况下,攻击者利用服务器提供的服务进行缺陷攻击。例如利用开放了3389端口取得没打过sp补丁的win2k的超级权限、利用asp程序进行脚本攻击等。由于其行为在防火墙一级看来是"合理"和"合法"的,因此就被简单地放行了。

    3.传统防火墙对待内部主动发起连接的攻击一般无法阻止

    "外紧内松"是一般局域网络的特点。或许一道严密防守的防火墙内部的网络是一片混乱也有可能。通过社会工程学发送带木马的邮件、带木马的URL等方式,然后由中木马的机器主动对攻击者连接,将铁壁一样的防火墙瞬间破坏掉。另外,防火墙内部各主机间的攻击行为,防火墙也只有如旁观者一样冷视而爱莫能助。

    4.传统防火墙不处理病毒

    不管是funlove病毒也好,还是CIH也好。在内部网络用户下载外网的带毒文件的时候,防火墙是不为所动的(这里的防火墙不是指单机/企业级的杀毒软件中的实时监控功能,虽然它们不少都叫"病毒防火墙")。

    下一代防火墙:

    1.可以阻断网络攻击,但不能消灭攻击源。

    防火墙能够阻挡一定的网络攻击,但是无法清除攻击源。即使防火墙进行了良好的设置,使得攻击无法穿透防火墙,但各种攻击仍然会源源不断地向防火墙发出尝试。例如接主干网10M网络带宽的某站点,其日常流量中平均有512K左右是攻击行为。那么,即使成功设置了防火墙后,这512K的攻击流量依然不会有丝毫减少。

    2.不能抵抗最新的未设置策略的攻击漏洞

    就如杀毒软件与病毒一样,总是先出现病毒,杀毒软件经过分析出特征码后加入到病毒库内才能查杀。防火墙的各种策略,也是在该攻击方式经过专家分析后给出其特征进而设置的。如果世界上新发现某个主机漏洞的cracker的把第一个攻击对象选中了您的网络,那么防火墙也没有办法帮到您的。

    3.本身也会出现问题和受到攻击

    防火墙也是一个os,也有着其硬件系统和软件,因此依然有着漏洞和bug。所以其本身也可能受到攻击和出现软/硬件方面的故障。

    4.同样对待内网攻击也是无法完全抵御

    介绍了这么多,我相信大家应该也理解了,防火墙是入侵者进入的第一道安全防线,主要解决了经过防火墙的网络传播途径的部分入侵攻击问题,而通过物理传播途径,内网传播途径的攻击就会很难解决,因此本篇文章希望通过我的介绍让大家多了解防火墙这门安全技术和安全知识,提高咱们自身的信息安全意识,任何技术都有漏洞,有了漏洞必然就有机会攻克。所以我们需要拥有掌握技术的同时,更应该提高自身信息安全意识。

    比Python,JavaScript才是更适合写爬虫的语言。原因有如下三个方面:

    • JavaScript异步IO机制适用于爬虫这种IO密集型任务。JavaScript中的回调非常自然,使用异步网络请求能够充分利用CPU。
    • JavaScript中的jQuery毫无疑问是最强悍的HTML解析工具,使用JavaScript写爬虫能够减少学习负担和记忆负担。虽然Python中有PyQuery,但终究还是比不上jQuery自然。
    • 爬取结果多为JSON,JavaScript是最适合处理JSON的语言。

    一、任务:爬取用户在Github上的repo信息

    通过实例的方式学习爬虫是最好的方法,先定一个小目标:爬取github repo信息。入口URL如下,我们只需要一直点击next按钮就能够遍历到用户的所有repo。

    https://github.com/{{username}}?tab=repositories

    获取repo之后,可以做什么?

    • 统计用户最常使用的语言,统计用户语言使用分布情况统计用户所获取的star数,fork数

    二、爬虫双股剑:axios和jQuery

    axios是JavaScript中很常用的异步网络请求库,相比jQuery,它更轻量、更专业。既能够用于浏览器端,也可以用于Node。它的语法风格是promise形式的。在本任务中,只需要了解如下用法就足够了:

    axios.get(url).then((resp) => {
     请求成功,处理resp.data中的html数据
    }).catch((err) => {
     请求失败,错误处理
    })
    

    请求之后需要处理回复结果,处理回复结果的库当然是用jQuery。实际上,我们有更好的选择:cheerio。

    在node下,使用jQuery,需要使用jsdom库模拟一个window对象,这种方法效率较低,四个字形容就是:笨重稳妥。

    如下代码使用jQuery解析haha.html文件

    fs = require("fs")
    jquery=require('jquery')
    jsdom=require('jsdom') //fs.readFileSync()返回结果是一个buffer,相当于byte[] 
    html = fs.readFileSync('haha.html').toString('utf8') 
    dom= new jsdom.JSDOM(html) 
    $=jquery(dom.window) console.log($('h1'))
    

    cheerio只实现了jQuery中的DOM部分,相当于jQuery的一个子集。cheerio的语法和jQuery完全一致,在使用cheerio时,几乎感觉不到它和jQuery的差异。在解析HTML方面,毫无疑问,cheerio是更好的选择。如下代码使用cheerio解析haha.html文件。

    cheerio=require('cheerio')
    html=require('fs').readFileSync("haha.html").toString('utf8')
    $=cheerio.load(html)
    console.log($('h1'))
    

    只需20余行,便可实现简单的github爬虫,此爬虫只爬取了一页repo列表。

    var axios = require("axios")
    var cheerio = require("cheerio")
    axios.get("https://github.com/weiyinfu?tab=repositories").then(resp => {
     var $ = cheerio.load(resp.data)
     var lis = $("#user-repositories-list li")
     var repos = []
     for (var i = 0; i < lis.length; i++) {
     var li = lis.eq(i)
     var repo = {
     repoName: li.find("h3").text().trim(),
     repoUrl: li.find("h3 a").attr("href").trim(),
     repoDesc: li.find("p").text().trim(),
     language: li.find("[itemprop=programmingLanguage]").text().trim(),
     star: li.find(".muted-link.mr-3").eq(0).text().trim(),
     fork: li.find(".muted-link.mr-3").eq(1).text().trim(),
     forkedFrom: li.find(".f6.text-gray.mb-1 a").text().trim()
     }
     repos.push(repo)
     }
     console.log(repos)
    })
    

    三、更丰富的功能

    爬虫不是目的,而是达成目的的一种手段。获取数据也不是目的,从数据中提取统计信息并呈现给人才是最终目的。

    在github爬虫的基础上,我们可以扩展出更加丰富的功能:使用echarts等图表展示结果。

    要想让更多人使用此爬虫工具获取自己的github统计信息,就需要将做成一个网站的形式,通过搜索页面输入用户名,启动爬虫立即爬取github信息,然后使用echarts进行统计展示。网站肯定也要用js作为后端,这样才能和js爬虫无缝衔接,不然还要考虑跨语言调用。js后端有两大web框架express和koa,二者API非常相似,并无优劣之分,但express更加流行。

    如上设计有一处用户体验不佳的地方:当启动爬虫爬取github信息时,用户可能需要等待好几秒,这个过程不能让用户干等着。一种解决思路是:让用户看到爬虫爬取的进度或者爬取过程。可以通过websocket向用户推送爬取过程信息并在前端进行展示。展示时,使用类似控制台的界面进行展示。

    如何存储爬取到的数据呢?使用MongoDB或者文件都可以,最好实现两种存储方式,让系统的存储方式变得可配置。使用MongoDB时,用到js中的连接池框架generic-pool。

    整个项目用到的库包括:

    • express:后端框架
    • cheerio+axios:爬虫
    • ws:websocket展示爬取过程
    • webpack:打包工具
    • less:样式语言
    • echarts:图表展示
    • vue:模板渲染
    • jquery:DOM操作
    • mongodb:存储数据
    • generic-pool:数据库连接池

    试用地址:

    https://weiyinfu.cn/githubstatistic/search.html​

    案例地址:https://github.com/weiyinfu/GithubStatistic

    原文链接:https://zhuanlan.zhihu.com/p/53763115