c 抓取网页数据(在开始之前,做一点小小的说明哈:Part1进行网页分析)
优采云 发布时间: 2022-01-30 14:07c 抓取网页数据(在开始之前,做一点小小的说明哈:Part1进行网页分析)
在开始之前,先做一点解释:
Part1 网页分析
先打开网易云网页版网易云
然后搜索歌曲,这里我会搜索金凌的《空山新雨女王》
这时候我们观察网页的url,可以发现我们搜索的关键字在s=后面
当我们换一首歌的时候,我们会发现也是一样的,这正好验证了我们的想法
所以接下来就是点击一首歌曲,然后播放,看看我们能不能直接获取到音乐文件的url。如果可以,那么直接通过requests.get访问url,就可以得到.mp3文件了。
点击第一首歌《空山新雨之后》,我们可以看到有一个“生成外链播放器”
看到这里,我一阵激动,仿佛快要完结似的;所以我高兴地点击,结果就是结果。. .
好吧,但我们不能放弃,我们来分析一下页面
但是当我们找到两个最有可能的外部链接位置时,我们什么也没找到
不过,作为“严格规范,功夫在家”的传承人,我不能放弃,所以我又打开了抓包工具
按照常规套路,我们定位XHR
点击播放后,出现了很多东西,我们要做的就是找到一个content-type为audio的包。
努力有回报,找了(一亿)时间,我找到了
于是我愉快的复制了这个包对应的Request-URL
粘贴后访问这个url,结果很满意,这是我一直在找的url
现在我发布那个网址
https://m10.music.126.net/20200715163315/a075d787d191f6729a517527d6064f59/ymusic/0552/0f0e/530f/28d03e94478dcc3e0479de4b61d224e9.mp3
Part2 编写爬虫
超级简单
下面的代码是最常见的操作,有爬虫基础的人都应该明白;如果有不懂的地方,评论就在上面
#导入requests包
import requests
#进行UA伪装
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36'
}
#指定url
url = 'https://m10.music.126.net/20200715163315/a075d787d191f6729a517527d6064f59/ymusic/0552/0f0e/530f/28d03e94478dcc3e0479de4b61d224e9.mp3'
#调用requests.get方法对url进行访问,和持久化存储数据
audio_content = requests.get(url=url,headers=headers).content
#存入本地
with open('空山新雨后.mp3','wb') as f :
f.write(audio_content)
print("空山新雨后爬取成功!!!")
Part3 更高级
看到这里,你可能会想,为什么 selenium 模块根本没有用到呢?我可以直接抓取我想要的任何歌曲,而无需为每首歌曲找到一个网址吗?当然可以!
其实,网易云在线播放每首歌的时候,都有一个外链地址,是不会变的。它与每首歌曲的唯一 id 绑定。每首歌曲的音频文件的url如下:
url = 'http://music.163.com/song/media/outer/url?id=' + 歌曲的id值 + '.mp3'
id值的获取也很简单。当我们点击每首歌曲时,上面会出现对应的URL,并且有一个id值,如下图:
所以只要把上面程序中的url改成新的url
如果还想要更好的体验,需要使用 selenium 模块直接在程序中搜索歌曲并获取 id 值。
为什么使用 selenium 而不是 xpath 或 bs4?
因为搜索页面的数据是动态加载的,如果直接解析搜索页面的数据,是不会得到任何数据的;以我目前的技术,我只能想到使用万能的 selenium 模块。下面简要说明这些步骤。:
在没有可视界面的情况下设置 selenium
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
指导包
import requests
import re
from selenium import webdriver
from time import sleep
指定歌曲并获取对应搜索页面的url
name = input('请输入歌名:')
url_1 = 'https://music.163.com/#/search/m/?s=' + name + '&type=1'
获取搜索页面的html文件
#初始化browser对象
browser = webdriver.Chrome(executable_path='chromedriver.exe',chrome_options=chrome_options)
#访问该url
browser.get(url=url_1)
#由于网页中有iframe框架,进行切换
browser.switch_to.frame('g_iframe')
#等待0.5秒
sleep(0.5)
#抓取到页面信息
page_text = browser.execute_script("return document.documentElement.outerHTML")
#退出浏览器
browser.quit()
使用正则模块re匹配html文件中的id值、歌名和歌手
ex1 = '(.*?)</a>'
id_list = re.findall(ex1,page_text,re.M)[::2]
song_list = re.findall(ex2,page_text,re.M)
singer_list = re.findall(ex3,page_text,re.M)
将id值、歌名和歌手封装成元组,写入列表,然后打印
li = list(zip(song_list,singer_list,id_list))
for i in range(len(li)):
print(str(i+1) + '.' + str(li[i]),end='\n')
你可以获取一个 url 以获得满意的 id 值,然后使用上面的程序通过 requests.get 方法访问该 url。Part4 总结
毕竟是我的天赋和知识,这种寻找外部链接进行爬取的方法也有很多不足之处。例如,无法在线播放的歌曲无法下载。
不过,写这么个小程序练手,确实对提升一个人的能力有很大的帮助。