爬虫基础

Http基本原理

URI和URL

  URI全称:Uniform Resource Identifier,即统一资源标志符;URL的全称为Uniform Resource Locator,即统一资源定位符。举例:https://github.com/favicon.ico 既是一个URI,也是一个URL。即有favicon.ico这样一个图标资源,我们用URI/URL指定了访问它的唯一方式,其中包括https、访问路径(根目录)和资源名称。通过这样一个链接,就可以从互联网中找到某个资源,这个链接就是URI/URL。
  URL是URI的子集。除了URL,URI还包括一个子类,是URN(Uniform Resource Name),即统一资源名称。URN只为资源命名,而不指定如何定位资源。
  URL基本格式:
scheme://[username:password@]hostname[:port][/path][;parameters][?query][#fragment] 其中,中括号包括的内容代表非必要部分,如 https://www.baidu.com 这个URL,这里只包含了scheme、hostname两部分,没有part、parameters、query、fragment。

  • scheme:协议。常见协议有http、https、ftp等,另外scheme也被称作protocol,都代表协议的意思。

  • username、passward: 用户名和密码。某些情况下URL需要提供用户名和密码才能访问,这时候把用户名和密码放在host前面。如https://ssr3.scrape.center 这个URL需要用户名和密码才能访问,直接写为https://admin:admin@ssr3.scrape.center 就能直接访问。

  • hostname:主机地址。可以是域名或IP地址,比如https://www.baidu.com这个URL中的hostname就是www.baidu.com,这就是百度的二级域名。比如https://8.8.8.8,这个URL中的hostname,它是一个IP地址。

  • port:端口。这是服务器设定的服务端口,比如https://8.8.8.8:12345,这个URL中的端口就是12345。但是有些URL中没有端口信息,使用了默认端口。http协议的默认端口是80,https协议的默认端口是443。所以 https://www.baidu.com 其实相当于https://www.baidu.com:443, http://www.baidu.com 相当于http://www.baidu.com:80

  • path:路径。指的是网络资源在服务器中的指定地址,比如 https://github.com/favicon.ico中的path就是 favicon.ico ,指的是访问Github根目录下的favicon.ico。

  • paremeters:参数。用来指定访问某个资源时的附加信息,比如https://8.8.8.8:12345/hello;user中的user就是parameters。但是parameters现在用的少,很多人把参数后面的query部分称为参数,甚至把parameters和query混用。严格来说,parameters是;后面的部分。

  • query: 查询。用于查询某类资源,如果有多个查询用&隔开。query很常见,比如https://www.baidu.com/s?wd=nba&ie=utf-8 ,其中query部分就是wd=nba&ie=utf-8,这里指定了wd是nba,ie是utf-8。我们平时见到的参数、GET请求参数、parameters、params等称呼多情况指代的也是query。

  • fragment: 片段。它是对资源描述的部分补充,可以理解为资源内部的书签。有两个主要应用,一个是单页面路由,如前端框架Vue、Reat都可以借助它来做到路由管理;另一个是坐HTML锚点,用它控制一个页面打开时自动下滑滚动到某个特定位置。

HTTP和HTTPS

  HTTP:超文本传输协议,其作用是把超文本数据从网络传输到本地浏览器,能够保证高效而准确地传输超文本文档。

  HTTPS:是以安全为目标的HTTP通道,简单讲就是HTTP安全版,即在HTTP下加入SSL层,简称HTTPS。
  HTTPS的安全基础是SSL,因此通过该协议传输的内容都是经过SSL加密的,SSL的主要作用有:

  • 建立安全通道,保证数据传输的安全性。
  • 确认网站的真实性。凡是使用了HTTPS协议的网站,都可以通过单击浏览器地址栏的锁头标志来查看网站认证之后的真实信息,此外还可以通过VA机构颁发的安全签章来查询。

  HTTP和HTTPS协议都属于计算机网络中的应用层协议,其下层是基于TCP协议实现的,TCP协议属于计算机网络中的传输层协议,包括建立连接时的三次握手和断开时四次挥手等过程。

