爬取网易云动态视频
上一次的文章已经爬去到动态视频的id和视频名称
然后准备通过https://music.163.com/#/user/home?id=“id”
取得动态视频的页面再通过post请求加相应的
params’: {…} ‘encSecKey’: {…}—对其进行请求
但是!!!!
我请求了许多次,不管是生成的params还是浏览器上复制的params都不行-_-。sorry!网页提示参数错误,最后分析应该是需要传入一些参数,或者是什么问题我就不太清楚了,
如果有大佬有兴趣的话可以去看看js里还需要传入什么
而且如果留意上次的爬虫的话会发现⊙﹏⊙爬取的id和名称只有几个…这样的动态生成页面一 一+真的,想锤
使用Selenium
那么没办法咯,还是换一种方法吧^(- -)^
感觉这个Seleuinm自动化爬JavaScript的页面会好点,
最开始想选取PhantomJS这样无界面的浏览器引擎,但是百度了一下→_→算了,有些东西我不太想弄(很适合我的性格 一 一+)
最后直接用 Firefox(火狐浏览器) 来当爬取
过程很简单
from selenium import webdriver
browser = webdriver.Firefox()
当然还需要几个小点
- pip install selenium 安装selenium
- 下载geckodriver(安装Firefox驱动)并加入系统变量
运行起来也就这样,当然前提需要安装火狐浏览器
再browser.get(url_list)
请求网页OK
iframe
对于网易云这个动态的页面只有下来才成显示更多的视频(这里我们如果需要爬取全部视频)就需要我们用计算机模拟人下拉浏览器,而在我又发现网易云动态页面采用的是 iframe
iframe 标签一相当于在当前 HTML 文档中嵌入另一个文档。
说简单点就是主网页内的子网页
那么必须先定位到子网页才能做下拉操作
** Y(^_ ^ )Y
那么我们第一步照样先取得子网页的定位这样方便取得网页代码,之所以画3个箭头,因为id,class,name 都可以定位
直接写成下列两个都行
- browser.switch_to_frame(“g-topbar”)
- 或 browser.switch_to_frame(“contentFrame”)
print("正在获取页面数据请稍候......")
for i in range(翻页次数):
time.sleep(3)
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
id_datas=browser.find_elements_by_css_selector('div.info.f-pa')
print("正在遍历视频页面id")#取得视频id合成连接
至于翻页的次数,就看到底有需要爬的多少视频翻页的页数了,这里自己纠结我不在弄了
查找src
url_data=browser.find_elements_by_css_selector('video.media')
download_url=url_data[0].get_attribute('src')
直接给代码
使用find_elements_by_css_selector定位找到我们的3号标用于定位src的属性值
但是!!还是有几个坑的
- 在定位browser.find_elements_by_css_selector(‘video.media’)时应在前面加一个等待time.sleep(3),o(-"-)o我被这个坑了一下,我估计是当我请求网页完之后,网页会有几秒的数据加载时间(不要纠结这个了,反正你打开这个页面也不会第一时间给你加载完成)
- url_data 还回的是一个list列表
[<selenium.webdriver.firefox.webelement.FirefoxWebElement (session=“5454efaa-3d05-4a6b-949e-f4e33e64dff4”, element=“d6e70f96-e541-475a-992f-fe1ec4b1e932”)>]需要将数据提取再取属性值
最后下载 ok \(-o-)/
同时给上源码,(大佬们如果有好的改动和建议,请给一点提示为萌新加一点动力吧!!!)
from selenium import webdriver
import time,requests
browser = webdriver.Firefox()
html_url =input(str("请输入你想爬取是动态主页:"))
id_list=[]
def html_data(html_url):
browser.get(html_url)
browser.switch_to_frame("contentFrame")
print("正在获取页面数据请稍候......")
for i in range(4):
time.sleep(3)
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
id_datas=browser.find_elements_by_css_selector('div.info.f-pa')
print("正在遍历视频页面id")#取得视频id合成连接
for id_data in id_datas:
id_list.append(id_data.get_attribute('data-vid'))#全部id存入id_list
#browser.execute_script('alert("To Bottom")')
browser.quit()
return id_list
def download_data(id_lists):
for i in id_lists:
try :
browser = webdriver.Firefox()
url_list="https://music.163.com/#/video?id="+i
print("正在请求视频播放页面请稍候...")
print("视频页面:"+url_list)
time.sleep(1)
browser.get(url_list)
browser.switch_to_frame("contentFrame")
#取得视频下载地址
time.sleep(3)
url_data=browser.find_elements_by_css_selector('video.media')
print(url_data[0])
time.sleep(1)
downloads=url_data[0].get_attribute("src")
print(downloads)
time.sleep(0.1)
#取得视频名称
name=browser.find_elements_by_css_selector('h2.f-ff2.f-thide')
name=name[0].get_attribute("title")
print(name)
#取得音乐人名称
title=browser.find_elements_by_css_selector('a.s-fc7')
title=title[0].get_attribute("title")
print(title)
names=name+title
print("请求成功正在寻找下载视频url 请稍候...")
time.sleep(2)
print("发现视频下载地址》》》》》正在下载中》》》请稍候》》》》")
download = requests.get(downloads).content
with open(names+".mp4","wb")as file:
file.write(download)
time.sleep(5)
browser.quit()
except:
print("有待研究")
browser.quit()
if __name__=="__main__":
download_data(html_data(html_url))
time.sleep(1)
print("全部动态视频下载完成")