网络爬虫抓取数据的过程可以理解为模拟浏览器浏览页面的过程,我们有必要了解浏览器浏览页面的基本过程。
例如,在浏览器地址栏输入网址http://www.baidu.com,按下回车键后会在浏览器中显示百度的首页。
那么,这段网络访问过程中到底发生了什么?
简单来说,浏览网页的过程可分为以下四个步骤:
www.baidu.com)对应的IP地址;
URL是互联网上标准资源的地址 (网址),它包含了文件的位置以及浏览器处理方式等信息。

URL地址由 协议头 、服务器地址、文件路径 三部分组成。

协议头指定使用的传输协议,用于告诉浏览器如何处理将要打开的文件。
不同的协议表示不同的资源查找方式及传输方式,网络上常使用的协议如下:
(计算机网络知识)
| 常见协议 | 代表类型 | 示例 |
|---|---|---|
| file | 访问本地计算机的资源 | file:///Users/itcast/Deskktop/basic.html |
| ftp | 访问共享主机的文件资源 | ftp://ftp.baidu.com/movies |
| http | 超文本传输协议,访问远程网络资源 | http://image.baidu.com/channel/wallpaper |
| https | 安全的ssi加密传输协议,访问远程网络资源 | https://image.baidu.com/channel/wallpaper |
| mailto | 访问电子邮件地址 | mailto:null@itcast.cn |
其中最常用的是HTTP协议和HTTPS协议。
服务器地址指存放资源的服务器的主机名或者IP地址,其目的在于表示互联网上的唯一一台计算机,通过这个地址来找到这台计算机。
IP地址被用来给Internet上每台电脑一个编号,但是IP地址不容易记忆,而且服务器的物理IP地址有可能发生改变。为此,人们又发明了域名来替代IP地址访问服务器的网站。
例如,使用百度公司所在的IP地址http://180.97.33.107 可以打开百度的首页,但是这个地址不容易记忆,不如使用域名网站www.baidu.com 。
端口是在地址后冒号后面的数字,用于识别在一台计算机上运行的不同程序。
每个网络程序都对应一个或多个特定的端口号,例如HTTP程序的默认端口号为 80 , HTTPS程序的默认端口号是 443 (默认端口号是不用输入的,例如:www.baidu.com)
路径是有 0 或多个" / " 符号隔开的字符串,一般用于指定本次请求的资源在服务器中的位置。
DNS 是 计算机域名系统(Domain Name System或Domain Name Service)的缩写,由解析器和域名服务器组成。

计算机域名系统DNS ,它可以把域名转化为对应的IP地址,域名服务器保存该网络中所有的主机域名和对应的IP地址,并具有将域名转化为IP地址的功能。
一个域名必须对应一个IP一个IP可以对应多个域名即一个IP地址可能没有申请域名,也可能对应多个域名。


浏览器显示完整网页的过程:
当用户在浏览器的地址栏中输入一个URL地址并按回车键之后,浏览器会向HTTP服务器发送HTTP请求。常用的HTTP请求包括 Get 和 Post两种方式。
例如,当我哦们在浏览器输入:http:// www.baidu.com 的时候,浏览器发送一个Request请求去获取 http:// www.baidu.co 的HTML 文件,web服务器把包含了该文件内容的Response发送回浏览器。
浏览器分析Response对象中的文件内容,反向其中引用了其他文件,包括Images文件、CSS文件、JS文件等。浏览器会自动再次发送Request去获取这些图片,CSS文件,或者JS文件。
但所有文件都下载成功后,浏览器会根据HTML语法结构,将网页完整的显示出来。

客户端发送一个HTTP请求到服务器的请求消息,由请求行、请求头部、空行、以及请求数据这四个部分组成。

不同的HTTP版本下使用的请求方法也不同。

最常用的请求方法是GET 和 post ,两者的区别在于:
结合典型的 HTTP 请求示例,介绍HTTP 请求消息中的组成内容,如下:

Headers - Request Headers - View source



| 请求头 | 说明 |
|---|---|
| Host(主机和端口号) | 指定被请求资源的Internet 主机和端口号,对应网址URL中的Web名称和端口号,通常属于URL的Host部分。 |
| Connection(连接类型) | 表示客户端与服务器的连接类型 |
| Upgrade-Insecure-Requests(升级为HTTPS请求) | 表示升级不安全的请求,意思是会在加载 HTTP 资源时自动替换成 HTTPS 请求,让浏览器不在显示 HTTPS 页面中的 HTTP 请求警报 |
User- Agent(浏览器名称) | 表示客户端身份的名称,通常页面会根据不同 User - Agent 信息自动做出适配,甚至返回不同的响应内容。 |
| Accept(传输文件类型) | 指浏览器或其他客户端可以接受的 MIME(multipurpose internet mail extensions, 多用途互联网邮件扩展)文件类型,服务器可以根据它判断并返回适当的文件格式。 |
Referer(页面跳转来源) | 表明产生请求的网页来自于哪个URL,用户是从该Referer页面访问到当前请求页面。(服务器反爬虫) |
| Accept - Encoding(文件编码解码格式) | 指出浏览器可以接收的编码方式。编码方式不用于文件格式,它的作用是压缩文件并加送文件传递速度。 |
| Accept - Language(语言种类) | 指出浏览器可以接收语言种类,如 en 或 en-us 指英语,zh 或 zh-cn 指中文,当服务器能够提供一种以上的语言版本时要用到。 |
| A ccept - Charset (字符编码) | 指浏览器可以接收的字符编码。 |
Cookie(cookie) | 浏览器用这个属性向服务发送 Cookie 。cookie是在浏览器汇总寄存的小型数据体,它可以记载和服务行管的用户信息,也可以用来实现模拟登陆。 |
| Content - Type(post数据类型) | 指定POST 请求里来表示的内容类型。 |
HTTP 响应由四个组成部分,分别是:状态行、响应报头、空行以及响应正文。