HTTP请求过程

  在浏览器地址栏中输入一个URL,按下回车即可看到对应网页内容。这个过程是浏览器先向网站所在的服务器发送一个请求,网站服务器接收到请求后对其进行处理和解析,然后返回对应的相应,接着传回浏览器。由于响应里包含页面源代码内容,浏览器再对其进行解析,将网页呈现出来。
  使用Chrome浏览器开发者模式下的Network监听组件来演示。Network监听组件可以在访问当前请求的网页时,显示产生的所有网络请求和响应。
  打开浏览器,访问百度,单击鼠标右键选择“检查”菜单或者直接快捷键F12,打开浏览器的开发者工具。
  切换到Network面板,重新刷新页面,就可以看到在Network面板下出现很多条目,每一个条目代表依次发送请求和接收响应的过程。

  观察第一个网络请求www.baidu.com,各列含义:

  • Name:请求的名称。一般用URL的最后一部分内容作为名称。
  • Status: 响应状态码。这里显示200,代表响应是正常的。通过状态码判断发送请求之后是否得到正常响应。
  • Type: 请求的文档类型。document代表这次请求的是一个HTML文档,内容是一些HTML代码。
  • Initiator: 请求源。标记请求是由哪个对象或进程发起的。
  • Size: 从服务器下载的文件或请求的资源的大小。如果资源是从缓存中取得到的,则会显示memory cache(内存缓存)/disk cache(磁盘缓存)。
  • Time: 从发起请求到获取响应所花的总时间。
  • Waterfall: 网络请求的可视化瀑布流。
      单击www.baidu.com看详细信息

      首先是General部分,其中RequestURL为请求的URL,Request Method为请求的方法,Status Code是响应状态码,Remote Address是远程服务器的地址和端口,Referrer Policy为Referrer判别策略。
      往下有Response Headers和Request Headers,分别代表响应头和请求头。请求头包含许多请求信息,如浏览器标识、Cookie、Host等信息,服务器根据请求头的信息判断请求是否合法,做出响应。响应头是响应的一部分,其中包含服务器的类型、文档类型、日期等信息,浏览器在接收到响应后,对其进行解析,呈现网页内容。

请求

  请求,英文为Request,由客户端发往服务器,分为四部分:请求方法、请求网址、请求头、请求体。

  • 请求方法
    标识请求客户端请求服务端的方式,常见的有两种:GET和POST。
    在浏览器中直接输入URL并回车,便发起了GET请求,请求的参数会直接包含到URL里,例如我们搜索Python,就是一个GET请求,链接为https://www.baidu.com/s?wd=Python URL里包含了请求的query信息,这里的wd标识要搜寻的关键字。
    POST请求大多在提交表单时发起,如登录表单,输入用户名和密码后,单击“登录”,通常发起的就是POST请求,其数据通常以表单形式传输,而不会体现在URL中。
    Get请求和POST请求的区别:
    Get请求中的参数包含在URL里面,数据可以在URL中看到;而POST请求的URL不会包含这些数据,数据都是用过表单形式传输的,会包含在请求体中。
    登录时一般要提交用户名和密码,其中密码是敏感信息,使用GET方式请求,密码会暴露在URL里面,造成密码泄露,这时最好使用POST方式发送。上传文件时,由于文件内容比较大,也会选用POST方式。

请求方法

