Python 网络爬虫学习笔记(一)HTTP基本原理

Python 网络爬虫学习笔记(一)

HTTP基本原理

URI和URL

URI:统一资源标识符(Uniform Resource Identifier)
URL:统一资源定位符(Uniform Resource Locator)

URL是URI的子集
例:https://github.com/favicon.ico 是GitHub的网站图标链接,它是一个URL,也是一个URI。(访问协议:https、访问路径(/即根目录)和资源名称favicon.ico)

URN:统一资源名称(Uniform Resource Name )(例如一本书的ISBN)

超文本

超文本,hypertext
网页的源代码HTML就可以称作超文本

HTTP和HTTPS

HTTP(Hyper Text Transfer Protocol)超文本传输协议, HTTP 协议是用于从网络传输超文本数据到本地浏览器的传送协议,保证高效而准确地传送超文本文档 。

HTTPS (Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的 HTTP通道,即 HTTP 的安全版, 在HTTP 下加入 SSL 层 ,简称为 HTTPS 。
作用:1.建立一个信息安全通道来保证数据传输的安全、2.确认网站的真实性(凡是使用 了 HTTPS 的网站,都可以通过点击浏览器地址栏的锁头标志来查看网站认证之后的真实信息,也可以通过 CA 机构颁发的安全签章来查询 。)

HTTP请求过程

浏览器向网站所在的服务器发送了一个请求,网站服务器接收到这个请求后进行处理和解析,然后返回对应的响应,接着传回给浏览器。 响应里包含了页面的源代码等内容,浏览器再对其进行解析,便将网页呈现了出来。

请求

请求,由客户端向服务端发出,分为 4 部分内容:请求方法( Request Method ) 、 请求的网址( Request URL )、请求头( Request Headers ) 、 请求体( Request Body )。

1 . 请求方法
常见的请求方法有两种 : GET 和 POST。在浏览器中直接输入 URL 井回车,这便发起了一个 GET 请求,请求的参数会直接包含到 URL里 。 例如,在百度中搜索 Python ,这就是一个 GET 请求,链接为 htψs://www.baidu.corn/s?wd=Python ,其中 URL 中包含了请求的参数信息,这里参数 wd 表示要搜寻的关键字。 POST 请求大多在表单提交时发起 。 比如,对于一个登录表单,输入用户名和密码后,点击“登录”按钮,这通常会发起一个 POST请求,其数据通常以表单的形式传输,而不会体现在 URL 中 。
GET 和 POST 请求方法有如下区别 。
1. GET 请求中的参数包含在 URL 里面,数据可以在 URL 中看到,而 POST 请求的 URL 不会包含这些数据,数据都是通过表单形式传输的,会包含在请求体中 。
2. GET 请求提交的数据最多只有 1024 字节,而 POST 方式没有限制 。

2 请求的网址
请求的网址,即统一资惊定位符 URL ,它可以唯一确定我们想请求的资源。

3 . 请求头
请求头,用来说明服务器要使用的附加信息,比较重要的信息有 Cookie 、 Referer 、 User-Agent 等 。
口 Accept :请求报头域,用于指定客户端可接受哪些类型的信息 。
口 Accept-Language :指定客户端可接受的语言类型 。
口 Accept-Encoding :指定客户端可接受的内容编码 。
口 Host :用于指定请求资源的主机 IP 和端口号,其内容为请求 URL 的原始服务器或网关的位置。 从 HTTP 1. l 版本开始,请求必须包含此内容。
口 Cookie :也常用复数形式 Cookies ,这是网站为了辨别用户进行会话跟踪而存储在用户本地的数据 。 它的主要功能是维持当前访问会话 。 例如,我们输入用户名和密码成功登录某个网站后,服务器会用会话保存登录状态信息,后面我们每次刷新或请求该站点的其他页面时,
会发现都是登录状态,这就是 Cookies 的功劳 。 Cookies 里有信息标识了我们所对应的服务器的会话,每次浏览器在请求该站点的页面时,都会在请求头中加上 Cookies 并将其发送给服
务器,服务器通过 Cookies 识别出是我们自己,并且查出当前状态是登录状态,所以返回结
果就是登录之后才能看到的网页内容 。
口 Referer :此内容用来标识这个请求是从哪个页面发过来的,服务器可以拿到这一信息并做相应的处理,如做来源统计、防盗链处理等 。
口 User-Agent :简称 UA ,它是一个特殊的字符串头,可以使服务器识别客户使用的操作系统及版本 、 浏览器及版本等信息 。 在做爬虫时加上此信息,可以伪装为浏览器;如果不加,很可能会被识别州为爬虫 。
口 Content-Type :也叫互联网媒体类型( Internet Media Type )或者 MIME 类型,在 HTTP 协议消息头中,它用来表示具体请求中的媒体类型信息 。 例如, text/html 代表 HTML 格式,image/gif代表 GIF 图片,app lication/jso n 代表 JSON 类型,更多对应关系可以查看此对照表 :http://tool.oschina.neνcommons 。

4. 请求体
请求体一般承载的内容是 POST 请求中的表单数据,而对于 GET 请求,请求体则为空 。
Request Headers 中指定 Content-Type 为 application, x-www-form-urlencoded。 才会以表单数据的形式提交 。 另外,我们也可以将 Content-Type 设置为 application/ison 来提交 JSON 数据,或者设置为 mu ltipart/form-data 来上传文件。
Content—Type和POST提交数据方式的关系

响应

响应,由服务端返回给客户端,可以分为三部分:响应状态码( Response Status Code )、响应头( Response Headers )和响应体( Response Body )。

  1. 晌应状态码
    响应状态码表示服务器的响应状态。

常见的错误代码及错误原因1
常见的错误代码及错误原因2
2. 晌应头
响应头包含了服务器对请求的应答信息,如 Content-Type 、 Server 、 Set-Cookie 等。
常用的头信息
3 . 晌应体
最重要的当属响应体的内容了 。 响应的正文数据都在响应体中,比如请求网页时,它的响应体就是网页的 HTML 代码 ; 请求一张图片时 , 它的响应体就是图片的二进制数据 。

网页基础

网页的组成

网页可以分为三大部分 一一 HTML , CSS 和 JavaScript。
1.HTML(Hyper Text Markup Language) ,即超文本标记语言 。 网页包括文字、按钮、图片和视频等各种复杂的元素,其基础架构就是 HTML 。 不同类型的文字通过不同类型的标签来表示 ,如图片用 img 标签表示, 视频用 video 标签表示 ,段落用 p 标签表示 ,它们之间的布局又常通过布局标签 div 嵌套组合而戚 。

  1. CSS( Cascading Style Sheets ),即层叠样式表,是目前唯一的网页页面排版样式标准,有了它的帮助,页面才会变得更为美观。
    CSS例子
  2. JavaScript,简称 JS , 是一种脚本语言 。 HTML 和 css 配合使用, 提供给用户的只是一种静态信息,缺乏交互性。 我们在网页里可能会看到一些交互和动画效果,如下载进度条、提示框 、 轮播图等 ,这通常就是 JavaScript 的功劳。 它的出现使得用户与信息之间不只是一种浏览与显示的关系,而是实现了一种实时、动态、交互的页面功能 。JavaScript 通常也是以单独的文件形式加载的,后缀为 js ,在 HTML 中通过 script 标签即可引入。

节点树及节点间的关系

在 HTML 中,所有标签定义的内容都是节点,它们构成了一个 HTML DOM 树。
DOM,W3C (万维网联盟)的标准,英文全称 Document Object Model,即文档对象模型 ,定义了访问 HTML 和 XML 文档的标准:W3C 文档对象模型( DOM )是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式 。
W3CDOM 标准被分为 3 个不同的部分。
口核心 DOM :针对任何结构化文档的标准模型 。
口 XML DOM : 针对 XML 文挡的标准模型 。
口 HTML DOM : 针对 HTML 文档的标准模型 。
根据 W3C 的 HTML DOM 标准, HTML 文档中的所有内容都是节点 。
口 整个文档是一个文档节点 。
口 每个 HTML 元素是元素节点 。
口 HTML 元素 内的文本是文本节点 。
口 每个 HTML 属性是属性节点 。
口 注释是注释节点 。
节点树
节点树及节点间的关系

选择器

在 css 中,我们使用 css 选择器来定位节点
CSS选择器的语法规则1
CSS选择器的语法规则2
css 选择器还支持嵌套选择 ,各个选择器之间加上空格分隔开便可以代表嵌套关系, 如
#container .wrapper p 则代表先选择 id 为 container 的节点,然后选中其内部的 class 为 wrapper 的节点,然后再进一步选中其内部的 p 节点。另外,如果不加空格,则代表并列关系,如 div#container .wrapper p.text 代表先选择 id为container的div节点,然后选中其内部的 class 为 wrapper 的节点,再进一步选中其内部的 class 为 text 的p节点 。

爬虫的基本原理

爬虫概述

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

1.获取网页
获取网页的源代码,最关键的部分就是构造一个请求并发送给服务器,然后接收到响应并将其解析出来。Python 提供了许多库来帮助我们实现这个操作,如 urllib 、 requests 等 。 我们可以用这些库来帮助我们实现 HTTP 请求操作,请求和响应都可以用类库提供的数据结构来表示,得到响应之后只需要解析数据结构中的 Body 部分即可,即得到网页的源代码。

2.提取信息
首先,最通用的方法便是采用正则表达式提取,这是一个万能的方法(但是在构造正则表达式时比较复杂且容易出错)
其次,由于网页的结构有一定的规则 ,所以还有一些根据网页节点属性、 css 选择器或 XPath 来提取网页信息的库,如 Beautiful Soup 、 pyquery 、 lxml 等 。 使用这些库,我们可以高效快速地从中提取网页信息,如节点的属性 、 文本值等 。

3.保存数据
可以简单保存为 TXT 文本或 JSON 文本,也可以保存到数据库,如 MySQL 和 MongoDB 等 ,也可保存至远程服务器,如借助 SFTP 进行操作等。

4 . 自动化程序
爬虫就是代替我们来完成这份爬取工作的自动化程序,它可以在抓取过程中进行各种异常处理、错误重试等操作 ,确保爬取持续高效地运行。

能抓怎样的数据

1.最常抓取的便是 HTML 源代码
2.JSON 字符串(其中 API 接口大多采用这样的形式),这种格式的数据方便传输和解析,它们同样可以抓取,而且数据提取更加方便
3.css 、 JavaScript 和配置文件等

JavaScript 渲染页面

在用urlib 或 requests 等库请求当前页面时,我们得到的只是HTML 代码,它不会帮助我们去继续加载 JavaScript 文件,因此,使用基本 HTTP 请求库得到的源代码可能跟浏览器中的页面源代码不太一样 。
我们可以分析其后台 Ajax 接口,也可使用 Selenium 、 Splash 这样的库来实现模拟JavaScript 渲染 。

会话和Cookies

静态网页和动态网页

静态:Html代码
动态:可以动态解析 URL 中参数的变化,关联数据库井动态呈现不同的页面内容,
不再是一个简单的 HTML,而是可能由 JSP 、 PHP 、 Python 等语言编写的。

无状态HTTP

HTTP 有一个特点 ,叫作无状态 。
HTTP 的无状态是指 HTTP 协议对事务处理是没有记忆能力的。
也就是说服务器不知道客户端是什么状态 。 当我们向服务器发送请求后,服务器解析此请求,然后返回对应的响应,服务器负责完成这个过程,而且这个过程是完全独立的,服务器不会记录前后状态的变化,也就是缺少状态记录。 这意味着如果后续需要处理前面的信息 ,则必须重传,这导致需要额外传递一些前面的重复请求,才能获取后续响应。

两个用于保持 HTTP 连接状态的技术:会话和Cookies。 会话在服务端,也就是网站的服务器,用来保存用户的会话信息; Cookies 在客户端,也可以理解为浏览器端,有了Cookies ,浏览器在下次访问网页时会自动附带上它发送给服务器,服务器通过识别 Cookjes 并鉴定出是哪个用户,然后再判断用户是否是登录状态,然后返回对应的响应 。
因此在爬虫中,有时候处理需要登录才能访问的页面时,我们一般会直接将登录成功后获取的
Cookies 放在请求头里面直接请求,而不必重新模拟登录 。

原理:
1.会话
在 Web 中,会话对象用来存储特定用户会话所需的属性及配置信息 。 这样,当用户在应用程序的 Web 页之间跳转时,存储在会话对象中的变量将不会丢失,而是在整个用户会话中一直存在下去 。
当用户请求来自应用程序的 Web 页时如果该用户还没有会话, 则 Web 服务器将自动创建一个会话对象。 当会话过期或被放弃后,服务器将终止该会话。

2. Cookies
Cookies 指某些网站为了辨别用户身份 、 进行会话跟踪而存储在用户本地终端上的数据 。

·会话维持
利用Cookies 保持状态原理:当客户端第一次请求服务器时,服务器会返回一个请求头中带有 Set-Cookie 字段的响应给客户端,用来标记是哪一个用户,客户端浏览器会把 Cookies 保存起来 。 当浏览器下一次再请求该网站时,浏览器会把此 Cookies 放到请求头一起提交给服务器,Cookies 携带了会话 ID 信息,服务器检查该Cookies 即可找到对应的会话是什么,然后再判断会话来以此来辨认用户状态 。
在成功登录某个网站时,服务器会告诉客户端设置哪些 Cookies 信息,在后续访问页面时客户端会把 Cookies 发送给服务器,服务器再找到对应的会话加以判断。 如果会话中的某些设置登录状态的变量是有效的,那就证明用户处于登录状态,此时返回登录之后才可以查看的网页内容,浏览器再进行解析便可以看到了 。反之,如果传给服务器的 Cookies 是无效的,或者会话已经过期了,我们将不能继续访问页面,此时可能会收到错误的响应或者跳转到登录页面重新登录 。
所以, Cookies 和会话需要配合,一个处于客户端,一个处于服务端,二者共同协作,就实现了登录会话控制 。

·属性结构
在浏览器开发者工具中打开Application 选项卡,然后在左侧会有一个 Storage 部分,最后一项即为 Cookies 。
有如下几个属性。
口 Name : 该 Cookie 的名称。一旦创建,该名称便不可更改 。
口 Value : 该 Cookie 的值。 如果值为 Unicode 字符,需要为字符编码 。 如果值为二进制数据,则需要使用 BASE64 编码。
口 Domain :可以访问该 Cookie 的域名 。 例如,如果设置为.zhihu.com ,则所有以 zh ihu .com 结尾的域名都可以访问该 Cookie。
口 Max Age : 该 Cookie 失效的时间, 单位为秒,也常和 Expires 一起使用,通过它可以计算其有效时间 。 Max Age 如果为正数 ,则该 Cookie 在 Max Age 秒之后失效 。 如果为负数,则关闭
浏览器时 Cookie 即失效,浏览器也不会以任何形式保存该 Cookie 。
口 Path : 该 Cookie 的使用路径 。 如果设置为/path/ ,则只有路径为 /path/ 的页面可以访问该Cookie 。 如果设置为人 则本域名下的所有页面都可以访问该 Cookie 。
口 Size 字段 : 此 Cookie 的大小 。
口 HTTP 字段: Cookie 的 httponly 属性 。 若此属性为 true ,则只有在 HTTP 头中会带有此Cookie 的信息,而不能通过 document.cookie 来访问此 Cookie 。
口 Secure : 该 Cookie 是否仅被使用安全协议传输 。 安全协议有 HTTPS 和 SSL 等,在网络上传输数据之前先将数据加密 。 默认为 false 。

·会话 Cookie 和持久 Cookie
表面来说,会话 Cookie 就是把 Cookie 放在浏览器内存里,浏览器在关闭之后该 Cookie 即失效 ; 持久 Cookie 则会保存到客户端的硬盘中,下次还可以继续使用,用于长久保持用户登录状态 。
严格来说,没有会话 Cookie 和持久 Cookie 之分,只是由 Cookie 的 Max Age 或 Expires 字段决定了过期的时间 。

PS:当我们关闭浏览器时,浏览器不会主动在关闭之前通知服务器它将要关闭,所以服务器根本不会有机会知道浏览器已经关闭 。 之所以会有这种错觉,是因为大部分会话机制都使用会话 Cookie来保存会话 ID 信息, 而关闭浏览器后 Cookies 就消失了,再次连接服务器时,也就无法找到原来的会话了 。 如果服务器设置的 Cookies 保存到硬盘上,或者使用某种手段改写浏览器发出的 HTTP 请求头,把原来的 Cookies 发送给服务器, 则再次打开浏览器,仍然能够找到原来的会话 ID , 依旧还是可以保持登录状态的 。
而且恰恰是由于关闭浏览器不会导致会话被删除,这就需要服务器为会话设置一个失效时间,当距离客户端上一次使用会话的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动 ,才会把会话删除以节省存储空间 。

代理的基本原理

服务器会检测某个 IP 在单位时间内的请求次数,如果超过了这个阔值,就会直接拒绝服务,返问一些错误信息,这种情况可以称为封 IP 。
借助某种方式来伪装我们的 IP,一种有效的方式就是使用代理。

基本原理

代理实际上指的就是代理服务器,英文叫作 proxy server,它的功能是代理网络用户去取得网络信息 。 (网络信息的中转站)
在我们正常请求一个网站时, 是发送了请求给 Web 服务器,Web 服务器把响应传回给我们 。 如果设置了代理服务器 , 实际上就是在本机和服务器之间搭建了一个桥,此时本机不是直接 向 Web 服务器发起请求,而是向代理服务器发出请求,请求会发送给代理服务器,然后由代理服务器再发送给 Web 服务器,接着由代理服务器再把 Web 服务器返回的响应转发给本机。 这样我们同样可以正常访问网页,但这个过程中 Web 服务器识别出的真实 IP 就不再是我们本机的 IP 了,就成功实现了 IP 伪装,这就是代理的基本原理。

代理的作用

口 突破自身IP 访问限制,访问一些平时不能访问的站点 。
口 访问一些单位或团体内部资惊 :比如使用教育网内地址段免费代理服务器,就可以用于对教育网开放的各类 FTP 下载上传,以及各类资料查询共享等服务 。
口 提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区,当有外界的信息通过时,同时也将其保存到缓冲区中,当其他用户再访问相同的信息时,则直接由缓冲区中取出信息,传给用户,以提高访问速度 。
口 隐藏真实 IP

代理分类

1 . 根据协议区分
根据代理的协议,代理可以分为如下类别 。
FTP 代理服务器: 主要用于访问 FTP 服务器, 一般有上传 、 下载以及缓存功能,端口一般为21 、 212 1 等 。
HTTP 代理服务器: 主要用于访问网页,一般有内容过滤和缓存功能,端口 一般为 80 、8080 、 3128 等 。
SSL/TLS 代理: 主要用于访问加密网站, 一般有 SSL 或 TLS 加密功能(最高支持 128 位加密强度),端口一般为 443 。
RTSP 代理: 主要用于访问 Real 流媒体服务器, 一般有缓存功能,端口 一般为 554 。
Telnet 代理: 主要用于 telnet远程控制(黑客人侵计算机时常用于隐藏身份),端口 一般为 23 。
POP3/SMTP 代理: 主要用于 POP3/SMTP 方式收发邮件, 一般有缓存功能,端口一般为 110/25 。
SOCKS 代理: 只是单纯传递数据包,不关心具体协议和用法,所以速度快很多 , 一般有缓存功能,端口一般为 1080。SOCKS 代理协议又分为 SOCKS4 和 SOCKS5 ,前者只支持 TCP,而后者支持 TCP 和 UDP ,还支持各种身份验证机制、服务器端域名解析等 。
2 根据匿名程度区分
根据代理的匿名程度,代理可以分为如下类别 。
高度匿名代理: 会将数据包原封不动地转发,在服务端看来就好像真的是一个普通客户端在访问,而记录的 IP 是代理服务器的 IP。
普通匿名代理: 会在数据包上做一些改动 , 服务端上有可能发现这是个代理服务器,也有一定几率追查到客户端的真实IP。 代理服务器通常会加入的 HTTP头有 HTTP_VIA和 HTTP_X_FORWARDED_FOR。
透明代理: 不但改动了数据包 还会告诉服务器客户端的真实 IP。 这种代理除了能用缓存技术提高浏览速度,能用内容过滤提高安全性之外,并无其他显著作用,最常见的例子是内网中的硬件防火墙。
间谍代理: 指组织或个人创建的用于记录用户传输的数据,然后进行研究 、 监控等目的的代理服务器 。

常见代理设置

口使用网上的免费代理: 最好使用高匿代理 , 另外可用的代理不多,需要在使用前筛选一下可用代理,也可以进一步维护一个代理池 。
口使用付费代理服务: 互联网上存在许多代理商,可以付费使用, 质量比免费代理好很多。
口 ADSL 拨号 :拨一次号换一次IP,稳定性高,也是一种比较有效的解决方案 。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小零呦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值