c 抓取网页数据(在开始之前,做一点小小的说明哈:Part1进行网页分析)

优采云 发布时间: 2022-01-30 14:07

  c 抓取网页数据(在开始之前,做一点小小的说明哈: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 = &#39;(.*?)</a>&#39;

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) + &#39;.&#39; + str(li[i]),end=&#39;\n&#39;)

  你可以获取一个 url 以获得满意的 id 值,然后使用上面的程序通过 requests.get 方法访问该 url。Part4 总结

  毕竟是我的天赋和知识,这种寻找外部链接进行爬取的方法也有很多不足之处。例如,无法在线播放的歌曲无法下载。

  不过,写这么个小程序练手,确实对提升一个人的能力有很大的帮助。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线