Headers - Response Headers - View source

理论上所有的响应头信息都应该是回应请求头的。但是服务器端为了效率和安全,还有其他方面的考虑,会添加对应的响应头信息。常用的响应报头和取值如下所示。
| 响应报头 | 说明 |
|---|---|
| Cache - Control : must-revalidate,no-cahce,private | 这个报头值告诉客户端,服务端不希望客户端缓存资源,在下次请求资源时,必须要重新请求服务器,不能从缓存副本中获取资源。Cache-Control是响应头中很重要的信息,当客户端请求头中包含 Cache-Control:max-age=0请求,明确表示不会缓存服务器资源时,Cache-Control作为回应信息,通常会返回 no- cache,意思是说:“那就不缓存呗” 。当客户端字啊请求头中没有包含 Cache-Control时,服务器端往往会根据不同的资源指定不用的缓存策略,比如oschina 再缓存图片资源的策略就是Cache-Control:max-age=86400,这个意思是从当前时间开始,在86400秒的时间内,客户端可以直接从缓存副本中读取资源,而不需要向服务器端请求。 |
| Connection : keep-alive | 该报头回应客户端的Connection keep-alive,告诉客户端服务器的 TCP 链接也是一个长连接,客户端可以继续使用这个 TCP 连接发送 HTTP 请求。 |
| Content-Encoding:gzip | 该报头的取值告诉客户端,服务器发送的资源是采用gzip编码的,客户端看到这个信息后,应该采用gzip对资源进行解码 |
| Content-Type :text/html;charset=UTF-8 | 这个报头值告诉客户端,资源文件类型,还有字符编码。客户端需要使用UTF-8格式对资源进行解码,然后对资源进行HTML解析。通常我们会看到有些网站出现乱码,往往就是服务器端没有返回正确的编码。 |
| Date : Sun,21 Sep 2014 06:18:21 GMT | 该报头表示服务器端发送资源时的服务器时间,GMT是格林尼治所在地的标准时间。HTTP协议中发送的时间都是GMT的。这主要是解决在互联网上不同时区在相互请求资源时候的时间混乱问题。 |
| Expires : Sun,1 an 2000 01:00:00 GMT | 这个响应报头也是跟缓存有关的,告诉客户端在这个时间前,可以直接访问缓存副本。很显然这个值可能存在问题,因为客户端和服务器的时间不一定相同的,如果时间不同就会导致问题。所以这个响应报头是没有Cache-Control:max-age=* 这个响应报头准确的,因为max-age=date中的date是个相对时间,不仅更好理解,也更准确。 |
| Pragma : no-cache | 这个报头的含义与Cahce-Control等同。 |
| Server : Tengine/1.4.6 | 这个报头表示服务器对应的版本,仅用于告诉客户端服务器的信息。 |
| Transfer-Encoding : chunked | 该 响应报头告诉苦短,服务器发送资源的方式是分块发送的。一般分块发送的资源都是服务器动态生成的,在发送时还不知道发送资源的大小,锁一采用分块发送。每一个小块都是独立的,独立的块都能标示自己的长度,最后一块是0长度的,当客户端读到这个0长度的块时,可以确定资源已经传输完成了。 |
| Vary : Accept-Encoding | 该报头告诉缓存服务器,缓存压缩文件和非压缩文件两个版本。如今这个报头的用处并不大,因为现在的浏览器都是支持压缩的。 |
Set-Cookie | 响应头是服务器返回的响应头用来在浏览器中种cookie |
Last-Modified | 都是用于记录页面最后修改时间。 |
响应状态代码由三维数字组成,其中第1位数字定义了响应的类别,有五种可能取值:
| 响应编码 | 说明 |
|---|---|
| 100~199 | 表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程。 |
| 200~299 | 表示服务器承购接收请求并已完成整个处理过程。常用状态码为 200 |
| 300~399 | 为完成请求,客户需进一步细化请求 |
| 400~499 | 客户端的请求有错误,常用转台码包括 404和403 |
| 500~599 | 服务器端出现错误,常用状态码为 500 |
爬虫就是 模拟客户端发送请求给服务器获取响应,那么,开发者需要知道客户端发送了什么样的请求给服务器;服务器返回了什么信息给客户端。

Fiddler 是一款强大的Web调试工具(包含了抓包功能),它能记录所有客户端和服务器的 HTTP 请求和响应,还能模拟 HTTP请求的发送。
Fiddler 是以代理网络服务器的形式工作的,它使用代理地址为127.0.0.1 ,端口为 8888. 当 Fiddler 启动时会制动设置代理,退出的时候会自动注销代理,这样不会影响其他程序。


进入 Fiddler官网免费下载Fiddler工具,官网主页点击【Download Free】下载安装。
抓包利器,Fiddler 界面详解!
urllib 库是Python3 内置的HTTP请求库,它可以看做是处理URL的组合集合。urllib库包含了四大模块:
# 导入request模块
import urllib.request
# 发送URL请求,获取响应
response = urllib.request.urlopen('http://www.baidu.com')
# 从响应对象中读取数据
content = response.read()
# 对二进制数据进行解码
# decode() 默认使用UTF-8进行解码
content = content.decode()
# 打印内容
print(content)