Python 课堂作业
episode6 Python 网络编程技术与爬虫
文章目录
前言
了解get&post区别
同:HTTP协议中的两种发送请求的方法,底层都是TCP/IP协议
👀——浏览器
get | post |
获取数据(也可提交) | 提交数据 |
请求数据(参数)放在url中 | 请求数据放在body中 |
参数直接暴露在url上,不安全 | 较为安全 |
参数有长度限制 | 没有限制 |
回退无影响 | 回退时需重新提交请求 |
请求可以被缓存 | 请求不会被缓存 |
请求会被保存在👀历史记录中 可被bookmark |
不会,也不可以被收藏为书签 |
只能进行url编码 | 支持多种编码方式 |
只接受ASCII字符 | 没有限制 |
通常产生一个TCP数据包 | 两个 |
会被浏览器主动cache | 不会,除非手动设置 |
👀会把head和data一并发送 服务器响应200 |
先发送header---100 再发送data---200 |
一、http协议常见状态码有哪些以及含义?
当我们访问一个网页时,浏览器会向网页所在服务器发出请求,当服务器收到请求后,就会解析请求并做出响应,同时服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。但是这个过程并不百分百成功,并且情况也很复杂,所以状态码就起到至关重要的作用的作用。
1** 系列
服务器收到请求,表示临响应,需要请求者继续执行操作;
100 Continue | 请求者(客户端)应当继续提出请求。服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。 |
101(切换协议) | 请求者已要求服务器切换协议,服务器已确认并准备切换。 |
2** 系列
操作被成功接收并处理;
200 OK(成功) | 务器已成功处理请求。通常表示服务器提供了请求的网页。如果是对robots.txt 文件显示此状态码,则表示 Googlebot 已成功检索到该文件。一般用于GET与POST请求 |
201(已创建) | 请求成功并且服务器创建了新的资源。 |
202(已接受) | 服务器已接受请求,但尚未处理。 |
203(非授权信息) | 服务器请求成功,但返回的meta信息不在原始的服务器,可能来自另一副本。 |
204 No Content (无内容) | 服务器请求成功,但没有返回任何内容。 |
205(重置内容) | 服务器请求成功,但没有返回任何内容。与 204 响应不同,此响应要求请求者重置文档视图(例如,清除表单内容以输入新内容)。 |
206(部分内容) | 服务器成功处理了部分 GET 请求。 |
3** 系列
重定向,需要进一步的操作以完成请求;
300(多种选择) | 针对请求,服务器可执行多种操作。服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。 |
301(永久移动) | 请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。您应使用此代码告诉 Googlebot 某个网页或网站已永久移动到新位置。 |
302(临时移动) | 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来响应以后的请求。此代码与响应 GET 和 HEAD 请求的 301 代码类似,会自动将请求者转到不同的位置。 |
303(查看其他位置) | 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。对于除 HEAD 之外的所有请求,服务器会自动转到其他位置。使用GET和POST请求查看。 |
304(未修改) | 自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。 如果网页自请求者上次请求后再也没有更改过,您应将服务器配置为返回此响应(称为 If-Modified-Since HTTP 标头)。服务器可以告诉 Googlebot 自从上次抓取后网页没有变更,进而节省带宽和开销。 |
305(使用代理) | 使用代理,请求资源必须通过代理访问。如果服务器返回此响应,还表示请求者应使用代理。 |
307(临时重定向) | 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来响应以后的请求。 |
301、302、307常用
391:永久重定向/移动请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替;
302:临时移动,与301相似,但资源只是临时被移动,客户端应继续使用原有URI;
307:临时重定向,与302相似,使用GET请求重定向。
4** 系列
客户端错误,请求包含语法错误或无法完成请求;
5** 系列
服务器错误,服务器在处理请求的过程中发生了错误;
二、Requests库是什么?
Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库,与urllib相比,Requests更加方便,可以节约我们大量的工作,建议爬虫使用Requests库。Requests是一个很实用的Python HTTP客户端库,编写爬虫和测试服务器响应数据时经常会用到,Requests是Python语言的第三方的库,专门用于发送HTTP请求。
三、使用步骤
1.通过pip3安装
pip3 install requests
2.验证安装
导入库成功,说明requests安装成功。
3.基本用法
代码如下(示例):🌰🌰🌰
使用requests()库中的get()方法发送一个get请求。
#导入requests库
import requests
#发送一个get请求并得到相应
r = requests.get('https://www.baidu.com')
#查看响应对象的类型
print(type(r))
#查看响应状态码
print(r.status_code)
#查看响应内容的类型
print(type(r.text))
#查看响应的内容
print(r.text)
#查看cookies
print(r.cookies)
运行结果:🌟 🌟 🌟
<class 'requests.models.Response'> 200 <class 'str'> <!DOCTYPE html> <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
其他类型的请求:🔍 🔍 🔍
r = requests.post('https://www.baidu.com')
r = requests.put('https://www.baidu.com')
r = requests.delete('https://www.baidu.com')
r = requests.head('https://www.baidu.com')
r = requests.options('https://www.baidu.com')
4.各个函数的功能介绍
get请求
核心代码:requests.get(url)
代码如下(示例):
🌰🌰🌰
import requests
url = 'http://baidu.com'
response = requests.get(url)
print(response)
运行结果:🌟 🌟 🌟
<Response [200]>
打印出来的结果是:<Response [200]>。 <>表示这是一个对象,也就是我们这里获取的是一个response的对象,200表示状态码。
post请求
核心代码:requests.post(url,data={请求体的字典}
代码如下(示例):
🌰🌰🌰
from dataclasses import dataclass
import requests
url = 'http://fanyi.baidu.com'
data = {'from': 'zh',
'to': 'en',
'query': '人生苦短,我用python'
}
response = requests.post(url,data=data)
print(response)
运行结果:🌟 🌟 🌟
<Response[200]>
Response方法
获取网页的解码字符串
通过上述例子可以看到,不管是get请求还是请求,我们得到的返回都是一个Response[200]的对象,但是我们想要获取的,是与网页response一样的字符串对象,这时就需要用到response方法。
代码如下(示例):
🌰🌰🌰
import time #不引入,会报错
import requests
url = 'http://baidu.com'
response = requests.get(url)
response.encoding = 'utf-8'
print(response.text)
运行结果:🌟 🌟 🌟
四、获取网页源码小结
1⃣️ response.contet.decode()
2⃣️response.content.decode('qbk')
3⃣️response.text
r.status_code 响应状态码
r.headers 响应头,以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
r.cookies 响应cookies
r.text 响应文本,字符串形式,会自动根据响应头的字符编码进行解码
r.content 响应文本,字节形式,会自动解码、gzip和deflate压缩
r.encoing 当前编码
r.content 以字节形式(二进制)返回
r.raw 返回原始响应体,也就是urllib的response对象,使用r.raw.read()读取
r.json() Requests中内置的JSON解码器
r.raise_for_status() 失败请求(非200 OK响应)抛出异常
代码如下(示例):
🌰🌰🌰
import requests
res= requests.get("http://www.baidu.com")
#获取请求头,向服务器发出请求
print(res.text)
print(type(res.headers),res.headers) #获取响应头,对发出的请求作出响应
print(type(res.cookies),res.cookies) #获取响应cookie
print(type(res.url),res.url) #获取响应url 输出变量类型+变量内容
#获取请求url
print(res.url)
运行结果:🌟 🌟 🌟
代码如下(示例)1:
🌰🌰🌰
import requests
res = requests.get(url='http://www.itwhy.org') #最简单的get请求
print(r.status_code) #获取返回状态码
res = requests.get(url='http://dict.baidu.com/s',params={'wd':'python'})#带参数的get请求
print(r.url)
print(r.text) #打印解码后的返回数据
运行结果1:🌟 🌟 🌟
代码如下(示例)2:
🌰🌰🌰
import requests
#requests.get('http://www.dict.baidu.com/s', params={'wd': 'python'}) #GET参数实例,错误的语法!!!
r = requests.get(url='http://dict.baidu.com/s', params={'wd':'python'}, timeout=60)
print(r.text)
r = requests.post('http://www.itwhy.org/wp-comments-post.php', data={'comment': '测试POST'}, timeout=60) #POST参数实例
print(r.content)
运行结果2:🌟 🌟 🌟
抛出异常:
ConnectionError: ('Connection aborted.', ConnectionResetError(54, 'Connection reset by peer')) ...
timeout限制时间 过长过短都会报错 ❓❗️
python requests没用_Python Requests中异常总结_weixin_39789399的博客-CSDN博客
python爬虫中处理超时的三种方法_Acheng1011的博客-CSDN博客_python超时处理
代码如下(示例)3:
🌰🌰🌰
import requests
import json
r = requests.post('https://api.github.com/some/endpoint',data=json.dumps({'some':'data'}))
print(r.json())
运行结果3:🌟 🌟 🌟
学习参考:Python爬虫Request轮子工具_顽强拼搏的阿k的博客-CSDN博客
requests库的使用(一篇就够了)_上善若水。。的博客-CSDN博客_request库
requests介绍与使用_偷懒的肥猫的博客-CSDN博客_requests
总结
本文讲述了Python爬虫的前期认识,更为详细具体的信息资源爬取见下篇~