Python进阶学习【二】- -网络爬虫与信息提取(1)HTTP&requests

前言

1、参考资料:

(1)HTTP协议基础:
参考资料- -菜鸟教程
(2)HTTP详细:
mozilla Web开发教程
(3)requests库:
参考资料- -requests官方文档
(4)视频教程:
mooc嵩天老师爬虫教程
(5)参考资料:
参考博客

2、HTTP概述

(1)浏览器这样的客户端发出的消息叫requests,被服务端响应的消息叫responses
(2)一个完整的Web文档是由不同子文档,拼接而成的,像是文本、布局描述、图片、视频、脚本等。
在这里插入图片描述
(3)HTTP的组件系统:
<1>客户端:发出请求的一方,请求被一个实体发出,实体也就是用户代理。大多数情况用户代理指浏 览器,但也可能是任何东西,如程序员编写的爬取网页的机器爬虫程序。
<2>服务端:虚拟意义上的一个机器:可以是共享负载的一组服务器的计算机集群;也可以是一种复杂软件,通过向其它计算机发起请求获取数据;Server不一定是一台机器,一个机器可以装载众多Servers。在HTTP/1.1和Host头部中,它们甚至可以共享同一个地址;
<3>代理(Proxies):客户端和服务器之间,有许多计算机和其它设备转发了HTTP消息,大多出现在传输层、网络层、物理层上。少部分在应用层上到称为代理。代理主要有如下作用:

caching (the cache can be public or private, like the browser cache)
filtering (like an antivirus scan or parental controls)
load balancing (to allow multiple servers to serve the different requests)
authentication (to control access to different resources)
logging (allowing the storage of historical information)

缓存(可以是公开的也可以是私有的,像浏览器的缓存)
过滤(像反病毒扫描,家长控制…)
负载均衡(让多个服务器服务不同的请求)
认证(对不同资源进行权限管理)
日志记录(允许存储历史信息)

3、http工作原理

(1)架构:客户端-服务端;
(2)浏览器作为HTTP客户端通过URL(Uniform Resource Identifiers统一资源标识符)向HTTP服务 端,即WEB服务器,发送所有请求。
(3)Web服务器分类:Apache服务器,IIS(Internet Information Services)服务器等
(4)http默认端口号为80,但也可以自己更改为8080或其它端口。
Notes:
(1)无连接。http是无连接的,意思是每次连接只处理一个请求,待服务器处理完客户端请求后,并受到客户应答后,即断开链接。(节省时间)
(2)媒体独立。http是媒体独立的,意味着只要客户端和服务端知道如何处理数据,任何类型的数据都可以通过http发送。客户端及服务器指定适合的MIME-type内容类型。
(3)无状态。http是无状态协议,意味着服务器不会在两个请求之间保留任何数据(状态)。尽管通常基于TCP/IP层,但也可在可靠的传输层里使用,该协议不会像UDP那样静默丢失消息。

4、HTTP消息结构

(1)概述:

<1>Http消息采用由ASCII编码的多行文本构成。在早期HTTP版本中,消息通过连接公开发送,在HTTP/2中,为了优化和性能方面的改进,将可曾经可人工阅读的消息,分到多个HTTP帧中;

<2>开发者或网管,很少手动创建原始的HTTP消息。通过配置文件、API、或其他接口提供HTTP消息;注意Http/1和Http/2不太一样。详见下图
在这里插入图片描述

(2)HTTP消息结构:

<1>起始行。一行起始行用于描述要执行的请求,或者是对应的状态,成功或失败。这个起始行总是单行的;
<2>头部。一个可选的HTTP头集合指明请求或描述消息正文;
<3>空行。一个空行指示所有关于请求的元数据已经发送完毕;
<4>数据。一个可选的包含请求相关数据的正文 (比如HTML表单内容), 或者响应相关的文档。 正文的大小有起始行的HTTP头来指定。
消息结构

1、A start-line describing the requests to be implemented, or its status of whether successful or a failure. This start-line is always a single line.
2、An optional set of HTTP headers specifying the request, or describing the body included in the message.
3、A blank line indicating all meta-information for the request has been sent.
4、An optional body containing data associated with the request (like content of an HTML form), or the document associated with a response. The presence of the body and its size is specified by the start-line and HTTP headers.

(3)HTTP请求:

<1>起始行:
a)方法:(GET、PUT、POST、HEAD、OPTIONS等);
b)请求目标:URL、协议、端口、域名的绝对路径,以不同HTTP方法而异:

[1]一个绝对路径,末尾跟上一个 ’ ? ’ 和查询字符串。这是最常见的形式,称为 原始形式 (origin form),被 GET,POST,HEAD 和 OPTIONS 方法所使用。
POST / HTTP/1.1
GET /background.png HTTP/1.0
HEAD /test.html?query=alibaba HTTP/1.1
OPTIONS /anypage.html HTTP/1.0
[2] 一个完整的URL,被称为 绝对形式 (absolute form),主要在使用 GET 方法连接到代理时使用;
GET http://developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1
[3]由域名和可选端口(以’:‘为前缀)组成的 URL 的 authority component,称为 authority form。 仅在使用 CONNECT 建立 HTTP 隧道时才使用;
CONNECT developer.mozilla.org:80 HTTP/1.1
[4]星号形式 (asterisk form),一个简单的星号(’*’),配合 OPTIONS 方法使用,代表整个服务器。
OPTIONS * HTTP/1.1

c)HTTP版本信息

<2>头部:
分为普通头部、请求头部、实体头部;
在这里插入图片描述

<3>Body:

