爬虫基础知识简介

作者: 刘星
日期: 2021年4月28日

网络爬虫(又被称为网页蜘蛛,网络机器人,在 FOAF 社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

简单来说,爬虫就是批量获取网页并提取和保存信息的自动化程序

一、为什么需要爬虫

日益发达的万维网上有着无数的网页,包含着海量的信息,无孔不入、森罗万象。很多时候我们需要提取这些有用的数据,然而这不是靠 Ctrl+cCtrl+v就能解决的。我们需要一个自动化的程序来解决这些重复动作,按照我们制定的规则去提取我么需要的内容。

我们可以发现信息自由的重要性

爬虫可以干什么?

可以看看逼乎上的问题:利用爬虫技术能做到哪些很酷很有趣很有用的事情?

链接:https://www.zhihu.com/question/27621722

二、爬虫是什么

简单来讲就是模仿浏览器来打开网页批量获取到我们需要的信息。这儿有个重点是批量获取。如果你还不知道浏览器是怎么打开网页的?那就有必要去补补了

参考:从输入 URL 到页面加载完成的过程中都发生了什么事情?

链接:http://fex.baidu.com/blog/2014/05/what-happen/

三、一个完整的爬虫

所以一个完整的爬虫一般会包含如下三个模块:

  • 网络请求模块
  • 爬取流程控制模块
  • 内容分析提取模块

市面上常见的都是爬虫都是 Python 写的,理论上来说,任何支持网络通信的语言都是可以写爬虫的,爬虫本身虽然语言关系不大,但是 Python 之类的语言用起来更顺手

3.1 发起网络请求

爬虫首先要做的工作就是获取网页,这里就是获取网页的源代码。源代码里包含了网页的部分有用信息,所以只要把源代码获取下来,就可以从中提取想要的信息了。所以,最关键的部分就是构造一个请求并发送给服务器,然后接收到响应并将其解析出来,我爬虫其实就是一堆的 http(s)请求,找到待爬取的链接,然后发送一个请求包,得到一个返回包。这一步的重点就是 url 、请求 header、body、 响应 herder、body。构造请求头,模拟请求(这儿也涉及到模拟登录,不具体讲解),获取到响应体,然后就是解析了。

3.2 爬取流程控制

所谓爬取流程,就是按照什么样的规则顺序去爬取。我们这种写着玩的小打小闹的爬虫,不必要考虑太多问题,但是涉及到大规模的抓取,一定要有良好的爬虫设计,这时就要考虑数据的结构,去重,并发,分布式等等来提高效率。

3.3 内容分析提取

我们请求到响应的内容后,就需要提取有效信息了。内容的分析提取方式有很多,如果我们能直接获取到 HTML,可以使用以下方法提取:

  • CSS 选择器:使用 cheeio 之类的库
  • XPATH:XPath 即为 XML 路径语言(XML Path Language),它是一种用来确定 XML 文档中某部分位置的语言
  • 正则表达式或普通字符串查找

如果说使用了 Ajax/Fetch 异步请求获取到数据,现在单页面应用发展的挺快,这也很常见。对于这种页面,分析的时候我们要跟踪所有的请求,观察数据到底是在哪一步加载进来的。然后当我们找到核心的异步请求的时候,就只需抓取到这个异步请求就可以了,然后就比较方便了。之前玩掘金的时候就发现掘金的文章列表的接口没做数量限制。哈哈哈,一次性就可以获取到全部文章……前两天看了下,掘金他们已经改了

四、常见反爬虫套路及应对

4.1 通过 Headers 反爬虫

从用户请求的 Headers 反爬虫是最常见的反爬虫策略。很多网站都会对 Headers 的 User-Agent 进行检测,还有一部分网站会对 Referer 进行检测。如果遇到了这类反爬虫机制,可以直接在爬虫中添加 Headers,将浏览器的 User-Agent 复制到爬虫的 Headers 中、将 Referer 值修改为目标网站域名。这类反爬虫很常见也很好对付

4.2 基于 IP 反爬虫

这是目前对爬虫最致命的招数。ip 限制有时并非是专门为了针对爬虫的,而大多数时候是出于网站安全原因针对 DOS 攻击的防御措施。这个虽然效果很好,但是其实有两个缺陷,一个是非常容易误伤普通用户,另一个就是 IP 不值钱,几十块钱甚至有可能买到几十万个 IP。

4.3 加密以及人机交互的反爬虫

有些网站把 ajax 请求的所有参数全部加密了,我们根本没办法构造自己所需要的数据的请求。有些网页往往需要和用户进行一些交互,进而才能走到下一步。这时候我们就可以使用 phantomJs 之类的无头浏览器了。用这几乎能绕过大多数的反爬虫机制,因为它不是在伪装成浏览器来获取数据,它本身就是浏览器,phantomJs 就是一个没有界面的浏览器,只是操控这个浏览器的不是人而是最适合做重复工作代码。

关于爬虫与反爬虫始终是: 道高一尺魔高一丈

本文介绍了爬虫的一些基本原理,这可以帮助我们更好地理解爬虫

文档信息

版权声明:署名-非商业性使用-禁止演绎 4.0 国际(CC BY-NC-ND 4.0)

原文链接:https://www.liuxing.io/blog/nodejs-crawler-intro/

发表日期:2021年04月28日


相关文章

Node 命令行工具开发【看段子】

Node 命令行工具开发【看段子】 你有没有上班想看笑话却又怕领导发现的经历?现在我们就用几十行代码写一个命令行看笑话段子的小程序,从此无需担心领导的视察。这篇文章和上一篇差不多都是命令行小工具开发,不过本篇更偏向于小爬虫的开发

2017年3月18日

最近更新

Curl 使用指南

Curl 是一个常用的命令行数据传输工具, 可以方便的从命令行创建网络请求

2021年5月04日

JavaScript 中的分号

JavaScript 代码到底加不加分号。本文带你了解 JavaScript 的分号自动插入机制,以及哪些情况必须加分号

2021年5月02日