第二章 requests模块介绍

一、准备工作之anaconda的安装

1.anaconda:一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项,安装anaconda避免了pip install流程。

2.配置环境变量
(1)为什么要配置环境变量?
在cmd中输入一个python,其实操作系统会先从path环境变量里面的文件路径【从头】开始中去查找是否有python.exe可执行文件,如果能找到,就运行,不能找到就报错。
(2) 默认使用annaconda
把anaconda的环境变量配置放在python3.6前面,就会默认执行anaconda的python.exe程序。
(3)python的多版本兼容问题。
如果系统中有两个版本—python2和python3
只需要改一下python.exe和pip.exe的名字即可,把python2版本的python.exe改成Python2.exe,而python3的就改成 python3.exe,在cmd中,输入python2就可以进入2版本,输入python3就可以进入3版本。

二 Hash算法

1.定义
Hash :散列,通过关于键值(key)的函数,将数据映射到内存存储中一个位置来访问。这个过程叫做Hash,这个映射函数称做散列函数,存放记录的数组称做散列表(Hash Table),又叫哈希表。
2,哈希函数要求
	**a,确定性**:确定性算法,算法执行过程不引入任何随机量。这意味着相同消息的哈希结果一定相同。
	**b,高效性**:给定任意一个消息m,可以快速计算
	**c,目标抗碰撞性**:给定任意一个消息m1,很难找到另一个消息m2,使得hash(m0)=hash(m1)
	**d,广义抗碰撞性**:很难找到两个消息m0不等于m1的情况下,使得hash(m0)=hash(m1)
3.优点
**先分类,再查找,通过计算,缩小范围,加快查找速度**
4.Hash的作用
	a,数字签名:给数据打指纹
	b,密码存储
5.hash算法的特性
	a,正向快速
	b,逆向困难
	c,输入敏感:原始信息一点差别,hash值差距很大
	d,冲突避免
6.Hash有哪些流行的算法
	MD5,SHA (Secure Hash Algorithm)当前使用 SHA-256
7.使用hash对字符加密
(1)对字符加密案例
# 导入hash
import hashlib
#使用md5 对字符串加密
def get_str_hash(value):
    '''
       对字符串加密
       :param value: 需要加密的字符串
       :return: 字符串对应hash值
    '''
    # 1,创建一个md5对象
    md5 = hashlib.md5()
    # 2.加密内容更新到对象中
    md5.update(value.encode('utf-8'))
    # 3.返回加密内容
    return md5.hexdigest()
print(get_str_hash('hello'))

三 requests模块

1,get请求
(1) 使用步骤:
#1、导包:
import requests
#2、发送请求,获取响应
response = requests.get(url)
#3、获取响应内容
response.text
(2)get请求详细参数
requests.get(
url=请求的url,
headers=请求头【字典】,
params=请求参数【字典】
)
(3)response对象的属性
a、获取响应正文
获取响应正文的字符串格式数据:response.text
获取响应正文的二进制格式数据:response.content
b、编码:response.encoding:
之所以能够通过response.text获取响应内容的字符串,requests底层其实就是使用的response.encoding来将正文的二进制类型变成字符串的。
response.content.decode(response.encoding)
c、其他:
response.status_code:状态码
response.headers:响应头
response.encoding:编码格式
d、乱码问题的解决办法:
产生的原因就是编解码不一致
办法一:response.content.decode(‘页面对应的编码格式’)
办法二:response.encoding=‘页面正确的编码’
response.text就能获取正确的页面内容了。
(5) get请求爬取百度贴吧案例

# 导包
import requests
import os
'''
带参数的get请求的页面内容获取方法
分页的实现方法。'''
# 基础url
base_url = 'https://tieba.baidu.com/f?'
kw = 'lol'  # 变量
#封装请求头
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': 'lol',
        'ie': 'utf-8',
        'pn': i*50,
    }
    # 发送请求,接收响应
    response = requests.get(base_url,headers=headers,params=params)
    # 测试是否拿到数据
    # print(response.text)
    # 以二进制写入的方式,保存数据到本地
    with open(filename+kw+str(i+1)+'.html','w',encoding='utf-8')as fp:
        fp.write(response.text)
**2,post请求**
(1) 使用步骤:
	#1、导包:
	import requests
	#2 请求的数据,**字典格式**
	data = {}
	#3、发送请求,获取响应
	response = requests.post(url,data)
	#4、获取响应内容
	response.text
