目录

1. URI和URL

2. 超文本

3. HTTP与HTTPS

4. HTTP的请求过程


Python爬虫编程思想(2):客户端请求与服务端响应

由于网络爬虫要处理的主要目标是网页,所以在编写爬虫之前,非常有必要了解一些爬虫的基础知识,例如HTTP、HTML、CSS、Session、Cookie等。在本专栏开始的几篇文章中会先讲解这些基础知识。

1. URI和URL

通过浏览器访问网页,首先就要接触到URL(Uniform Resource Location,统一资源定位符),不过在很多场景,经常会遇到URI,那么URI是什么呢?Uri的英文全称是Uniform Resource Identifier,中文的意思是“统一资源标识符”。

在很多时候,URL与URI可以互换,例如,https://geekori.com/edu/course.php?c_id=6是geekori.com上一个页面的链接,这是一个URL,同时也是一个URI。也就是说,在geekori.com上有一个页面,通过URL/URI指定了该页面的访问协议(https)、访问域名(geekori.com)、访问路径(/edu/course.php)和参数(?c_id=6)。通过这样一个链接,我们可以在互联网上唯一定位这个资源,这就是URL/URI。

既然同时存在URL和URI,那么它们肯定有区别。其实URL是URI的子集,也就是说,每个URL都是URI,但并不是所有的URI都是URL。那么有哪些URI不是URL呢?URI除了包含URL外,还有URN(Universal Resource Name,统一资源名称)。URN只命名资源而不指定如何获得资源,例如,P2P下载中使用的磁力链接是URN的一种实现,它可以持久化的标识一个BT资源,资源分布式的存储在P2P网络中,无需中心服务器用户即可找到并下载它。在磁力链接中类似 magnet:?xt=urn:btih:开头的字符串就是一个URN。而URL不仅命名了资源,还指定了如何获取资源,如获取资源的协议、域名、路径等。不过对于爬虫来说,主要使用URL,URN用的并不多。用于访问网页的链接可以称为URL,也可以称为URI,我个人习惯称为URL。

2. 超文本

超文本,英文名字是hypertext。在Web应用中,超文本主要是指HTML代码。我们在浏览器中看到的内容就是浏览器解析超文本(HTML代码)后的输出结果。这些HTML代码由若干个节点组成,例如,用于显示图像的img节点,用于换行的p节点,用于显示表格的table节点。浏览器解析这些节点后,就形成了我们平常看到的页面,而页面的源代码(HTML代码)就可以称为超文本。

任何浏览器都可以查看当前页面的源代码,本节以Chrome为例,在Chrome中打开任意一个页面,如京东商城,在页面的右键菜单中单击“检查”菜单项,就会打开浏览器的开发者工具,在Elements节点页可以看到当前页面的源代码,如图1所示。

3. HTTP与HTTPS

任何一个URL的开头都指明了协议,例如,在访问京东商城https://www.jd.com时,协议是https,Web资源除了https,还有http。除了以这两个协议开头的URL,还有以ftp、sftp、smb等协议开头的URL。那么协议是指什么呢?其实这里的协议就是指数据传输协议,也就是数据的传输格式(数据传输规范)。只要客户端(浏览器)和服务端都遵循这些规范,就可以正常传输数据。由于爬虫主要涉及到的协议是HTTP和HTTPS,所以本节主要会介绍这两种协议。

HTTP的全称是Hyper Text Transfer Protocol,中文名是“超文本传输协议”。HTTP理论上可以传输任何类型的数据,包括超文本数据、普通的文本数据、二进制数据(如图像、视频文件等),不过对于爬虫来说,主要关注通过HTTP传输的超文本数据。HTTP由万维网协会(World Wide Web Consortium,W3C)和Internet工作小组(Internet Engineering Task Force,IETF)共同合作制定的规范,目前广泛使用的是HTTP 1.1。

HTTPS的全称是Hyper Text Transfer Protocol over Secure Socket Layer,是安全的HTTP数据通道,也可以认为是HTTP的安全版本,即HTTP下加入SSL层,简称为HTTPS。通过HTTPS传输的数据都是加密的,而通过HTTP传输的数据都是明文的。

HTTPS的安全基础是SSL,因此通过HTTPS传输的数据都是经过SSL加密的,主要有如下两种作用。

  • 建立一个信息安全通道来保证数据传输的安全。
  • 确认网站是安全和真实的。

第1个作用非常好理解,那么第2个作用是什么意思呢?还是以京东商城为例,在chrome浏览器中显示京东商城首页后,在浏览器地址栏左侧会出现一个小锁,单击小锁,会显示如图2所示的弹出页面。最上方会显示“连接是安全的”。这就表明对京东商城访问是安全的。

为了更进一步证明我们访问的确实是京东商城,单击图2-2所示弹出页面的“证书(有效)”连接,会显示证书的颁发机构,单击“细节”会显示更多关于证书的信息,如图3所示。

