爬虫基础
所谓网络爬虫就是一个程序,通过模拟人类访问互联网的形式,不停地从网络上抓取我们需要的数据。听起来很神奇的样子,其实你只要了解了一些 Web 的基础知识,就会很容易理解它的工作方式。
人们正常访问互联网是通过浏览器,或者说是通过图形化界面,靠鼠标点点点。如果说把浏览器比做 windows 系统的话,爬虫更像是 Linux ,它更加注重终端的使用,我们的代码就像 shell 脚本一样。其实两种系统对于不同的场合各有优势,对于那种需要对大量相似对象进行同样操作的时候,使用代码似乎更容易一些。
1. 浏览器访问页面的方式
既然爬虫是模仿浏览器访问互联网的形式,那我们先来看看浏览器是如何访问互联网的。
首先我们需要了解一些基本的概念:
- URL:统一资源定位符(英语UniformResourceLocator的缩写)俗称为网址,网址格式为:
<协议>://<服务器域名或IP>:<服务器端口>/<访问资源的路径>/?<发送给服务器的数据>/#<锚点位置>。
<协议>://<域名或IP>是必需的,<端口>/<路径>有时可省略。 - IP地址:每个连接到Internet上的主机都会分配一个IP地址,IP地址是用来唯一标识互联网上计算机的逻辑地址,机器之间的访问就是通过IP地址来进行的。IP地址采用二进制的形式表示的话很长,比较麻烦,为了便于使用,IP地址经常被写成十进制的形式,用“.”分开,叫做“点分十进制表示法”,如:127.0.0.1。
- 域名:IP地址毕竟是数字标识,使用时不好记忆和书写,因此在IP地址的基础上又发展出一种符号化的地址方案,来代替数字型的IP地址。每一个符号化的地址都与特定的IP地址对应。这个与网络上的数字型IP地址相对应的字符型地址,就被称为域名。目前域名已经成为互联网品牌、网上商标保护必备的要素之一,除了识别功能外,还有引导、宣传等作用。如:www.neuq.edu.cn
- DNS:在Internet上域名与IP地址之间是一对一(或者多对一)的,域名虽然便于人们记忆,但机器之间只能互相认识IP地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,DNS就是进行域名解析的服务器。域名的最终指向是IP。
这部分知识引用自 Paranoidyang 的博客。
首先浏览器通过 DNS 服务器获取到 ip 地址,然后通过 ip 地址请求页面,服务器接收到请求,返回相应的页面,所谓页面就是Html js css jpj文件,这些文件详细的说明了网页到底应该长成什么样子,浏览器根据这些文件渲染出我们看到的网页。
2. 请求头
我们详细说一下刚刚提到的浏览器通过 ip 地址请求页面的过程。当web浏览器与web服务器建立连接之后(TCP连接)首先发送请求头,然后发送相关数据。其中请求头中包含一些浏览器的数据,常见的包括:
- Host (主机和端口号)
- Connection (链接类型)
- User-Agent (浏览器名称)
- Accept (传输文件类型)
- Referer (页面跳转处)
- Accept-Encoding (文件编解码格式)
- Cookie (Cookie)
- x-requested-with (XMLHttpRequest Ajax 异步请求)
我们可以在浏览器上右键点击检查,然后点击下图的三个按钮,刷新页面查看某个请求的请求头。
3. 请求方法与状态码
在上面的图片中还有一个 Request Method 和 Status Code 它们就是请求方法和状态码。
请求方法有以下六种,我们主要使用 GET 和 POST 方法。
当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。
下面是常见的HTTP状态码:
- 200 - 请求成功
- 301 - 资源(网页等)被永久转移到其它URL
- 404 - 请求的资源(网页等)不存在
- 500 - 内部服务器错误
4. 字符与字符集
字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。(只有一个哦)
字符集是多个字符的集合。字符集包括 ASCII字符集、GB2312字符集、GB18030字符集、Unicode 字符集等。
ASCII 编码是一个字节,而 Unicode 编码是两个字节。
UTF-8 是 Unicode 的实现方式之一,UTF-8 是一种变长的编码方式,可以是1,2,3 个字节。
在网络传输的时候,互联网的数据都是以二进制的方式传输的,在 python 中对应的数据类型是 bytes。
而我们常见的字符串 str 是 Unicode的呈现形式。