一、准备工作之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)