01. 爬虫简介

1.1 网络数据采集概念

  • 网络数据采集指的就是爬虫程序,简称爬虫,也称为Spider蜘蛛程序。
  • 爬虫属于数据分析流程中第二部分“获取数据”的内容,主要用于自动化批量获取网上的既有数据。
    • 自动化:所谓自动化就是编程,让编程自动去完成一些工作。
    • 批量:假如就只需要获取一两条数据,那其实根本没有必要去写一个爬虫程序;爬虫重复常用来获取大量的数据。
    • 既有:爬虫只能用来获取网站中提供的数据,对于网站不提供的数据法律是不允许采集的。
      • 获取网站不提供的数据本质上不能被称为爬虫,而是一种渗透行为。未经许可的渗透行为都是违法的。
      • 除此之外,爬虫还有可能造成其他违法行为,如一次分布式爬虫把网站服务器爬瘫痪了,对网站公司的运营造成了损失,这就是一种违法行为。
      • 当然了,网站中提供的数据并不仅指页面中提供的数据;只要网站服务器中存在的数据,爬虫程序都可能有办法获取得到。
      • 爬虫合法性总结:爬虫程序本身的不违法的,但爬虫可能会造成一些违法的后果。因此,开发者一定要在合法的范围内使用爬虫程序。
  • 相对于人类正常上网获取数据而言,爬虫主要针对于批量、高效的数据获取,因此对于获取小量的数据而言,爬虫没有任何优势。

    1.2 爬虫程序工作的基本流程

  • 数据获取:模拟人类发起上网请求,并获取网页响应的数据(网页的数据由HTML进行组织)。

    • 补充:很多网站都会有反扒机制。当爬虫程序模拟的越像人,被反扒机制检测到的概率越低。
  • 数据提取:从HTML中提取出相关的数据,常用的提取方式有:正则表达式匹配、CSS选择器提取、XPath路径获取。
  • 数据存储:对获取到数据进行存储,常见的存储方式有:非文字(二进制存储),文字(Excel文件、CSV文件、数据库)。

    1.3 爬虫合法性探究

    1.3.1 爬虫可能文法

  • 爬虫这门技术本身在法律中是不被禁止的,但这门技术在使用过程中存在违法犯罪的风险。

  • 由于爬虫技术的发展和互联网法规的完善,近几年因爬虫程序面临牢狱之灾的开发者不在少数。因此在正式学习爬虫之前,了解相关的法律知识是十分有必要的。

    1.3.2 涉及违法犯罪行为的爬虫

  • 配合爬虫使用黑客技术对网站进行攻击行为。

  • 使用爬虫窃取网站未公开的、私密的、受到法律保护的数据。
  • 使用爬虫导致网站出现瘫痪、无法正常访问的情况。

    1.3.3 爬虫开发者如何避免违法犯罪

  • 数据脱敏:涉及到个人隐私的敏感数据(如网站用户的手机号码、身份证号码、邮箱地址、家庭住址等)以及涉及商业机密的数据不要爬,容易触碰法律的红线。

  • 不要公开招标:有些技术你可以用,但是不要拿到明面上来公开招标盈利,否则就可能犯罪。
    • 如之前有个很火的新闻,一个研究生用爬虫程序帮她女朋友抢HPV的九价疫苗。
    • 这本身没什么问题,但是这个研究生后续将这项技术公开招标,用收费帮人抢疫苗来盈利。
    • 这时那些没有抢到疫苗的人就把他举报了,因为他不仅打破了市场的公平,还以此盈利。
    • 再比如02. 基础爬虫技术 — 04. Cookie、JSON、XPath — 1.3 自动刷粉中介绍的自动批量刷粉丝,包括相关的刷评论、刷点赞这些生意其实都可以做,但是不能拿到明面上来做。因为这种程序说轻点那确实没什么,但要是往重了说,那属于控制舆论的行为了,因此一定要注意。
  • 不要响应企业的正常运转:这种情况尤其针对分布式多线程爬虫,一个多线程高并发的爬虫程序很容易会把网站的后台服务器爬崩溃,那人家企业是要靠这个网站来赚钱的,你的程序把人家的服务器爬崩溃了,那么由此造成的损失肯定要有你来负责。

    1.4 常见的爬扒机制

    1.4.1 反爬机制与反反爬策略

  • 一些门户网站通过相应的策略和技术手段,达到防止爬虫程序进行数据爬取的目的。

  • 这些阻止数据爬取的一些列手段就被称为反爬机制。
  • 反反爬策略与反爬机制是一套对立的程序。
  • 反反爬策略就是指爬虫程序通过一系列的技术手段,破解门户网站建立的爬虫机制,从而技术达到数据爬取的目的。

    1.4.2 robots协议

  • rebots协议是90年代就出现的一种反爬机制,它规定了网站中哪些内容是可以被爬取,哪些内容是不能够被爬取的。

  • rebots协议可以在主观上去遵守,也可以不遵守,直接无视。因此robots协议也被称为君子协议。(为了不引火烧身,建议开发者还是要遵守robots协议的)
  • robots协议的地址一般就是网站URL/robots.txt,以淘宝为例:
  • 在robots.txt中,Allow的内容是允许爬取的,Disallow的内容是不允许爬取的。
  • 补充:一个规范的网站应该有robots.txt协议,但是国内外大部分的小网站都没有这个协议(主要还是因为建站者不懂爬虫)。

    1.4.3 封IP

  • 出现原因:访问频率过快。

  • 解决方式一:比如爬一条数据,休眠一会,不要一下载爬几万条。
  • 解决方式二:有些网页会采用分页显示数据,可以增加一次请求的数据总量,降低请求的次数。
  • 解决方式三:使用代理服务器,更换IP地址。

    1.5 爬虫的分类

    1.5.1 通用爬虫

  • 是搜索引擎抓取系统的重要组成部分,如百度、谷歌等的搜索引擎都会有一套抓取系统(本质上就是一套通用爬虫)。

  • 通用爬虫的一大特性是其抓取的是互联网中一整张完整的页面数据。

    1.5.2 聚焦爬虫

  • 聚焦爬虫建立在通用爬虫之上。

  • 聚焦爬虫抓取的是页面中特定的局部内容,一般就是爬虫使用者所需要的数据。
  • 基本上的爬虫程序都是聚焦爬虫。

    1.5.3 增量式爬虫

  • 增量式爬虫用于检测网站中数据更新的情况。

  • 增量式爬虫只会抓取网站中最新更新出来的数据。

    1.5.4 暗网爬虫

  • 暗网爬虫可以是通用爬虫,也可以是聚焦爬虫,还可以是增量式爬虫。

  • 为什么把暗网爬虫独立出来呢?主要是因为它爬的领域比较特殊——暗网。
  • 平时我们能访问到的网络资源只占整个网络的4%,剩下的96%都是普通人无法访问到的,这96%的内容被称为暗网。

