原标题:反爬虫,到底是怎么回事儿?
有位被爬虫摧残的读者留言问:「网站经常被外面的爬虫程序骚扰怎么办,有什么方法可以阻止爬虫吗? 」
这是个好问题,自从 Python 火了起来,编写爬虫程序的门口越来越低,爬取别人网站数据也越来越猖獗。
阻止爬虫也就是我们这次要说的「反爬虫」,「反爬虫」涉及到的技术比较综合,说简单也简单,说复杂也复杂,看具体要做到哪种保护程度了。
下面我们说说常见的「反爬虫」技术。
一、前置知识
1. 动态网页和网页源码
传统的静态网页是指没有数据库和不可交互的纯 HTML 网页,它的页面生成后,如果不修改代码,网页的显示内容和显示效果基本上不会发生变化。
传统的动态网页是指在不改变页面 HTML 代码的情况下,能够根据不同用户或者不同操作而显示不同内容的网页。动态网页在开发、管理和交互性方面的优势远超静态网页。
在爬虫领域中,静态网页与动态网页的定义与传统定义是完全不同的。
静态网页指的是网页主体内容的渲染工作在服务器端完成,并通过响应正文返回的网页。
动态网页指的是主体内容或者全部内容都需要客户端执行 Java 代码来计算或渲染的网页。
网页源码,是指未经过浏览器解释和 Java 引擎渲染的文本,它的文本内容与 HTML 原文中的内容是相同的。
爬虫并不是一种“所见即所得”的程序,它通过网络请求的方式获取资源。在得到的资源中,最
重要的就是响应正文。但是由于 Python、 Java 和 PHP等编程语言没有 Java 解释器和渲染引擎,所以使用编程语言编写的爬虫程序无法渲染页面,它们只能爬取响应正文中的内容,也就是网页源代码中的内容。
如果想要爬取动动态网页中的数据,那么就需要借助 Java 解释器和渲染引擎将渲染后的网页代码以文本的形式传给爬虫。
有一些工具已经集成了渲染页面所需的组件,并且开放 API 允许编程语言操作页面以获取渲染后的页面代码。爬虫工程师常用的渲染工具如下。
Splash:异步的 Java 渲染服务。
Selenium:自动化测试框架。
Puppeteer:一个通过 DevTools 协议控制 Chrome 的 Node js库。
2. 爬虫
爬虫指的是按照一定规则自动抓取网络信息的程序,分为通用爬虫和聚焦爬虫两大类,前者的
目标是在保持一定内容质量的情况下爬取尽可能多的站点;而后者的目标则是在爬取少量站点的情况下尽可能保持精准的内容质量。
爬虫通常从一个或多个 URL 开始,在爬取的过程中不断将新的并且符合要求的 URL 放人待爬队列,直到满足程序的停止条件。
爬虫的的爬取过程可以分为下面3个步骤。
(1)请求指定的 URL 以获取响应正文。
(2)解析响应正文内容并从中提取所需信息。
(3)将上一步提