(2)post请求详细参数
requests.post(
	url=请求的url,
	headers = 请求头,
	data=请求数据,
)--->response对象
(3)post请求重要的请求头user-agent、x-requested-with、origin、referer、cookie、content-length
(4)如果response的内容是json数据,可以通过reponse.json()直接获取json数据,返回的是一个字典或者list
(5)找ajax接口的的数据,最重要的就是**分析请求参数**,如果不能获取数据,那就是请求参数有误,只要找到正确的请求参数获取方法,就可以解决这样的问题。确定是哪些请求参数在影响数据的获取,判断办法就是比对,比对两条ajax请求他们参数哪些发生了变化,变化的参数就是要解决的核心。

(6)找参数的办法有三种:
	1、第一种就是查看这条ajax接口之前有没有发送过一些ajax接口,如果有,可能这些接口的其中一个的响应内容里面包含这个接口的数据。
	2、有可能这个请求参数写死到页面中的。一般这种情况出现在滚动加载的第一版数据的获取有可能这么做。
	3、在js文件中去寻找参数。
(7)以爬取有道翻译为例,介绍找参数的第三种方法
import random
import time
import hashlib
import requests
# 基础url
base_url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
# 要翻译内容
kw = 'python'

通过输入翻译内容不同,发现以下三个参数salt,sign,ts会改变

js文件中response的内容解析后,发现 salt,sign,ts三个参数的产生过程以及关系

r = "" + (new Date).getTime(),  时间戳,单位毫秒
i = r + parseInt(10 * Math.random(), 10);   0-10的随机数
return {
    ts: r,
    bv: t,
    salt: i,
    sign: n.md5("fanyideskweb" + e + i + "n%A-rKaT5fb[Gy?;N5@Tj")  用md5对内容加密了 , e 猜测是翻译内容,因为在每个地方都有
}

在python中,自定义以上三个参数

# 定义加密函数
def get_md5(value):
    md5 = hashlib.md5()
    md5.update(value.encode('utf-8'))
    return md5.hexdigest()
    
# 翻译内容不同,以下三个参数会改变,
ts = str(int(time.time()*1000))  # js的时间是毫秒 ms, python的是 s,转化成ms
salt = ts + str(random.randint(0,10))
sign = get_md5("fanyideskweb" + kw + salt + "n%A-rKaT5fb[Gy?;N5@Tj")

定义请求数据和请求头,发送请求

# 请求数据
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=-2045059237@183.131.162.155; OUTFOX_SEARCH_USER_ID_NCOO=170404474.77977008; _ga=GA1.2.223536412.1574942778; _gid=GA1.2.668887961.1574942778; JSESSIONID=aaa_nVVzIswn2bMiqE26w; ___rl__test__cookies=1575019437771',
    'Content-Length': str(len(str(data))),
}

# 发送请求,接收响应
response = requests.post(base_url,headers=headers,data=data)
# 将字符串转换为jeson对象
jeson_data= response.json()
result = ''
for item in jeson_data['smartResult']['entries']:
    result +=item
print(result)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python requests模块是一个HTTP库,可以用来发送HTTP/1.1请求,并且可以自动处理HTTP响应。requests模块提供了简洁易用的API,使得发送HTTP请求变得非常简单。下面是requests模块的主要方法以及介绍: 1. requests.get(url, params=None, **kwargs) 发送GET请求。参数url是请求的URL地址,params是一个字典类型的参数,可以在URL中传递一些参数,**kwargs是其他可选参数,如请求头、超时时间等。 2. requests.post(url, data=None, json=None, **kwargs) 发送POST请求。参数url是请求的URL地址,data是POST请求的数据,json也是POST请求的数据,但是会以JSON格式发送,**kwargs是其他可选参数,如请求头、超时时间等。 3. requests.put(url, data=None, **kwargs) 发送PUT请求。参数url是请求的URL地址,data是PUT请求的数据,**kwargs是其他可选参数,如请求头、超时时间等。 4. requests.delete(url, **kwargs) 发送DELETE请求。参数url是请求的URL地址,**kwargs是其他可选参数,如请求头、超时时间等。 5. requests.patch(url, data=None, **kwargs) 发送PATCH请求。参数url是请求的URL地址,data是PATCH请求的数据,**kwargs是其他可选参数,如请求头、超时时间等。 6. requests.head(url, **kwargs) 发送HEAD请求。参数url是请求的URL地址,**kwargs是其他可选参数,如请求头、超时时间等。 除了以上方法,requests模块还提供了其他一些方法,如options、trace等,但是这些方法用得比较少。另外,requests模块还提供了一些属性,如cookies、headers等,可以用来获取请求的一些信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值