01. 爬虫网络知识基础 - 图1

  • 暗网是指隐藏的网络,普通网民无法通过常规手段搜索访问,需要使用一些特定的软件、配置或者授权等才能登录。
  • 由于暗网具有匿名性等特点,容易滋生以网络为勾联工具的各类违法犯罪。
  • 记者在中国裁判文书网上搜索显示,涉暗网的案件共有21例,涉及贩卖毒品、传播色情恐怖非法信息、侵害公民个人信息等犯罪行为。
    • 实际上涉暗网的案件可能远远不止21列,但是由于暗网加密等级极高,路由跳转极其复杂,所以溯源难度特别大,网警很难侦破。
    • 比特币为什么那么火那么珍贵,实际上也与暗网有着脱不开的关系。比特币的特点就是不好溯源,因此暗网中绝大多数的交易都通过比特币完成。
  • 普通人尽量不要去碰暗网,因为据说国家养了一批网络安全工程师在暗网中“钓鱼执法”,你想在暗网中干点什么坏事,可能直接就被抓起来了。所以哪怕你有进暗网的技术能力,也要做个遵纪守法的好公民。
  • 一般不是国家层面的工程师或项目,就不要去碰这个暗网爬虫了。

    02. 基本的网络概念

    2.1 客户端与服务器

  • 客户端:客户端就是供给用户使用的一端,最主要的作用就是对服务器发起请求,并组织与显示服务器响应的数据。

  • 服务端:主要用于存储网站的数据与响应客户端的请求。

    • 客户端中一般不会存储太多的数据,一个应用程序中的主要数据都是存储在后台服务器中的(即所谓的服务端)。
    • 在用户日常的上网行为中,会涉及到大量的前后端数据交互。当客户端需要哪些数据时,就会主动与服务器建立TCP连接,并发送数据请求。当服务器收到客户端的请求后,服务器会查找出所有客户端需要的数据,并发送给客户端。

      2.2 请求与响应

  • 请求:客户端连接服务器并向服务器传达需要哪些数据,这个过程叫做请求。

  • 响应:服务器把客户端请求的数据发送给客户端的过程称之为响应。

