requests
import requests
#方法 #说明
requests.requst() # 构造一个请求,最基本的方法,是下面方法的支撑
requests.get() # 获取网页,对应HTTP中的GET方法
requests.post() # 向网页提交信息,对应HTTP中的POST方法
requests.head() # 获取html网页的头信息,对应HTTP中的HEAD方法
requests.put() # 向html提交put方法,对应HTTP中的PUT方法
requests.patch() # 向html网页提交局部请求修改的的请求,对应HTTP中的PATCH方法
requests.delete() # 向html提交删除请求,对应HTTP中的DELETE方法
requests.get()
requests.get(url,params=None,headers,timeout)
# url:网址
# params:可以将字典传入到url中,作为携带的参数,拼接url
# headers:请求的头部信息,伪装成浏览器
# timeout:最长等待时间,否则报错
url = "http://www.baidu.com/s"
params = {"wd":"爬虫"}
r = requests.get(url=url,params=params)
print(r.url)
r.close() #关闭请求
# 运行结果: http://www.baidu.com/s?wd=%E7%88%AC%E8%99%AB
requests.post()
requests.post(url,data,json,params,headers)
# 将要发送的数据封装到data中,封装形式可以是字典、json、元组等
# 发送字典
post_dict = {'key1': 'value1', 'key2': 'value2'}
# 发送元组
post_tuple = (('key1', 'value1'), ('key1', 'value2'))
# 发送json
post_json = {'some': 'data'}
r1 = requests.post(url, data=post_dict)
r2 = requests.post(url,data=post_tuple)
r3 = requests.post(url, json=post_json)
如果出现ssl证书的报错:请求异常,连接超过最大连接次数,最后是因为证书认证失败。
那么我们可以用verify关键字参数,在请求的时候不验证网站的ca证书
response = requests.get( "url",verify=False)
# verify=False 去掉安全验证
Response
每次调用 requests 请求之后,会返回一个 response 对象,该对象包含了具体的响应信息。如下:
属性或方法 | 说明 |
---|---|
apparent_encoding | 编码方式 |
close() | 关闭与服务器的连接 |
content | 返回响应的内容,以字节为单位 |
cookies | 返回一个 CookieJar 对象,包含了从服务器发回的 cookie |
elapsed | 返回一个 timedelta 对象,包含了从发送请求到响应到达之间经过的时间量,可以用于测试响应速度。比如 r.elapsed.microseconds 表示响应到达需要多少微秒。 |
encoding | 解码 r.text 的编码方式 |
headers | 返回响应头,字典格式 |
history | 返回包含请求历史的响应对象列表(url) |
is_permanent_redirect | 如果响应是永久重定向的 url,则返回 True,否则返回 False |
is_redirect | 如果响应被重定向,则返回 True,否则返回 False |
iter_content() | 迭代响应 |
iter_lines() | 迭代响应的行 |
json() | 返回结果的 JSON 对象 (结果需要以 JSON 格式编写的,否则会引发错误) |
links | 返回响应的解析头链接 |
next | 返回重定向链中下一个请求的 PreparedRequest 对象 |
ok | 检查 "status_code" 的值,如果小于400,则返回 True,如果不小于 400,则返回 False |
raise_for_status() | 如果发生错误,方法返回一个 HTTPError 对象 |
reason | 响应状态的描述,比如 "Not Found" 或 "OK" |
request | 返回请求此响应的请求对象 |
status_code | 返回 http 的状态码,比如 404 和 200(200 是 OK,404 是 Not Found) |
text | 返回响应的内容,unicode 类型数据 |
url | 返回响应的 URL |
实例:
import requests
kw = {'s':'python 教程'}
headers = {"User-Agent": "Mozilla/5..."}
# params 接收一个字典或者字符串的查询参数,字典类型自动转换为url编码,不需要urlencode()
response = requests.get("https://www.runoob.com/", params = kw, headers = headers)
# 查看响应状态码
print (response.status_code)
# 查看响应头部字符编码
print (response.encoding)
# 查看完整url地址
print (response.url)
# 查看响应内容:response.text返回的是html头部Unicode格式的数据
print(response.text)
----------------
运行结果
200
UTF-8
https://www.runoob.com/?s=python+%E6%95%99%E7%A8%8B
...返回的html代码...
----------------
返回html响应内容用.text不是所有时候显示都正常,这是就需要用
.content.decode()进行手动编码。
例:
url = "http://www.baidu.com"
r = requsets.get(url=url).content.decode('utf-8')
print(r)
# 运行结果:...<input type=submit id=su value=百度一下 class="bg s_btn"></span>...
得到响应之后,记得关闭这条请求
response = requests.get(url=url,headers=header)
response.close()
session 会话
session 其实是一个会话类,requests 的所有请求方法,底层都是调用的这个类的对象。
其他方法和 session 的区别在于:
直接使用 requests 调用请求方法发送请求,每次都会创建一个新的 session(会话对象),所以没有之前请求的 cookies 信息
直接创建一个 session 对象来发请求,那么每次发请求用的都是这个会话对象,所有能够保存之前的会话信息(cookies 数据)
url = 'https://www.baidu.com'
headers = {
'User-Agent':UserAgent().random
}
s = requests.Session()
##### 第一次访问
r = s.get(url=url,headers=headers)
print("首次的请求头是:",r.request.headers)
print("设置的cookie是::",requests.utils.dict_from_cookiejar(r.cookies))
########## 第二次访问
rr = s.get(url=url,headers=headers)
print("第二次的请求头是:",rr.request.headers)
-----------------------------------------------------------------------------
运行结果:
首次的请求头是: {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.66.18) Gecko/20177177 Firefox/45.66.18', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
设置的cookie是:: {'BAIDUID': 'EACE029FC9A984029D658312093A26C6:FG=1', 'BIDUPSID': 'EACE029FC9A98402451D675B5AA498AE', 'H_PS_PSSID': '36543_37647_38024_37907_36920_37990_37795_37926_37900_26350_37881', 'PSTM': '1672410582', 'BDSVRTM': '19', 'BD_HOME': '1'}
第二次的请求头是: {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.66.18) Gecko/20177177 Firefox/45.66.18', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'BAIDUID=EACE029FC9A984029D658312093A26C6:FG=1; BIDUPSID=EACE029FC9A98402451D675B5AA498AE; H_PS_PSSID=36543_37647_38024_37907_36920_37990_37795_37926_37900_26350_37881; PSTM=1672410582; BDSVRTM=19; BD_HOME=1'}
进程已结束,退出代码0
第一次访问的请求是没有cookie信息的,但是服务器端返回了cookie,保存在了这个session会话中,所以第二次在访问的时候,请求头里就有了cookie信息。由此可得session是维持会话状态的
评论区