方法 描述
GET 请求页面,并返回页面内容
HEAD 类似GET,不过返回的响应中没有具体内容。用于获取报头
POST 大多用于提交表单或上传文件,数据包含在请求体中
PUT 用客户端传向服务器的数据取代指定文档中的内容
DELETE 请求服务器删除指定的页面
CONNECT 把服务器当跳板,让服务器代替客户端访问其他网页
OPTIONS 允许客户端查看服务器的性能
TRACE 回显服务器收到的请求。主要用于测试或诊断
  • 请求的网址
    URL,它可以唯一确定客户端想要请求的资源。
  • 请求头
    用来说明服务器要使用的附加信息,重要的有:Cookie、Referer、User-Agent等。
    Accept: 请求报头域,用于指定客户端可接受哪些类型的信息。
    Accept-Language: 用于指定客户都拿可接受的语言类型。
    Accept-Encoding: 用于指定客户端可接受的内容编码。
    Host: 指定请求资源的主机IP和端口号,其内容为请求URL的原始服务器或网关位置。
    Cookie: 网站为了辨别用户,进行会话跟踪而存储在用户本地的数据。主要功能是维持当前访问会话。
    Referer: 标识请求是从哪个页面发过来的,服务器可以拿到这一信息并做相应的处理,如源统计、防盗链处理。
    User-Agent: 简称UA,特殊字符串头,可以使服务器识别客户端使用的操作系统及版本、浏览器及版本信息。
    Content-Type: 用它来表示具体请求中的媒体类型信息。
  • 请求体
    一般承载的内容是POST请求中的表单数据,对于GET请求,请求体为空。
    如登录Github时捕获的响应

    登录前,要填写用户名和密码信息,登陆时将这些内容以表单数据的形式提交给服务器,要注意Content-Type为application/x-www-form-urlencoded,只有这样设置Content-Type,内容才会以表单数据形式提交。也可以将Content-Type设置为application/json来提交json数据,或者设置为multipart/form-data来上传文件。

    Content-Type和POST提交数据方式的关系
COntent-Type POST提交数据的方式
application/x-www-form-urlencoded 表单数据
multipart/form-data 表单文件上传
application/json 序列化json数据
text/xml XML数据

构造POST请求需要使用正确的Content-Type,并了解设置各种请求库的各个参数时使用的是哪种Content-Type。

响应

  • 响应状态码
    由服务器返回给客户端,可以分为三部分:响应状态码、响应头、和响应体。
    响应状态码,表示服务器的响应状态,如200代表服务器正常相应、404代表页面未找到、500嗲表服务器内部发生错误。
  • 响应头
    包含服务器对请求的应答信息。
    Date: 用于标识响应产生的时间。
    Last-Modified: 用于指定响应资源的最后修改时间。
    Content-Encoding: 用于指定响应内容的编码。
    Server: 包含服务器的信息,例如名称、版本号。
    Content-Type: 文档类型,指定返回的数据是什么类型
    Set-Cookie: 设置Cookie。响应头中的Set-Cookie用于告诉浏览器需要将此内容放在Cookie中,下次请求时将Cookie携带上。
    Expires:用于指定响应的过期时间,可以让代理服务器或浏览器将加载的 内容更新到缓存中。再次访问相同内容时就可以直接从缓存中加载,降低服务器负担,缩短加载时间。
  • 响应体
    响应的正文数据都存在于响应体中。爬虫请求网页时,要解析的就是响应体数据。

爬虫基本原理

爬虫就是获取网页并提取和保存信息的自动化程序。

  • 获取网页
    获取网页源代码,源代码里包含网页的部分有用信息,获取源代码就能从中提取有用信息。
    我们要做的就是构造一个请求并发送给服务器,然后接收到响应并对其进行解析。
    Python提供了许多库,如urllib、requests等,我们可以用这些库来完成HTTP请求操作。除此之外,请求和响应都可以用类库提供的数据结构来表示,得到相应后只需要解析数据结构中的body部分,即可看到网页的源代码。
  • 提取信息
    获取网页源代码后,接下来就是分析源代码,从中提取想要的数据。最常用的是正则表达式,构造正则表达式的过程比较负责且易出错。
    由于网页结构具有一定的规则,还有一些库是根据网页节点属性、CSS选择器或者XPath来提取网页信息的,如:Beautiful Soup、pyquery、lxml等,使用这些库,可以高效地从源代码中提取网页信息。
  • 保存数据
    保存数据的形式多种多样,可以简单保存为TXT文本或JSON文本,也可以保存到数据库,如MySQL或MongoDB,还有远程服务器。