day02、Requests模块
程序员文章站
2023-02-06 18:07:54
2.1、anaconda的安装 1 、安装可执行程序 2 、配置环境变量 根据环境变量的 去查找可执行程序文件,如果查找到就执行,如果查找不到就报错。 3 、python的多版本兼容问题 修改可执行程序的文件名,再配置环境变量 4 、hash案例 2.2、requests模块 ......
2.1、anaconda的安装
1 、安装可执行程序
2 、配置环境变量
根据环境变量的先后顺序
去查找可执行程序文件,如果查找到就执行,如果查找不到就报错。
3 、python的多版本兼容问题
修改可执行程序的文件名,再配置环境变量
4 、hash案例
import hashlib def md5_encryption(value): """ 对字符串进行加密 :param value:待加密的字符串 :return:进行md5加密后的值 """ md5 = hashlib.md5() md5.update(value.encode('utf-8')) return md5.hexdigest()
2.2、requests模块
一、 get请求
(1)、使用步骤
import requests # 1、导包 response = requests.get(url) # 2、发送请求,获取响应 response.text # 3、获取响应内容
(2)、get请求详细参数
requests.get( url=url, # 请求的url headers=headers # 请求头【字典】 params=params # 请求参数【字典】 ) # 返回一个response对象
(3)、response对象的属性
-
获取响应正文的内容
-
response.text
:获取字符串格式的响应正文内容 -
response.content
:获取二进制格式的响应正文内容
-
-
获取响应正文的编码类型:
response.encoding
之所以能够通过
response.text
获取响应内容的字符串,是因为requests底层
使用response.encoding
来将正文的二进制
类型变成字符串
的。 -
其他
-
response.status_code
:状态码 -
response.headers
:响应头
-
-
乱码问题的解决办法
产生乱码的原因就编解码时不一致,可以通过以下两种方法解决:
- a、response.content.decode('页面对应的编码格式')
- b、response.encoding='页面正确的编码',然后通过response.text就能获取正确的页面内容
-
get请求案例
案例一:将百度贴吧的前10页保存到本地
import requests import os base_url = 'http://tieba.baidu.com/f?' kw = '刘亦菲' # 搜索的关键词 headers = { 'user-agent': 'mozilla/5.0 (windows nt 6.1; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/78.0.3904.108 safari/537.36', } filename = './tieba/' + kw # 爬取的网页存放路径 if not os.path.exists(filename): # 如果不存在存放该网页的目录,就创建此目录 os.mkdir(filename) # 将网页的前10页保存到本地 for i in range(10): params = { 'kw': kw, 'ie': 'utf-8', 'pn': i*50 } response= requests.get(url=base_url, headers=headers, params=params) with open(filename+'/'+kw+str(i+1)+'.html', 'w', encoding='utf-8') as f: f.write(response.text)
案例二:百度翻译
import requests base_url = 'https://fanyi.baidu.com/sug/' kw = 'product' data = { 'kw': kw } headers = { 'user-agent': 'mozilla/5.0 (windows nt 6.1; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/78.0.3904.108 safari/537.36', 'x-requested-with': 'xmlhttprequest', 'cookie': cookie; 'origin': 'https://fanyi.baidu.com', 'referer': 'https://fanyi.baidu.com/', 'content-length': str(len(str(data))), # 参数内容中所有所有字符的长度 } response = requests.post(url=base_url, headers=headers, data=data) # 如果response的内容是json数据,可以通过reponse.json()直接获取json数据,返回的是一个字典或者list json_data = response.json() res = '' for data in json_data['data']: res += data['v'] + '\n' print(res)
二、 post请求
(1)、post请求详细参数
requests.get( url=url, # 请求的url headers=headers # 请求头【字典】 data=data # 请求参数【字典】 ) # 返回一个response对象
通常很多网页是通过ajax发送post请求获取数据,此时需要找发送ajax请求携带的数据,也就是请求参数。
找请求参数有两种方法:
- 查看这条ajax接口之前有没有发送过一些ajax接口,如果有,可能这些接口的其中一个的响应内容里面包含这个接口的数据。
- 有可能这个请求参数写死到页面中的。一般这种情况出现在滚动加载的第一版数据的获取,有可能这么做。
- 在js文件中去寻找参数。
案例一:有道翻译
import requests import hashlib import time import random base_url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule' kw = 'run' def get_md5(value): md5 = hashlib.md5() md5.update(value.encode('utf-8')) return md5.hexdigest() """ 由于salt、sign和ts这3个参数由fanyi.js文件中js动态生成的 因此在发送post请求前,需要去动态地生成它们的值 salt = "" + (new date).gettime() + parseint(10 * math.random(), 10) ts = "" + (new date).gettime() sign = n.md5("fanyideskweb" + e + salt + "n%a-rkat5fb[gy?;n5@tj") """ salt = str(time.time()*1000) + str(random.randint(1, 10)) sign = get_md5("fanyideskweb" + kw + salt + "n%a-rkat5fb[gy?;n5@tj") ts = str(int(time.time() * 1000)) data = { 'i': kw, 'from': 'auto', 'to': 'auto', 'smartresult': 'dict', 'client': 'fanyideskweb', 'salt': salt, 'sign': sign, 'ts': ts, 'bv': '710f3e24cb0088b9d9ea448919deb3bb', 'doctype': 'json', 'version': '2.1', 'keyfrom': 'fanyi.web', 'action': 'fy_by_realtlme' } headers = { 'user-agent': 'mozilla/5.0 (windows nt 6.1; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/78.0.3904.108 safari/537.36', 'x-requested-with': 'xmlhttprequest', 'origin': 'http://fanyi.youdao.com', 'referer': 'http://fanyi.youdao.com/', 'cookie': 'outfox_search_user_id_ncoo=1291930369.870429; _ga=ga1.2.27463077.1574943185; _gid=ga1.2.609141079.1574943185; outfox_search_user_id="10809467@10.108.160.18"; jsessionid=aaa7w8e0vjuz-5hrbd26w; ___rl__test__cookies=1575019115684', 'content-length': str(len(str(data))), } response = requests.post(url=base_url, headers=headers, data=data) json_data = response.json() res = '' for data in json_data['smartresult']['entries']: res += data print(res)