从证书信息可以看出,京东商城使用了GlobalSign签发的证书,而该证书正是颁发给北京的京东公司,顶级域名是jd.com,也就是说,www.jd.com、wt.jd.com这些域名都会使用这个证书,这就证明了我们访问的https://www.jd.com不仅是安全的,而且的确是京东商城的官方网站。

现在越来越多的网站和App都已经向HTTPS方向发展,例如:

  • 苹果公司强制所有的iOS App在2017年1月1日前全部改为使用HTTPS加密,否则App就无法在应用商店上架。
  • 从Chrome 56(Google在2017年1月推出)开始,对未进行HTTPS加密的网站链接显示风险提示,也就是在地址栏左侧显示一个感叹号图标,并且显示“不安全”字样。单击感叹号图标,在弹出页面会显示“您与此网站之间建立的连接不安全”,如图4所示。
  • 微信小程序要求必须使用HTTPS请求与服务端通信。

显示这个信息的原因是尽管网站使用了SSL进行加密,但使用的证书是自己或其他未被当前浏览器承认的第三方签发的(查看图5所示网站的证书,会显示如图6所示的内容,很明显,这是自签发的证书),相当于在出庭去作证,而法庭首先需要确认证人本身是可靠的。这里法庭就相当于浏览器,证人相当于证书。如果是自己或其他未被法庭承认的证人去作证,当然是无效证词了,就像不能自己证明自己无罪一样。尽管这类网站通过单击“高级”按钮,然后按提示操作仍然可以继续访问网站,但并不建议这样做,至少浏览器是这么建议的。不过这类网站在传输数据时仍然是加密的,只是在浏览器上会提示不安全。对于一些应用,可以利用自签名的HTTPS网站传输加密数据,不过对于一些应用,如Android App,是要求签名必须被当前系统认可的才可以访问,因此,如果要自己搭建基于HTTPS的网站,最好到相关权威机构购买证书。

4. HTTP的请求过程

在浏览器地址栏中输入一个URL,按Enter键会在浏览器中显示页面内容。实际上,这个过程是按Enter键后,浏览器根据URL指定的地址向服务端发送一个请求,当服务端接收到这个请求后,会对请求数据进行解析,并处理解析后的数据,然后返回对应的响应数据,这些响应数据最终会被回传给浏览器。对于浏览器来说,这些响应数据的核心内容就是页面的源代码(主要是HTML代码),浏览器会对这些源代码进行解析,然后将解析结果展示在浏览器上,这就是我们最终看到的页面,整个过程如图7所示。

这里的客户端表示PC、手机以及任何计算设备的浏览器,服务器表示网站所在的服务器。为了更直观说明这个过程,可以在Chrome浏览器的开发者工具中的Network监听组件观察Web页面请求服务器的各类Url。

打开Chrome浏览器,进入京东商城首页,在页面右键菜单中单击“检查”菜单项打开开发者工具,然后切换到Network面板,就会看到该页面中会出现很多Url,如图8所示。

在Network面板中的每一个条目表示一个Url,每列的含义如下:

  • Name:请求的文件名。通常来讲,一个Url就是请求服务器的一个文件,而Name列的值就是这个Url最后的文件名。例如,请求Url是https://m.360buyimg.com/babel/jfs/abc.jpg,那么Name列的值就是abc.jpg。
  • Status:响应状态码。如果服务器成功响应客户端,通常是200。通过响应状态码,我们可以判断发送的请求你是否得到了服务器的正常响应。
  • Type:请求的文档类型。一般会根据响应头的content-type字段确定文档类型,例如,请求的Url是https://m.360buyimg.com/babel/jfs/abc.jpg,content-type字段的值就是image/jpeg,所以Type列的值就是jpeg。
  • Initiator:请求源。用来标记请求是由哪个程序发起的。
  • Size:由于向服务器发送请求后,服务器会返回对应的资源,这个Size列就是返回资源的大小。如果资源从本地缓存中获取,那么Size列的值是from disk cache。
  • Time:从发起请求到获取响应所用的总时间。
  • Waterfall:网络请求的可视化瀑布流。

单击某个条目,可以看到更详细的信息,如图9所示。

在详细信息页面有3个部分:General、Response Headers和Request Headers,分表表示基本信息、响应头信息和请求头信息。其中General部分的字段含义如下:

  • Request URL:请求的完整URL。
  • Request Method:请求的方法,本例是GET,另外一个常用的方法是POST。
  • Status Code:响应状态码。
  • Remote Address:远程服务器的地址和端口号。
  • Referrer Policy:Referrer判别策略。

在客户端和服务器交互的过程中,涉及到两个“头”,一个是请求头(Request Headers),一个是响应头(Response Headers)。请求头和响应头都由若干字段组成,用于描述在请求和响应过程中相关信息。例如,请求信息由什么客户端发出的,会通过请求头的User-Agent字段描述,通过该字段,服务器就会知道客户端是通过Chrome、还是Firefox,或是IE发出的请求。而浏览器可以通过响应头的content-type字段得到服务器返回资源的类型。在下一篇文章中会详细介绍请求头和响应头包含哪些内容。

Python爬虫编程思想(2):客户端请求与服务端响应

