python社区python爬虫Python学习资料整理

[CP_08] Python爬虫之requests库数据挖掘(代

2019-03-31  本文已影响117人  Fighting_001

目录结构

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实现登录

案例:利用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)
上一篇下一篇

猜你喜欢

热点阅读