目录
request.data 的使用
- 访问网络的两种方法
- get:
- 利用参数给服务器传递信息,
- 参数为dict,然后用parse编码
- 案例1
- post
- 一般向服务器传递参数使用
- post是把信息自动加密处理
- 我们如果想使用psot信息,需要用到data参数
- 使用post,意味着Http的请求头可能需要更改:
- Content-Type: application/x-www.form-urlencode
- Content-Length: 数据长度
- 简而言之,一旦更改请求方法,请注意其他请求头部信息相适应
- urllib.parse.urlencode可以将字符串自动转换成上面的
- 案例2
- 为了更多的设置请求信息,单纯的通过urlopen函数已经不太好用了,需要利用request.Request 类
- 案例3
案例1:
from urllib import request, parse
'''
掌握对url进行参数编码的方法
需要使用parse模块
'''
if __name__ == '__main__':
url = 'http://www.baidu.com/s?'
wd = input("请输入关键字,比如大熊猫:")
# 做一个字典出来,要想使用data, 需要使用字典结构
qs = {
"wd": wd
}
# 转换url编码
qs = parse.urlencode(qs)
print(qs)
fullurl = url + qs
print(fullurl)
# 如果直接用可读的带参数的url,是不能访问的
#fullurl = 'http://www.baidu.com/s?wd=大熊猫'
rsp = request.urlopen(fullurl)
html = rsp.read()
# 使用get取值保证不会出错
html = html.decode()
print(html)
案例2:
'''
利用parse模块模拟post请求
分析百度词典
分析步骤:
1. 打开F12
2. 尝试输入单词girl,发现每敲一个字母后都有请求
3. 请求地址是 http://fanyi.baidu.com/sug
4. 利用NetWork-All-sug-Hearders,查看,发现FormData的值是 kw:girl
5. 检查返回内容格式,发现返回的是json格式内容==>需要用到json包
'''
from urllib import request, parse
# 负责处理json格式的模块
import json
'''
大致流程是:
1. 利用data构造内容,然后urlopen打开
2. 返回一个json格式的结果
3. 结果就应该是girl的释义
'''
baseurl = 'http://fanyi.baidu.com/sug'
# 存放用来模拟form的数据一定是dict格式
data = {
# girl是翻译输入的英文内容,应该是由用户输入,此处使用硬编码
'kw': 'girl'
}
# 需要使用parse模块对data进行编码
data = parse.urlencode(data).encode("utf-8")
print(type(data))
# 我们需要构造一个请求头,请求头部应该至少包含传入的数据的长度
# request要求传入的请求头是一个dict格式
headers = {
# 因为使用post,至少应该包含content-length 字段
'Content-Length':len(data)
}
# 有了headers,data,url,就可以尝试发出请求了,第三个参数应为 headers = headers,但是报错
rsp = request.urlopen(baseurl, data=data)
json_data = rsp.read().decode('utf-8')
print( type(json_data))
print(json_data)
# 把json字符串转化成字典
json_data = json.loads(json_data)
print(type(json_data))
print(json_data)
for item in json_data['data']:
print(item['k'], "--", item['v'])
案例3:
'''
任务要求和内容跟 案例2 一样
本案例只是利用Request来实现v5的内容
利用parse模块模拟post请求
分析百度词典
分析步骤:
1. 打开F12
2. 尝试输入单词girl,发现每敲一个字母后都有请求
3. 请求地址是 http://fanyi.baidu.com/sug
4. 利用NetWork-All-Hearders,查看,发现FormData的值是 kw:girl
5. 检查返回内容格式,发现返回的是json格式内容==>需要用到json包
'''
from urllib import request, parse
# 负责处理json格式的模块
import json
'''
大致流程是:
1. 利用data构造内容,然后urlopen打开
2. 返回一个json格式的结果
3. 结果就应该是girl的释义
'''
baseurl = 'http://fanyi.baidu.com/sug'
# 存放用来模拟form的数据一定是dict格式
data = {
# girl是翻译输入的英文内容,应该是由用户输入,此处使用硬编码
'kw': 'girl'
}
# 需要使用parse模块对data进行编码
data = parse.urlencode(data).encode("utf-8")
# 我们需要构造一个请求头,请求头部应该至少包含传入的数据的长度
# request要求传入的请求头是一个dict格式
headers = {
# 因为使用post,至少应该包含content-length 字段
'Content-Length':len(data)
}
# 构造一个Request的实例
req = request.Request(url=baseurl, data=data, headers=headers)
# 因为已经构造了一个Request的请求实例,则所有的请求信息都可以封装在Request实例中
rsp = request.urlopen(req)
json_data = rsp.read().decode('utf-8')
print( type(json_data))
print(json_data)
# 把json字符串转化成字典
json_data = json.loads(json_data)
print(type(json_data))
print(json_data)
for item in json_data['data']:
print(item['k'], "--", item['v'])