image.png

2.3 协议与请求

2.3.1 URL与协议

  • URL即统一资源定位符(Uniform Resource Locator),用于用字符串的形式表示网络中资源的具体位置(即定位网络资源)。
  • URL的格式为:

    1. 协议://服务器地址或域名:端口号/资源路径?参数#锚点
  • 协议(Schema)的基本概念:客户端和服务器之间传递数据需要遵守一定的规则,这种传输规则就称之为协议。

  • 参数:
    • 官方名称为查询参数,也有人称之为GET请求参数,因为一般来说只有HTTP/HTTPS协议中的GET请求会有这个东西。
    • 参数是以键值对的形式出现的,多个参数之间用与符号&连接:?Key0=Value0&Key1=Value1&……
  • 锚点(footer):常用于定位网页中的位置。(注意:只有当页面中存在锚点时才可以使用)

    2.3.2 常见的应用层协议

  • FTP(File Transfer Protocol):文件传输协议。FTP会使用两个TCP连接(需要开启TCP的21号端口来建立控制连接,20号端口来建立数据连接)。

  • HTTP(Hypertext Transfer Protocol):超文本传输协议(又称请求响应协议),HTTP协议使用80端口。
  • HTTPS(Hyper Text Transfer Protocol over SecureSocket Layer):在HTTP的基础上再加了一层SSL协议,即加密版的HTTP协议。
    • 现在一般的网站都会使用HTTPS协议,因为HTTPS用SSL协议进行加密,使得数据传输更加安全。
    • HTTPS协议使用443端口。
  • SSH(Secure Shell):安全外壳协议,连接Linux远程服务器一般都使用SSH协议。SSH协议使用的默认监听端口是22。

    2.3.3 GET/POST请求方式

  • 在网站中客户端向服务器发送请求时一般用的都是HTTP协议,HTTP协议中大概有十几种请求方法,如:GET、POST、PUT、PATCH、DELETE、HEAD、OPTIONS。

  • 而HTTP协议中最常见的两种请求方式就是GET和POST,而GET则是最最常见的。
  • GET请求简介:
    • GET请求转换成中文是获取的意思,常用于客户端想从服务器中获取某些数据的场景。
    • GET请求的特点:
      • GET的地址:服务器IP地址[+?+请求参数]
      • 请求参数的格式:key1=value&key2=value2&……&keyN=valueN
      • GET是明文传输的,不安全。
      • GET有长度限制,当表单值超过100个字符时,超出的部分会被丢弃。
      • GET不能发送非ASCII的值。
  • POST请求简介:

    • POST请求转换成中文是发送、上传的意思,常用于客户端向服务器提交一些数据的场景。
    • 如将数据交给服务器存储,将用户名、密码等交给服务器验证等涉及到隐私数据的场景就适合用POST。
    • POST请求的特点:
      • 提交后浏览器地址栏中只有服务器IP地址。
      • 相对于GET请求,数据安全(因为明文显示的只有服务器地址,请求参数不会显示出来)。
      • 理论上没有数据长度的限制(还是因为URL中没有明文显示请求参数)。

        2.3.4 IP地址与域名

  • 互联网中的终端设备是通过IP地址来标识的(服务器、个人PC、手机等都是终端设备)。

  • 客户端要与服务器通信,首先要相互知道对方在哪里,此时就可以用IP地址来唯一标识一台互联网中的设备。
  • IP地址分为IPv4地址(如201.23.193.53)和IPv6地址(如fe80::40e5:b3f9:6be6:9a8d%23)。
  • 不管那种版本的地址(尤其是IPv6),对人类来说都比较难以记忆,因此就出现了适合人类阅读基于的域名。
    • 百度的域名为:www.baidu.com,其对应的IP为36.152.44.95
  • 通过域名与网络中另一台设备通信时,网络首先会通过DNS服务器解析出域名对应的IP,再通过IP与目的设备进行通信。

    2.3.5 资源路径

  • 资源路径用于区分同一台网络设备中不同的网络资源。

  • 资源路径类似于一台计算机中不同的目录,同一台计算机中不同目录下存放的文件是不同的。
  • 与计算机一样,不同资源路径下访问到的网络资源是不一样的。

    2.4 HTTP协议

    2.4.1 HTTP协议介绍

  • HTTP(Hypertext Transfer Protocol)超文本传输协议(又称请求响应协议),是在网络中传输数据需要遵守的一系列规则。

  • 根据网络的不同阶段,HTTP协议可细分为HTTP请求协议和HTTP响应协议。

    2.4.2 HTTP协议请求

  • 在用户上网的过程中,浏览器给后台服务器发送的每一个请求都可以被监测到,监测方式:右键网页 >> 检查 >> Network(快捷键F12)。

  • 打开后,用搜索引擎发起一次搜索或者直接访问一个网络地址,就可以监测到这次HTTP请求。