请求的最后一部分是它的 body。不是所有的请求都有一个 body:例如获取资源的请求,GET,HEAD,DELETE 和 OPTIONS,通常它们不需要 body。 有些请求将数据发送到服务器以便更新数据:常见的的情况是 POST 请求(包含 HTML 表单数据)。
在这里插入图片描述

(4)HTTP响应:

【1】状态行:协议版本、状态码、状态文本。
eg:HTTP/1.1 404 Not Found
【2】头部:
在这里插入图片描述
【3】Body:
响应的最后一部分是 body。不是所有的响应都有 body:具有状态码 (如 201 或 204) 的响应,通常不会有 body。
在这里插入图片描述

(5)HTTP/2的消息结构

HTTP/1.x 报文有一些性能上的缺点:
(1)Header 不像 body,它不会被压缩。
(2)两个报文之间的 header 通常非常相似,但它们仍然在连接中重复传输。
(2)无法复用。当在同一个服务器打开几个连接时:TCP 热连接比冷连接更加有效。

HTTP/2 引入了一个额外的步骤:它将 HTTP/1.x 消息分成帧并嵌入到流 (stream) 中。数据帧和报头帧分离,这将允许报头压缩。将多个流组合,这是一个被称为 多路复用 (multiplexing) 的过程,它允许更有效的底层 TCP 连接。
Web 开发人员不需要在其使用的 API 中做任何更改来利用 HTTP 帧;当浏览器和服务器都可用时,HTTP/2 将被打开并使用。

在这里插入图片描述

(6)结论

(1)HTTP 报文是使用 HTTP 的关键;它们的结构简单,并且具有高可扩展性。HTTP/2 帧机制是在 (2)HTTP/1.x 语法和底层传输协议之间增加了一个新的中间层,而没有从根本上修改它,即它是建立在经过验证的机制之上。

一、requests库

1、简介

(1)requests是python的一个简洁的http库;
(2)requests让使用者轻松发送HTTP/1.1请求,而无需再URL中添加查询语句,也无需对POST中的数据进行格式编码处理;
(3)故优点是简洁、高自动化。

2、重要对象

(1)Requsts对象

(2)Response对象

<1>简介:

Response对象包含服务器返回的所有信息,也包含Requsts请求信息。

<2>属性

在这里插入图片描述
在这里插入图片描述

<3>Response的编码:

在这里插入图片描述

2、发送请求

import requests
r = requests.get('https://api.github.com/events')
r = requests.post('http://httpbin.org/post', data = {'key':'value'})
r = requests.put('http://httpbin.org/put', data = {'key':'value'})
r = requests.delete('http://httpbin.org/delete')
r = requests.head('http://httpbin.org/get')
r = requests.options('http://httpbin.org/get')

3、传递URL参数

如果你是手工构建 URL,那么数据会以键/值对的形式置于 URL 中,跟在一个问号的后面。例如, httpbin.org/get?key=val。 Requests 允许你使用 params 关键字参数,以一个字符串字典来提供这些参数。举例来说,如果你想传递 key1=value1 和 key2=value2 到 httpbin.org/get ,那么你可以使用如下代码:

import requests
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://httpbin.org/get", params=payload)
print(r.url)

在这里插入图片描述

4、响应内容

(1)普通响应内容

get方法获取响应内容;

(2)二进制响应内容

r.content以字节方式访问请求响应体,Requsts会自动解码gzip和deflate传输编码的响应数据
在这里插入图片描述

(3)JSON响应内容

在这里插入图片描述

(4)原始响应内容

在这里插入图片描述

5、Requests库主要方法

(1)七个主要方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(2)详细用法:查看官方文档或嵩天老师PDF

6、Requests库的异常

网络连接有风险,异常处理很重要
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7、Requests库的13个控制参数

(1)params:
形式:字典或字节序列,做为参数增加到url中;
(2)data:
形式:字典或字节序列 或文件对象,做为Requests的内容,可反馈给服务器;
(3)json:
形式:JSON格式的数据 做为Requests的内容,可反馈给服务器;

科普:
(1)JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。
(2)它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
(3) 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

(4)headers:
形式:字典 HTTP定制头 ;
(5)cookies:
形式:字典或cookie Jar(从HTTP协议中解析得来)是Requests中的cookie;
(6)auth:
形式:元组 支持HTTP的认证功能;
(7)files:
形式:字典类型用于向服务器传输文件;
(8)timeout:
形式:数字 单位是s(秒)用于设置超时时间,防止爬取时间过长,无效爬取;
(9)prixies:
形式:字典类型 设定访问代理服务器,可以增加登录认证。(防止爬虫逆追踪);
(10)allow_redirects:
形式:布尔类型(True or False)默认为True 重定向开关;
(11)stream:
布尔类型(True or False)默认为Ture 获取内容立即下载开关;
(12)verify:
布尔类型(True or False)默认为Ture 认证SSL证书开关;
(13)cert:
保存本地证书路径

7、程序实例

(1)通用框架

在这里插入图片描述
Note:注意异常处理!!!

(2)IP地址自动化查询

<1>查询网页:https://m.ip138.com/iplookup.asp?ip=ipaddress
在这里插入图片描述

<2>待查网址:202.204.80.112
在这里插入图片描述

<3>查询后页面全名:
http://m.ip138.com/ip.asp?ip=202.204.80.112

<4>代码:

import requests
url = 'https://m.ip138.com/iplookup.asp?ip='
ip_addr = '202.204.80.112'
headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
        "Connection": "keep-alive",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
        "Accept-Language": "zh-CN,zh;q=0.8"}
# hd={'User-Agent':'Mozilla/5.0'}
try:
        r = requests.get(url+ip_addr, headers=headers)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        print(r.status_code)
        print(r.text)

except:
        print("产生异常")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值