4/26爬虫学习笔记 GET和POST小爬

模拟GET请求和POST请求

利用parse模块模拟GET请求

这个昨天已经说了 有兴趣的可以回过头来看一下

from urllib import request, parse
# 多了一个parse 
# urllib.parse: 包含即系url的方法


if __name__ == '__main__':
    url = "https://www.baidu.com/s?"
    wd = input("输入要搜索的东西:")

    # 要想使用data, 需要使用字典结构
    qs = {
        "wd": wd
    }
    # 转换url编码
    qs = parse.urlencode(qs)8


    fullurl = url + qs
    print(fullurl)

    rsp = request.urlopen(url)
    print(type(rsp))
    print(rsp)


    html = rsp.read()

    # 使用get取值保证不会出错
    html = html.decode()

利用parse模块模拟POST请求

"""
利用parse模块模拟post请求
分析百度翻译
分析步骤:
1- 浏览器浏览百度翻译打开F12
2- 尝试输入一个单词(我输入的是one) ,发现每敲一个字母后都有请求
3- 请求地址 https://fanyi.baidu.com/sug
4- 利用Network-all-hearders,查看,发现Formdata的值是 kw:one
5- 检查返回内容格式,发现返回的是json格式内容==>需要用到json包

"""
from urllib import request, parse
import json # 负责处理json格式的模块
"""
1- 利用data构造内容
2- 返回一个json格式的结果
3- 结果应该是用户输入的释义

"""
url = 'https://fanyi.baidu.com/sug'

a = input("输入想要翻译的一个单词:") # 只能一个词 或者一个字
# 存放用来模拟form的数据一定屎dict格式
data = {
    # a屎翻译输入的内容,由用户输入
    'kw': a
}
# 需要使用parse模块对data进行编码
data = parse.urlencode(data).encode()

# 我们需要构造一个请求头,请求头部应该至少是包含传输入的数据的长度
# request要求传入的请求头是一个dict格式

headers = {
    # 因为使用post,至少应该包含content-length 字段
    'Content-Length':len(data)
}
# 有了headers,data,url就可以尝试发出请求了
rsp = request.urlopen(url, data=data)

json_data = rsp.read().decode()
print(json_data)

# 把json字符串转化成字典
json_data = json.loads(json_data)
print(json_data)

# 打印里边每一个所谓的K,V值
for itme in json_data['data']:
    print(itme['k'], "- -", itme['v'])
"""
- request.data使用
	- 访问网络的两种方法
		- get:
			- 利用参数给服务器传递信息
			- 参数为dict,然后parse编码
		- post:
			- 一般向服务器传递参数使用
			- post是吧信息自动加密处理
			- 我们如果想使用psot信息,需要用到data参数
			- 使用post,意味着http请求头可能需要更改:
				- content-type:application/x-www.form-urlencode
				- content-length: 数据长度
				- 简而言之,一旦更改请求方法,请注意其他请求头部信息相适应
			- urllib.parse.urlencode可以将字符串自动转换成上面的 
"""

使用Request

"""
利用parse模块模拟post请求
分析百度翻译
分析步骤:
1- 浏览器浏览百度翻译打开F12
2- 尝试输入一个单词(我输入的是one) ,发现每敲一个字母后都有请求
3- 请求地址 https://fanyi.baidu.com/sug
4- 利用Network-all-hearders,查看,发现Formdata的值是 kw:one
5- 检查返回内容格式,发现返回的是json格式内容==>需要用到json包

"""
from urllib import request, parse
import json # 负责处理json格式的模块
"""
1- 利用data构造内容
2- 返回一个json格式的结果
3- 结果应该是用户输入的释义

"""
url = 'https://fanyi.baidu.com/sug'

a = input("输入想要翻译的单词:")
# 存放用来模拟form的数据一定屎dict格式
data = {
    # a屎翻译输入的内容,由用户输入
    'kw': a
}
# 需要使用parse模块对data进行编码
data = parse.urlencode(data).encode()

# 我们需要构造一个请求头,请求头部应该至少是包含传输入的数据的长度
# request要求传入的请求头是一个dict格式

headers = {
    # 因为使用post,至少应该包含content-length 字段
    'Content-Length':len(data)
}

# 构造一个Request的实例
req = request.Request(url=url, data=data, headers=headers)

# 因为已经构造了一个Request的请求实例,则所有的请求信息都可以封装在Request实例中
rsp = request.urlopen(req)

json_data = rsp.read().decode()
print(json_data)

# 把json字符串转化成字典
json_data = json.loads(json_data)
print(json_data)

# 打印里边每一个所谓的K,V值
for itme in json_data['data']:
    print(itme['k'], "- -", itme['v'])

两个输出的结果是一样的

今天早上先讲到这

下午看情况发博客

每天发发博客记录自己

猜你喜欢

转载自blog.csdn.net/weixin_43854835/article/details/89538049