[CP_08] Python爬虫之requests库数据挖掘(代
目录结构
1. requests安装&使用
2. 添加请求头和参数
3. 处理POST请求
4. 代理IP
5. 获取响应的cookie
6. session实现登录
7. requests库案例实践:爬取音乐资源
1. requests安装&使用
安装:
pip install requests
查看安装的包文件:
pip list
调试requests:
requests001.py
import requests
# resp=requests.get("http://www.sogou.com")
# resp=requests.get("http://www.sogou.com").text
resp=requests.get("http://www.sogou.com").content.decode()
print(resp)
2. 添加请求头和参数
get.py
import requests
header={
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; rv:65.0) Gecko/20100101 Firefox/65.0"
}
query={"query":"Python测试"}
resp=requests.get("http://www.sogou.com/web?",params=query,headers=header)
data1=resp.text # 返回一个字符串形式数据
data2=resp.content # 返回一个二进制形式的数据
print(data1.encode('GBK','ignore').decode('GBK'))
print(data2)
PS:
① 网页爬取的响应数据默认转化为Unicode编码
② print()函数需要把编码转化为GBK来处理才能显示
③ str.encode('GBK','ignore').decode('GBK'):忽略非法字符,将Unicode编码的字符串转为GBK编码,再作解码
3. 处理POST请求
post.py
import requests
import re
header={
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; rv:65.0) Gecko/20100101 Firefox/65.0"
}
url="http://fanyi.youdao.com/translate?smartresult:dict&smartresult:rule"
words=input("翻译词语:")
# POST请求需要提交的参数(表单数据为字典类型)
formdata={
"i":words,
"from":"AUTO",
"to":"AUTO",
"smartresult":"dict",
"client":"fanyideskweb",
"salt":"15535312968212",
"sign":"d6bd41d13ab6467bec455ff06c356b33",
"ts":"1553531296821",
"bv":"e2a78ed30c66e16a857c5b6486a1d326",
"doctype":"json",
"version":"2.1",
"keyfrom":"fanyi.web",
"action":"FY_BY_REALTlME",
"typoResult":"false"
}
# 发送POST请求,获取响应数据(字符串)
resp=requests.post(url,headers=header,data=formdata).text
# 定义正则,从响应字符串中提取翻译的内容
pat=r'"tgt":"(.*?)"'
result=re.findall(pat,resp) # 列表
# 从列表中获取翻译的有效内容
print("翻译结果:",result[0])
print("---------------------------")
print(type(resp))
print(resp)
4. 代理IP
在urllib库中代理IP使用的大致步骤如下:
①提前准备可用的代理IP地址:proxylist=[IP1,IP2,...]
②加入到自定义代理处理器中:proxyHandler=request.ProxyHandler(proxy)
③将代理处理器加入自定义opener对象中:
opener=request.build_opener(ProxyHandler)
④创建请求对象:req=request.Request(url)
⑤发送请求,获取响应:resp=opener.open(req).read().decode()
而在requests库中代理IP的使用则进行更为简化的处理,如下:
proxy.py
import requests
# 设置代理IP地址(字典形式)
proxy={
"http":"http://211.149.172.228:9999",
"https":"https://116.196.90.181:3128",
}
url="http://www.sogou.com"
# 创建请求,传入代理参数;获取响应数据
resp=requests.get(url,proxies=proxy)
data=resp.text # 以文本形式获取响应信息
print(resp)
print(data)
代理IP传送门1:西刺免费代理IP
代理IP传送门2:66免费代理
5. 获取响应的cookie
cookie.py
import requests
# 发送请求,获取响应
url="http://www.sogou.com"
resp=requests.get(url)
# 获取返回的cookiejar对象
cookiejar=resp.cookies
# 将cookiejar转换为字典形式
cookie=requests.utils.dict_from_cookiejar(cookiejar)
print(cookie)
6. session实现登录
- cookie存在于浏览器端,本身受有效期限制,某个cookie超过有效期会退出登录
- session通过登录的用户名&密码获取最新的cookie,本质上也是传递cookie实现登录,保持长期有效登录状态
案例:利用session传递cookie实现登录指定网站
分析:
input元素的属性中:name属性定义input元素的名称,用于程序调用;value属性规定input元素的值,即提交给服务器的数据
在浏览器中通过F12定位元素,获取登录的用户名和密码所对应的name属性名,分别为email、password
代码实现:
session.py
import requests
header={
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; rv:65.0) Gecko/20100101 Firefox/65.0"
}
url="http://localhost/dvwa/login.php"
# 创建session对象
sess=requests.session()
# 构造登录需要的参数(从浏览器元素定位获取键的名称)
login_data={"username":"admin","password":"password"}
# 利用session对象发送POST请求(带上用户登录信息)
# 通过传递用户名&密码,获取最新的cookie信息,保持登录状态
sess.post(url,headers=header,data=login_data)
# 请求需要的页面
resp=sess.get("http://localhost/dvwa/security.php",headers=header)
data=resp.text
print(data)
7. requests库案例实践:爬取音乐资源
案例:获取某音乐站点的音乐列表,然后依次对每一首音乐进行下载到本地存储
分析:
观察音乐列表的分页url,如下:
xxx/easy-listening-music?page=1
xxx/easy-listening-music?page=2
xxx/easy-listening-music?page=3
...
分页页码规律:page=页码数字
对于每一首音乐,对应的下载链接:
音乐url:xxx/59045.html
下载url:xxx/download?id=59045
music-download.py
import requests
import re
import time
header={
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; rv:65.0) Gecko/20100101 Firefox/65.0"
}
# 定义列表:存储音乐名、音乐id
musicName=[]
musicId=[]
# 音乐名称、id获取、存储
for i in range(1,2):
pageUrl="xxx?page="+str(i)
# 获取音乐列表的html网页信息
html=requests.get(pageUrl)
data=html.text
# 定义正则匹配,提取音乐Id、Name
pat1=r'href="/midi/(.*?).html"'
pat2=r'.html">(.*?)</a></strong>'
idList=re.findall(pat1,data)
nameList=re.findall(pat2,data)
# 将每个提取的数据集合到所定义的列表中存放
musicId.extend(idList)
musicName.extend(nameList)
# 音乐下载、存储
for i in range(0,len(musicId)):
mUrl="xxx/download?id="+str(musicId[i])
mName=musicName[i]
resp=requests.get(mUrl,headers=header)
data=resp.content # 音乐为字节码(二进制数据),需要用content
print("正在下载第",i+1,"首")
# 写入到本地;将每一首音乐名填充到下载的音乐mp3格式名字中
with open(r"D:\CI_Env\Python_Test\file\music\{}.mp3".format(mName),"wb") as f:
f.write(data)
time.sleep(1)