image.png

  • 点击其中的一个网络资源,在点击Header就可以看到HTTP协议的相关内容(包括General、Response Headers、Requests Header)的详细信息,其中Requests Header就是HTTP请求信息。

image.png

  • HTTP请求由四部分组成:请求行、请求头、空行、请求体。
  • 如,在百度搜索链家,就会得到类似于以下的HTTP请求信息:

    • 请求行:GET /s HTTP/1.1
      • 请求方式:GET
      • 资源路径/s
      • 协议与版本号:HTTP/1.1
    • 请求头:以键值对的形式传递关于客户端的一些要求信息、标记信息,以及设备信息,如:
      • Accept:表示客户端可以接收的响应数据格式,如超文本文档(text/html)、xhtml+xml、xml等。
      • Accept-Encoding:表示客户端接受的响应数据压缩格式,如gzip压缩格式。
      • Accept-Language:表示客户端接受的数据语言,如zh-CN,zh表示接受中文数据。
      • Cookie:是客户端存储的一种标记状态,主要用于将Cookie值传递给服务器,帮助服务器进行一些验证操作的。
        • Cookie产生的原因是因为HTTP是无记忆的。Cookie是用户唯一标识,也可以用于数据存储。
        • 比如有些操作需要登录才能执行,但是HTTP无记忆,若没有Cookie,那么就算是用户已经登录过了,服务器也不会知道。
        • 有了Cookie,当用户登录成功时,服务器会通过Cookie把登录成功的标记响应给客户端,客户端再次发起请求时,就会携带这个已经登录的标记,此时服务器就知道该用户已经登录过了。
      • Host:服务器的IP地址或者域名。
      • User-Agent:用户代理,即客户端发送请求时的设备信息。如下是Windows 64位的操作系统,AppleWebKit的内核,Chrome浏览器。
      • Referer:上一个页面。比如用百度搜索英雄联盟,然后进入LOL的官网,那么此时Referer的值就可能为https://www.baidu.com/。
    • 空行:用于分割请求头和请求体。
    • 请求体(GET是没有的,只有POST有):比如某个用户在使用某个社交软件时要上传一个头像,那么这个头像就会被放在请求体中。
      1. GET /s HTTP/1.1
      2. Accept: text/html,application/xhtml+xml,application/xml;q=0.9
      3. Accept-Encoding: gzip, deflate, br
      4. Accept-Language: zh-CN,zh;q=0.9
      5. Cache-Control: max-age=0
      6. Connection: keep-alive
      7. Cookie: BAIDUID=11C1A8285A5C0B0901925F7543C44DBE:FG=1; BIDUPSID=11C1A8285A5C0B09A47060DDD6834684; PSTM=1636856773; BD_UPN=12314753
      8. Host: www.baidu.com
      9. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.67 Safari/537.36
  • 补充,完整抓取请求头的流程:F12 >> Netch >> All >> 刷新页面 >> 点击网络资源 >> Headers >> Request Headers >> View source。

    2.4.3 HTTP协议响应

  • Header中的Response Headers就是HTTP响应信息。

  • HTTP响应也由响应行、响应头、空行、响应体这四部分组成。如百度搜索链家的HTTP响应信息:
    • 响应行:
      • 协议及其版本号:HTTP/1.1
      • 响应状态码:200
      • 响应状态码的描述信息:200
    • 响应头:以键值对的形式描述响应的信息与一些返回标记。
      • Content-Encoding:响应数据的压缩方式。
      • Content-Type:响应数据的数据类型。
      • Date:响应时间。
      • Set-Cookie:服务器返回的Cookie标记,让客户端进行存储。
    • 空行:分割响应头和响应体。
    • 响应体:服务器正对于HTTP请求响应给客户端的实际数据。 ```bash HTTP/1.1 200 OK Content-Encoding: br Content-Type: text/html;charset=utf-8 Date: Fri, 20 May 2022 03:00:20 GMT Server: BWS/1.1 Set-Cookie: delPer=0; path=/; domain=.baidu.com Set-Cookie: BD_CK_SAM=1;path=/

html文档 ```

