环境 Python 3.6 Pycharm 模块使用 import os import requests import parsel import re # 模块安装 ''' 如何安装模块: 1. win + R 输入 cmd 输入安装命令: pip install 模块名 回车 2. pycharm里面安装 terminal 输入安
环境
- Python 3.6
- Pycharm
模块使用
import osimport requests
import parsel
import re
# 模块安装
'''
如何安装模块:
1. win + R 输入 cmd 输入安装命令: pip install 模块名 回车
2. pycharm里面安装 terminal 输入安装命令: pip install 模块名 回车
模块安装失败的原因:
1. 提示:pip 不是内部命令 你python环境变量可能没有设置好
2. 有安装进度条显示,但是安装到一半出现报错了 因为python安装模块都是在国外的网址进行下载安装的, 国内请求国外 网速很慢,下载速度大 概只有 几KBread time out 网络连接超时 你可以切换为国内的镜像源
3. 明明在cmd里面安装好了,但是在pycharm 提示我没有这个模块 你pycharm里面python解释器没有设置,你在pycharm设置里面重新设置一下
'''
觉得Python自己学不下去的,或者不知道该怎么学,怎么样把知识变现的?
爬虫的基本思路
数据来源分析
代码实现过程
数据来源分析 >>> 发送请求 >>> 获取数据 >>> 解析数据 >>> 保存数据
完整代码
filename = 'music\\'if not os.path.exists(filename):
os.mkdir(filename)
def change_title(title):
pattern = re.compile(r"[\/\\\:\*\?\"\<\>\|]") # '/ \ : * ? " < > |'
new_title = re.sub(pattern, "_", title) # 替换为下划线
return new_title
# 1. 发送请求 对于榜单url地址发送请求
url = 'https://www.kugou.com/yy/html/rank.html'
# 请求头 作用: 伪装 把python代码伪装成浏览器发送请求
# 任意一个数据包的 user-agent 都是一样的
# user-agent 表示的就是浏览器的基本信息
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}
response = requests.get(url=url, headers=headers)
# 2. 获取数据 获取网页源代码数据
# print(response.text) # html 字符串数据(想直接解析字符串数据 只能用re) 转成 selector 对象
# 3. 解析数据 提取所有榜单相对应的url地址
selector = parsel.Selector(response.text)
# print(selector)
# css选择器 根据标签的内容 提取想要的数据
# 第一次提取 获取li 标签
lis = selector.css('.pc_rank_sidebar li')
lis = lis[13:]
# 返回的是列表, 所以可以遍历 把里面每一个元素提取出来 Selector 对象
for li in lis:
title = li.css('a::attr(title)').get()
link_url = li.css('a::attr(href)').get()
print(f'=====================正在爬取{title}=====================')
# print(title, link_url)
# 4. 发送请求 对于 榜单的url地址发送请求
response_1 = requests.get(url=link_url, headers=headers)
# re.findall('')
# 5. 获取数据 获取网页源代码数据 response_1.text
# print(response_1.text)
# 6. 解析数据 提取音乐 hash 和 id 值
hash_list = re.findall('"Hash":"(.*?)"', response_1.text)
# \d 匹配一个数字 \d+ 匹配多个数字 .*? 可以匹配任意字符 (除了\n)
# 正则表达式匹配的数据 返回的是列表
album_id = re.findall('"album_id":(\d+),', response_1.text)
for index in zip(hash_list, album_id):
hash = index[0]
music_id = index[1]
# 7. 发送请求 把 hash 和 id 值 参数相对url里面 发送请求
index_url = 'https://wwwapi.kugou.com/yy/index.php'
params = {
'r': 'play/getdata',
# 'callback': 'jQuery19106964302346548317_1629810585326',
'hash': hash,
'dfid': '1JdWoI2IQjNS2aq9KB1Ylhf3',
'mid': 'fe0e97001229790f9065ef29dec3bdcd',
'platid': '4',
'album_id': music_id,
'_': '1629810585327',
}
response_2 = requests.get(url=index_url, params=params, headers=headers)
# json_data = response_2.json()['data']
music_name = response_2.json()['data']['audio_name']
new_name = change_title(music_name)
music_url = response_2.json()['data']['play_url']
if music_url:
music_content = requests.get(url=music_url, headers=headers).content
with open(filename + new_name + '.mp3', mode='wb') as f:
f.write(music_content)
print(music_name)