Python爬虫编程思想(1):HTTP基础相关推荐

  1. Python爬虫编程思想(6):实战案例:抓取所有的网络资源

    Python爬虫编程思想(7):实战案例:抓取博客文章列表 到现在为止,我们已经对网络爬虫涉及到的基本知识有了一个初步的了解.本文会编写一个简单的爬虫应用,以便让读者对爬虫有一个基本的认识.本节要编写 ...

  2. Python爬虫编程思想(104):Splash基础(支持Lua的轻量级浏览器)

    目录 1. Splash功能简介 2. 安装Docker 3. 安装Splash Splash是一个JavaScript渲染服务,是一个带有HTTP API的轻量级浏览器.可以使用lua语言编写代码对 ...

  3. Python爬虫编程思想(133):项目实战--利用Appium抓取微信朋友圈信息

    本文利用Appium实现一个抓取微信朋友圈信息的爬虫.在编写爬虫之前,先要启动Appium服务器. 编写基于Appium的爬虫,关键就是分析App每个界面相关元素的特征,也就是如何获取这些元素,然后在 ...

  4. Python爬虫编程思想(48):项目实战:抓取起点中文网的小说信息

    本文会利用requests库抓取起点中文网上的小说信息,并通过XPath提取相关的内容,最后将经过提取的内容保存到Excel文件中.本例需要使用第三方的xlwt库,该库用来通过Python操作Exce ...

  5. Python爬虫编程思想(103):项目实战--抓取QQ空间说说的内容

    本例使用Selenium完成一个综合项目,该项目可以QQ空间说说的内容.首先需要分析一下QQ空间说说的HTML代码. 由于进入QQ空间需要登录,所以抓取QQ空间说说的内容需要如下2步: 模拟登录 抓取 ...

  6. Python爬虫编程思想(114):项目实战--使用Splash Lua抓取京东搜索结果

    本文会利用Splash Lua脚本在京东商城上搜索商品,然后抓取搜索出的商品名称,以及将每一页搜索结果的截图保存为PNG格式的文件. 本例的核心是使用select_all方法通过CSS选择器得到搜索页 ...

  7. Python爬虫编程思想(162): 综合爬虫项目:可视化爬虫

    到现在为止,我们已经学习了相当多的爬虫知识,包括各种网络库.分析库.多线程爬虫.基于Selenium和Appium的爬虫,以及Scrapy爬虫框架.在前面的章节中也提供了大量的爬虫项目,不过这些爬虫应 ...

  8. Python爬虫编程思想(128):使用Appium抓取移动数据(2)--启动Appium服务

    运行Appium,会显示如图1所示的页面. 然后单击"Start Server v1.12.1"按钮,会启动Appium服务,相当于开启一个Appium服务器,如图2所示.我们可以 ...

  9. Python爬虫编程思想(70): 项目实战--抓取京东商城手机销售排行榜

    本文的例子使用requests抓取京东商城手机销售排行榜,并使用pyquery和CSS选择器提取相关的信息,同时将这些信息保存到Excel文件中.本例抓取总排行榜,并单独提取Apple.华为和小米手机 ...

最新文章

  1. pytorch之expand,gather,squeeze,sum,contiguous,softmax,max,argmax
  2. 敏捷过程、极限编程和SCRUM的关系
  3. 几种颜色模型的转换公式
  4. 最短Hamilton路径-状压dp解法
  5. STM32硬件错误(HardFault_Handler)位置判断
  6. 三个python文件怎么关联___name__= __main__怎么解释 怎么用 另外两个py文件之间的互动关联...
  7. kafka系列文章索引
  8. 上海浦东新区计算机学校排名2015,2015年上海市浦东新区初级中学最新排名
  9. 李洋疯狂C语言之冒泡排序法
  10. html中列表、表格、合并单元格
  11. easyplayerpro 使用说明_H265网页播放器EasyPlayerPro-Win如何通过配置文件实现自动播放等功能?...
  12. 1-判断数字所在区间
  13. ie为什么那么垃圾(不是ie垃圾,是ie用的人太多了,很多在用低版本)
  14. 京瓷2211打印机清零_打印机墨粉盒清零的方法
  15. Spring Security使用数据库登录认证授权
  16. ibm aix_IBM AIX设备驱动程序开发
  17. 如果你想要做好抖音直播间需要注意的其他事项(三)
  18. 解决封号 Walmart最全申诉步骤
  19. python中self image_Python3用tkinter和PIL实现看图工具
  20. 这5个GitHub项目+3个网站,助你一飞冲天!

热门文章

  1. Unity改变图片文本颜色
  2. 装饰器模式代码举例(java语言版)
  3. 【Spring Security】入门——使用Themeleaf渲染页面
  4. encodeURI之URL中文参数问题
  5. html中script不显示,html中出现的script失效
  6. 计算机组成运算器原理实验报告,《计算机组成原理》运算器实验报告
  7. python mro--多继承属性查找机制
  8. 云计算学习之路——文件服务NFS
  9. map和object相互转换的几种方法和对比
  10. pta5-4 6174黑洞