爬取网易云动态视频

2 篇文章 0 订阅
1 篇文章 0 订阅

上一次的文章已经爬去到动态视频的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("全部动态视频下载完成")

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值