爬虫之requests模块发送post请求
思考:哪些地方我们会用到POST请求?
登录注册( 在web工程师看来POST 比 GET 更安全,url地址中不会暴露用户的账号密码等信息)需要传输大文本内容的时候( POST 请求对数据长度没有要求)
所以同样的,我们的爬虫也需要在这两个地方会去模拟浏览器发送post请求
4.1 requests发送post请求的方法
response = requests.post(url, data)
data
参数接收一个字典
requests模块发送post请求函数的其它参数和发送get请求的参数完全一致
4.2 POST请求练习
【post数据来源:1.固定值:抓包比较不变值;2.输入值:抓包比较根据自身变化值;3.预设值-静态文件:需要提前从静态html中获取;4.预设值-发请求:需要对指定的地址发送请求;5.在客户端生成的:分析js,模拟生成数据】
下面面我们通过金山翻译的例子看看post请求如何使用:
地址:/
思路分析
抓包确定请求的url地址
2.确定请求的参数
3.确定返回数据的位置
4.模拟浏览器获取数据
4.2.3 抓包分析的结论
url地址:/
请求方法:POST
请求所需参数:
data = {'f': 'auto', # 表示被翻译的语言是自动识别't': 'auto', # 表示翻译后的语言是自动识别'w': '人生苦短' # 要翻译的中文字符串}
pc端User-Agent:
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
4.2.4 代码实现
了解requests模块发送post请求的方法,以及分析过移动端的百度翻译之后,我们来完成代码
import requestsimport jsonclass King(object):def __init__(self, word):self.url = "/ajax.php?a=fy"self.word = wordself.headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"}self.post_data = {"f": "auto","t": "auto","w": self.word}def get_data(self):response = requests.post(self.url, headers=self.headers, data=self.post_data)# 默认返回bytes类型,除非确定外部调用使用str才进行解码操作return response.contentdef parse_data(self, data):# 将json数据转换成python字典dict_data = json.loads(data)# 从字典中抽取翻译结果try:print(dict_data['content']['out'])except:print(dict_data['content']['word_mean'][0])def run(self):# url# headers# post——data# 发送请求data = self.get_data()# 解析self.parse_data(data)if __name__ == '__main__':# king = King("人生苦短,及时行乐")king = King("China")king.run()# python标准库有很多有用的方法,每天看一个标准库的使用