2.4.4 常见的HTTP响应码

  • 常见的HTTP网络请求响应状态码可以分为几个大类:2XX(成功)、3XX(重定向)、4XX(客户端错误)、5XX(服务器错误)。
  • 常见的HTTP网络请求响应状态码有:

    • 200:表示数据响应成功。(最好的,最期望的状态)
    • 302/303:表示服务器请求重定向,即一开始请求A路径,服务器将请求改到B路径。(一般来说也和200一样可以正常拿到数据)
    • 403:表示请求资源禁止访问。
    • 404:表示请求资源不存在。
    • 418:描述信息为“I am a tea pot.”,即“我是一直茶壶”,一般表示爬虫被发现了,不想给你响应数据,开始驴头不对马嘴。
    • 500:表示服务器崩溃(无法成功连接服务器)。

      03. 浏览器调试工具

  • 浏览器调试工具可以在浏览器中按快捷键F12打开。

    3.1 鼠标小手

  • 在浏览器调试工具左上角处有一个鼠标小手工具,可以用来定位元素在页面中的位置。

image.png

  • 这个工具用于在页面中选择一个元素并检查它(查看它的源码以及其他相关信息)。

image.png

3.2 Elements元素界面

  • Elements页面中有整个网页的源码,以及网页中每个元素的相关信息(如CSS、事件监听器等)

image.png

  • 注意:

    • elements中的网页代码并不一定是网站的原始代码。
    • 像一些JS页面,elements中显示的都是JS代码经过浏览器渲染的网页代码。

      3.3 Console控制台界面

  • Console是一个控制台,是命令行工具。

  • 在console中可以输入JavaScript代码,并以交互式的形式执行。

image.png

3.4 Source原始资源界面

  • 网页的原始内容(包括网页的工程源码以及网页中的各种资源)。

image.png

3.5 Network网络映像界面

  • 浏览器中的所有的网络请求映像、响应映像都会被记录在这里。

image.png

  • Network可以当作一个网站的抓包工具来使用。