精华内容
下载资源
问答
  • 本文使用Selenium爬取QQ音乐歌曲及评论信息,面向新手,对使用到的技术有简单的介绍,附有完整代码。

    本文对使用到的技术仅做简单的介绍,若想了解更多,请前往相应的官网网站进行学习。
    本文适合对爬虫相关知识接触不多的新手,主要是普及Selenium如何做爬虫,大佬请跳过。


    1.Selenium简单介绍

    1.简介

    • Selenium是一个用于测试网站的自动化测试工具,支持各种主流界面浏览器。

    • 简而言之,Selenium是一个用来做网站自动化测试的库,它的定位是做自动化测试的。我们也可以利用它来做爬虫,获取一些网页信息,并且这种爬虫是模拟真实浏览器操作的,实用性更强。

    • Selenium是市面上唯一一款可以与付费产品竞争的自动化测试工具。

    • 如果想了解更多,可以前往Selenium中文网学习:戳我前往Selenium中文网

    2.安装

    • 要使用Selenium首先要在python中安装相关的库:
    pip install Selenium
    
    • 安装相应浏览器的webdricer驱动文件,这里提供chrome的链接,其它浏览器网上搜一搜就有。戳我前往下载chrome的webdriver驱动文件。选择合适的版本,我选择的是2.23。

    • 下载解压后得到exe文件,将这个文件拷贝到chrom的安装文件夹下:

      • 一般是C:\Program Files (x86)\Google\Chrome\Application,或者是C:\Program Files\Google\Chrome\Application
        在这里插入图片描述
    • 然后将该路径配置到环境变量中:

    在这里插入图片描述

    • 最后到写段代码测试一下:
    from selenium import webdriver
    driver=webdriver.Chrome(executable_path="C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
    
    • 如果看到开启了一个浏览器窗口就是成功了,否则下面会有相应的报错信息,需要检查前面的步骤。

    3.简单使用介绍

    1.元素定位方式:
    定位一个元素 定位多个元素 含义
    find_element_by_id find_elements_by_id 通过元素id定位
    find_element_by_class_name find_elements_by_class_name 通过类名进行定位
    find_element_by_tag_name find_elements_by_tag_name 通过标签定位
    find_elements_by_css_selector find_elements_by_css_selector 通过css选择器进行定位
    find_element_by_partial_link_text find_elements_by_partial_link_text 通过部分链接定位
    find_element_by_link_text find_elements_by_link_tex 通过完整超链接定位
    find_element_by_name find_elements_by_name 通过元素name定位
    find_element_by_xpath find_elements_by_xpath 通过xpath表达式定位
    parent 获取父级元素
    • 基本上前几种方式就能够获取到需要的元素,需要自己辨别结果是否唯一来选择相应的选择器。

    • 通过drive对象调用此方法,返回的是标签对象,或者是标签对象的列表,可以通过.text获取该标签下的文字,可以通过get_attribute()获取标签的其它属性值。

    分享快速定位元素的小妙招:看所需信息所在的标签的id,class,name的名称是否与标签下信息的语义有关,一般有关的都代表是唯一的。(从开发者的角度去思考)若无法通过当前标签唯一定位,则考虑父级标签,依此类推,总是能找到定位的方法的。

    2.鼠标事件(模拟鼠标操作)
    部分方法 方法作用
    click() 模拟鼠标左键点击
    context_click() 模拟鼠标右击
    double_click() 模拟鼠标双击
    drag_and_drop() 模拟鼠标拖动
    context_click() 模拟鼠标悬停
    • 通过标签对象调用即可。
    3.键盘事件(模拟键盘操作)
    部分方法 方法作用
    send_keys() 参数是字母,代表点击相应字母按键
    send_keys(Keys.CONTROL,‘v’) 两个参数,代表是组合键,依次类推,可以得到复制粘贴全选等操作
    send_keys(Keys.ENTER) 回车键
    send_keys(Keys.SPACE) 空格键(Space)
    send_keys(Keys.TAB) 制表键(Tab)
    send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
    4.其他操作
    • 其他操作包括控制浏览器的操作,获取断言信息,表单切换,多窗口切换,警告框处理,下拉框处理,文件上传操作,cookie操作,调用js代码,截图,关闭浏览器等操作,因为在这里用的不多,就没有一一罗列,自行去官网学习。

    2.爬取目标

    • 这个实战爬虫主要完成以下目标:

    • 爬取QQ音乐官网指定歌手的前5首歌曲的基本信息和前五百条热门评论。

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    1.获取前五歌曲的url

    • 分析该页面的代码得知,包裹所有歌曲信息的标签的class是唯一的,我们可以获取到它,再遍历所有子标签,也可以一次得到所有包裹歌曲信息的div,再获取里面的a标签。
      在这里插入图片描述

    2.获取歌曲基本信息

    • 可以看到基本信息标签里的class名称是有一部分带语义的,那么通过css选择器肯定可以唯一确定下来。
      在这里插入图片描述

    3.获取歌词

    • 页面上的歌词不完整,似乎需要点击展开才行,但其实所有歌词已经在标签里面了,只是显示的问题了。
      在这里插入图片描述

    4.获取前五百条评论消息

    • 我们可以看到热门评论一次是十五条,下面有一个点击加载更多链接,点了之后会多出15条。
    • 我们需要模拟点击33次,获得510条评论

    在这里插入图片描述

    5.写入CSV文件

    • 使用csv库,将爬取到的数据写入到csv文件中进行持久化。

    6.实现代码

    from selenium import webdriver
    import csv
    
    
    from time import sleep
    import time
    
    
    #
    #  Author : ATFWUS
    #  Date : 2021-03-21 20:00
    #  Version : 1.0
    #  爬取某个最热门五首歌曲的基本信息,歌词,前五百条热门评论
    #  此代码仅供交流学习使用
    #
    
    
    
    
    
    #1.创建Chrome浏览器对象,这会在电脑上在打开一个浏览器窗口
    driver=webdriver.Chrome(executable_path="C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
    
    #2.打开QQ音乐 -周杰伦页面
    driver.get("https://y.qq.com/n/yqq/singer/001t94rh4OpQn0.html")
    
    #3.配置
    csv_file = open('songs1.csv','w',newline='',encoding='utf-8')
    writer = csv.writer(csv_file)
    start = time.time()
    # 取前5首歌曲
    song_numer=5
    song_url_list=[]
    song_resourses=[]
    
    songlist__item=driver.find_elements_by_class_name("songlist__item")
    # 获取所有歌曲url
    for song in songlist__item:
        song__url=song.find_element_by_class_name("js_song").get_attribute("href")
        song_url_list.append(song__url)
        song_numer-=1
        if(song_numer==0):
            break
    # print(song_url_list)
    print("已获取当前歌手热门歌曲列表前五首的url")
    print()
    
    # 获取一首歌曲所需要的信息
    def getSongResourse(url):
        song_resourse={}
        driver.get(url)
        # 这个1.8秒用于等待页面所有异步请求的完成
        sleep(1.8)
    
        # 获取歌曲名
        song_name=driver.find_element_by_class_name("data__name_txt").text
    
        print("开始获取歌曲《"+song_name+"》的基本信息")
    
        # 获取流派,发行时间,评论数
        song_liupai = driver.find_element_by_css_selector(".js_genre").text[3:]
        song_time = driver.find_element_by_css_selector(".js_public_time").text[5:]
        song_comment_num = driver.find_element_by_css_selector(".js_into_comment").text[3:-1]
    
        print("歌曲《" + song_name + "》基本信息获取完毕")
    
        print("开始获取歌曲《" + song_name + "》的歌词")
    
        # 点击展开歌词
        driver.find_element_by_partial_link_text("[展开]").click()
        sleep(0.3)
        lyic=""
        # 获取拼接歌词
        lyic_box=driver.find_element_by_id("lrc_content").find_elements_by_tag_name("p")
        for l in lyic_box:
            if l.text!="":
                lyic+=l.text+"\n"
    
        print("歌曲《" + song_name + "》的歌词获取完毕")
    
        print("开始获取歌曲《" + song_name + "》的第1-15条热门评论")
    
        # 获取500条评论
        comments=[]
        # 点击加载更多29次,每次多出15条评论
        for i in range(33):
            try:
                driver.find_element_by_partial_link_text("点击加载更多").click()
            except:
                break
            print("开始获取歌曲《" + song_name + "》的第"+str((i+1)*15+1)+"-"+str((i+2)*15)+"条热门评论")
            sleep(0.5)
        comments_list=driver.find_element_by_css_selector(".js_hot_list").find_elements_by_tag_name("li")
        for com in comments_list:
            content=com.find_element_by_css_selector(".js_hot_text").text
            content_time=com.find_element_by_css_selector(".comment__date").text
            zan_num=com.find_element_by_class_name("js_praise_num").text
    
            comment = {}
            comment.update({"评论内容":content})
            comment.update({"评论时间":content_time})
            comment.update({"评论点赞次数":zan_num})
            comments.append(comment)
    
        print("歌曲《" + song_name + "》的前五百条热门评论获取完毕")
    
        print("歌曲《"+song_name+"》所有信息获取完毕")
        print()
        song_resourse.update({"歌曲名":song_name})
        song_resourse.update({"流派":song_liupai})
        song_resourse.update({"发行时间":song_time})
        song_resourse.update({"评论数":song_comment_num})
        song_resourse.update({"歌词":lyic})
        song_resourse.update({"500条精彩评论":comments})
        return song_resourse
    
    for song_page in song_url_list:
        song_resourses.append(getSongResourse(song_page))
    print("正在写入CSV文件...")
    for i in song_resourses:
        writer.writerow([i["歌曲名"],i["流派"],i["发行时间"],i["评论数"],i["歌词"]])
        for j in i["500条精彩评论"]:
            writer.writerow([j["评论内容"],j["评论时间"],j["评论点赞次数"]])
        writer.writerow([])
    csv_file.close()
    end = time.time()
    print("爬取完成,总耗时"+str(end-start)+"秒")
    
    
    
    
    

    7.代码注意事项

    • 注意在驱动对象get请求网页之后,要sleep一段时间,这段时间是网站用来进行ajax请求获取所需数据的,如果不sleep,那么你获取的数据很有可能是空的,或者是默认值。
    • 整个爬下来大概10分钟的样子,我已经将进度输出,不要提前关闭,因为我是最后才写入csv文件的, 提前关闭csv文件里什么也没有。
    • QQ音乐最近有个bug,就是点击去获取更多后,新增的15条评论还是最初的,可能也是网的原因,代码那里应该没有问题的。
    • 若某首歌曲的评论少于510条,会获取到所有的评论,但此时下面做数据读取的时候也要做相应的改变。
    • 这个代码主要用于爬取主要数据,很多模拟操作可能不完善。

    8.使用Pandas库简单的计算数据

    • 有关Pandas库的使用,它的两种数据结构,请查看官网,这里不做说明。戳我前往

    • 先读取csv文件中的数据到内存中,再进行操作。

    • 需要先安装pandas库:

    pip install pandas
    
    import pandas as pd
    import csv
    # 这五个列表用于创建Series
    se=[]
    names=[]
    # 先读取CSV文件的内容至内存中
    with open("songs1.csv",'r',encoding="utf8") as f:
        # 创建阅读器对象
        reader = csv.reader(f)
        rows = [row for row in reader]
        index=0
        print("开始解析CSV数据...")
        for i in range(5):
            s1=[]
            # 读取第一行信息
            names.append(rows[index].__str__().split(',')[0][2:-1])
            index+=1
            # 读取五百条评论的点赞消息
            for j in range(510):
                try:
                    s1.append(int(rows[index].__str__().split(',')[2][2:-2]))
                    index+=1
                except:
                    break
            se.append(s1)
            # 读取掉空行
            index+=1
        print("CSV数据解析成功\n")
    
    # 创建的5个series
    for i in range(5):
        series=pd.Series(se[i])
        print("歌曲《"+names[i]+"》的平均点赞次数是:" + str(series.mean()))
        print("歌曲《" + names[i] + "》的标准差是:" + str(series.std()))
        print()
    

    9.大致结果截图

    在这里插入图片描述
    在这里插入图片描述

    感叹:爬下几千条评论,看了之后,发现,有伤感那味了,哈哈哈

    展开全文
  • 爬取qq音乐

    千次阅读 2018-09-26 10:15:55
    今天早上闲着没事,看看qq音乐的评论爬取,当然我也没有具体的爬取哪些内容,只是分析了他的请求网址。 我总结出爬取网页信息的几个方式。首先直接查看网页源代码,查看网页源代码是否有你想要的信息,如果有的话...

         今天早上闲着没事,看看qq音乐的评论爬取,当然我也没有具体的爬取哪些内容,只是分析了他的请求网址。

          我总结出爬取网页信息的几个方式。首先直接查看网页源代码,查看网页源代码是否有你想要的信息,如果有的话直接请求网页然后解析就行了,这是最简单的方式。不过大多数的网站都是异步加载,这时候就需要使用谷歌或者火狐浏览器的开发者模式(f12),查看请求,然后找到相应的请求网址,这样的请求一般都会有请求参数,js加密。如果前两种方式都没有找到自己想要的数据源,直接ctrl+shift+f进行全局搜索,截取自己想要数据一部分进行搜索,这样一般会找到相应的数据,js解密就需要这样找到加密参数所在的js文件。这次qq音乐评论就是这样的一个请求方式。评论没有在源码,也没有在f12找到,全局搜索才找到的。

             这三个方式基本上可以找到大多数的信息,知道昨天遇到了个是这三种都没有的,它是直接在网页源代码里js生成数据,这样肯定是找不到数据的,对于实在是找不到在哪里的,直接selenium,这样所有的都可以获得,简单粗暴,不过时间比较长,对于爬取信息较少的可以采取这种方式,特别是爬取视频的时候,大多数小视频的播放地址都会通过f12在查看元素的时候找到。

           昨天晚上试验了一下scrapy-splash这个,确实获取js加载之后的内容,比如爬取京东,淘宝商品信息的时候,普通的请求是啥都没用的,渲染之后会将商品信息渲染出来,我准备试试能不能将视频的地址也给渲染出来,发现其他的都能出来,就是视频地址没用出现,可能是我脚本不够全面,我也不会写那个lua脚本,只是在网上找了一个实验一下。

     

    开始爬取qq音乐评论

          (1)找到信息请求:

              前面的简述上,直接采用全局搜索直接寻找评论所在的请求:

             我以这首歌https://y.qq.com/n/yqq/song/001Q3Rlo428b8g.html为例

              随便找个评论,随便截取一小段话就ok,然后全局搜素

    这就找到了相应的请求,然后复制url,到记事本上进行分析

    https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg?
    g_tk=5381&jsonpCallback=jsoncallback6258181076352154&loginUin=0&hostUin=0&format=jsonp
    &inCharset=utf8&outCharset=GB2312&notice=0&platform=yqq&needNewCode=0&cid=205360772
    &reqtype=2&biztype=1&topid=217264557&cmd=8&needmusiccrit=0&pagenum=0
    &pagesize=25&lasthotcommentid=&callback=jsoncallback6258181076352154
    &domain=qq.com&ct=24&cv=101010

           

      这是一个很长很长很长的url,不过里面大多数的参数是没有用的,这就需要你耐心的寻找参数。

     简化之后:

    https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg?
    g_tk=5381&reqtype=2&biztype=1&topid={歌曲id}&cmd=8&needmusiccrit=0&pagenum={页数}&
    pagesize=25&domain=qq.com&ct=24&cv=101010

    是否可以继续简化我也不知道,你们可以再试试,主要变化的是两个参数,歌曲的id和页码的变换,页码可以简单的构造,但是歌曲的id我们不知道,我们要先找到歌曲id,首先查看网页源代码里是否有,发现

    这就找到了,再试试其他的歌曲id能否成功,很显然是可以的。

    代码很简陋,毕竟我只是讲解分析的过程,至于详细的抓取那些,读者可以自己进行改进。qq音乐评论还是很简单的,没有加密参数,网易云的就比较难。

    import random
    import json
    import requests
    
    def get_html(song_id,num):
        user_agent = [
            "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
            "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
            "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
            "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko",
            "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
            "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)",
            "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
            "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
            "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
            "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
            "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11",
            "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11",
            "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
            "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)",
            "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)",
            "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
            "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)",
            "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)",
            "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
            "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)",
            "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
            "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
            "Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
            "Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5",
            "Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
            "MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
            "Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10",
            "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
            "Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.337 Mobile Safari/534.1+",
            "Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.70 Safari/534.6 TouchPad/1.0",
            "Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/20.0.019; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.18124",
            "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Titan)",
            "UCWEB7.0.2.37/28/999",
            "NOKIA5700/ UCWEB7.0.2.37/28/999",
            "Openwave/ UCWEB7.0.2.37/28/999",
            "Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999",
            "Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25",
    
        ]
        url='https://c.y.qq.com/base/fcgi-bin/fcg_global_comment_h5.fcg?g_tk=5381&reqtype=2&biztype=1&topid={id}&cmd=8&needmusiccrit=0&pagenum={num}&pagesize=25&domain=qq.com&ct=24&cv=101010'.format(id=song_id,num=num)
        headers={
            'user_agent':random.choice(user_agent)
        }
        h=requests.get(url=url,headers=headers)
        info=json.dumps(h.text)
        with open('./comment/qqmusic_comments{}.json'.format(num),'w',encoding='utf-8') as f:
            f.write(info)
    if __name__ == '__main__':
        for i in range(100):
            print("正在抓取第",i,"页")
            get_html('217264557',i)

     

     

     

     

    展开全文
  • 爬取QQ音乐

    千次阅读 2020-03-01 22:41:26
    # 获取音乐资源,guid是登录后才能获取,nin也是 def getVkey ( self ) : guid = "1282808556" #input('请输入guid:') uin = "641043558" #input('请输入uin:') for s in self . sl : ...
    import requests
    import json,os
    
    singer_list = ["陈明","辛晓琪","齐秦","羽泉","林志炫","杨宗纬","黄绮珊","彭佳慧","周晓欧","黄贯中","尚雯婕","沙宝亮","韦唯","韩磊","周笔畅","曹格","张宇","罗琦","邓紫棋","张杰","品冠","茜拉","满文军","动力火车","张靓颖","古巨基","胡彦斌","韩红","陈洁仪","黄丽玲","孙楠","李荣浩","李健","谭维维","郑淳元","李佳薇","萧煌奇"]
    
    class QQmusic:
        def __init__(self):
            self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'}
            self.sl = []
            self.musicList = []
    
        # 获取页面
        def getPage(self,url,headers):
            res = requests.get(url,headers = headers)
            res.encoding = 'utf-8'
            return res
    
        # 获取音乐songmid
        def getSongmid(self):
            num = 99#int(input('请输入获取条数:'))
            # num = 20
            for singer in singer_list:
                name = singer#input('请输入歌名或歌手:')
            # name = '张学友'
                url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p=1&n=%d&w=%s'%(num,name)
                # 搜索音乐
                res = self.getPage(url,headers=self.headers)
                html = res.text
                html = html[9:]
                html = html[:-1]
                # 获取songmid
                js = json.loads(html)
                songlist = js['data']['song']['list']
                for song in songlist:
                    print(song)
                    songmid = song['songmid']
                    name = song['songname']
                    self.sl.append((name,songmid))
                    print('获取成功songmid')
    
    
        # 获取音乐资源,guid是登录后才能获取,nin也是
        def getVkey(self):
            guid = "1282808556"#input('请输入guid:')
            uin = "641043558"#input('请输入uin:')
            for s in self.sl:
                print('开始获取资源')
                # 获取vkey,purl
                name = s[0]
                songmid = s[1]
                keyUrl = 'https://u.y.qq.com/cgi-bin/musicu.fcg?&data={"req":{"param":{"guid":" %s"}},"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"%s","songmid":["%s"],"uin":"%s"}},"comm":{"uin":%s}}'%(guid,guid,songmid,uin,uin)
                res = self.getPage(keyUrl,headers=self.headers)
                html = res.text
                keyjs = json.loads(html)
                try:
                    purl = keyjs['req_0']['data']['midurlinfo'][0]['purl']
                except:
                    print('error, continue')
                # 拼凑资源url
                url = 'http://dl.stream.qqmusic.qq.com/' + purl
                self.musicList.append((name,url))
                print('资源地址获取成功')
    
        #   下载音乐
        def downloadMusic(self):
            for m in self.musicList:
                url = m[1]
                res = self.getPage(url,headers=self.headers)
                music = res.content
                name = m[0] + '.mp3'
                try:
                    with open(name, 'wb') as f:
                        f.write(music)
                    print('下载OK')
                    f.closed
                except:
                    print("无法下载")
            
    
    
    QQ = QQmusic()
    QQ.getSongmid()
    QQ.getVkey()
    QQ.downloadMusic()
    
    
    
    展开全文
  • python爬虫 爬取qq音乐

    2018-11-05 23:18:46
    使用python爬取qq音乐,使用框架技术,完成qq音乐的正常页面爬取,模拟浏览器访问
  • 最新爬取QQ音乐

    万次阅读 多人点赞 2019-06-04 22:56:02
    爬取QQ音乐资源分析QQ音乐那么分析一下音乐的地址在哪里,我们最主要的就是资源地址 分析QQ音乐 首先打开相关音乐栏目页面,我们可以看到页面中失去了选择下一页了,被腾讯屏蔽了,强制要求下载,但是我们是爬虫...

    分析QQ音乐

    首先打开相关音乐栏目页面,我们可以看到页面中失去了选择下一页了,被腾讯屏蔽了,强制要求下载,但是我们是爬虫工程师呀,怎么可能会被拦阻
    没有更多了,回去吧,别爬了请认真对待,你是一个爬虫工程师,要这些表面的干什么,你要的是内在的,你要有内涵的

    那么分析一下音乐的地址在哪里,我们最主要的就是资源地址

    找出资源的请求地址,好了,咱们直接用 这个资源地址爬取就可以了
    把url提取出来看看
    这是我们找到的2条资源地址,这个地址,我们看看有什么规律
    http://isure.stream.qqmusic.qq.com/C4000026JiCu2LASHc.m4a?guid=7107896008vkey=76C1EFA596C08CFB7934D51F0B3567629FFCFA00064C8E3FAE093A0B923E26A7540DDF5E9A538E4CCF2F6DD21EE81F82D635C294DCB05E4&uin=264&fromtag=66

    http://isure.stream.qqmusic.qq.com/C400003kyC5M3AOStX.m4a?guid=7107896008vkey=FDB3D896A7FFF5B337CBB133DBA7D961D3D14413DD3324A9FDDB1F6EDE8AB2DD8D16369046E9D32E5F16FF244BCCDEE43087B830252D05B&uin=264&fromtag=66

    如果用requests请求的话,那么这两首歌就可以直接爬下来了,那么我们就直接完成,哈哈开玩笑,进读条就知道还没完

    /C4000026JiCu2LASHc.m4a?
    guid=7107896008
    vkey=76C1EFA596C08CFB7934D51F0B3567629FFCFA00064C8E3FAE093A0B923E26A7540DDF5E9A538E4CCF2F6DD21EE81F82D635C294DCB05E4
    &uin=264
    &fromtag=66

    /C400003kyC5M3AOStX.m4a?
    guid=7107896008
    vkey=FDB3D896A7FFF5B337CBB133DBA7D961D3D14413DD3324A9FDDB1F6EDE8AB2DD8D16369046E9D32E5F16FF244BCCDEE43087B830252D05B
    &uin=264
    &fromtag=66

    通过对比知道 guid,uin, fromtag 都是不变的
    /C400(这部分不一样).m4a?以及vkey也不一样,我们看看能不能找到这部分的值呢media_mid:  "0026JiCu2LASHc"    C4000026JiCu2LASHc  = 'C400' + media_mid找出一个 :media_mid: “0026JiCu2LASHc” C4000026JiCu2LASHc = ‘C400’ + media_mid

    还差vkey,这个有点难找,我再找一下看看规律
    。。。。。。。。
    。。。。。。。。
    。。。。。。。。

    30分钟后,终于找出来了
    在这里插入图片描述vkey在这里,现在我们筛选一下,把一些没用的参数去掉,反复分访问这个链接,同时删减参数,最后得到的url,其中最重要的参数songmin,guid,uin 这三个参数,后面两个guid,uin是登录后才可以获取,可以通过selenum自动获取,也可以手动自己去复制也可以,这里直接复制就好了

    看一看
    https://u.y.qq.com/cgi-bin/musicu.fcg?&data={“req”:{“param”:{“guid”:""}},“req_0”:{“module”:“vkey.GetVkeyServer”,“method”:“CgiGetVkey”,“param”:{“guid”:"",“songmid”:[“000IN0Mn3d37fv”],“uin”:""}},“comm”:{“uin”:}}

    那么现在直接上代码

    import requests
    import json
    
    
    class QQmusic:
        def __init__(self):
            self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'}
            self.sl = []
            self.musicList = []
    
        # 获取页面
        def getPage(self,url,headers):
            res = requests.get(url,headers = headers)
            res.encoding = 'utf-8'
            return res
    
        # 获取音乐songmid
        def getSongmid(self):
            num = int(input('请输入获取条数:'))
            # num = 20
            name = input('请输入歌名或歌手:')
            # name = '张学友'
            url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?p=1&n=%d&w=%s'%(num,name)
            # 搜索音乐
            res = self.getPage(url,headers=self.headers)
            html = res.text
            html = html[9:]
            html = html[:-1]
            # 获取songmid
            js = json.loads(html)
            songlist = js['data']['song']['list']
            for song in songlist:
                print(song)
                songmid = song['songmid']
                name = song['songname']
                self.sl.append((name,songmid))
                print('获取成功songmid')
    
    
        # 获取音乐资源,guid是登录后才能获取,nin也是
        def getVkey(self):
            guid = input('请输入guid:')
            uin = input('请输入uin:')
            for s in self.sl:
                print('开始获取资源')
                # 获取vkey,purl
                name = s[0]
                songmid = s[1]
                keyUrl = 'https://u.y.qq.com/cgi-bin/musicu.fcg?&data={"req":{"param":{"guid":" %s"}},"req_0":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"%s","songmid":["%s"],"uin":"%s"}},"comm":{"uin":%s}}'%(guid,guid,songmid,uin,uin)
                res = self.getPage(keyUrl,headers=self.headers)
                html = res.text
                keyjs = json.loads(html)
                purl = keyjs['req_0']['data']['midurlinfo'][0]['purl']
                # 拼凑资源url
                url = 'http://dl.stream.qqmusic.qq.com/' + purl
                self.musicList.append((name,url))
                print('资源地址获取成功')
    
        #   下载音乐
        def downloadMusic(self):
            for m in self.musicList:
                url = m[1]
                res = self.getPage(url,headers=self.headers)
                music = res.content
                name = m[0] + '.mp3'
                with open(name, 'wb') as f:
                    f.write(music)
                    print('下载OK')
                    f.closed
    
    QQ = QQmusic()
    QQ.getSongmid()
    QQ.getVkey()
    QQ.downloadMusic()
    
    展开全文
  • 主要介绍了Python如何爬取qq音乐歌词到本地,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 爬取QQ音乐——QQ音乐sign算法逆向分析 最近在搞一些有意思的爬虫,尝试了很多,也学到了很多。可能是想听音乐了,这两天就尝试着爬取网易云音乐和QQ音乐,其中网易云音乐是很简单的,某站上也有教程,看看就会了。...
  • selenium爬取qq音乐

    2021-03-24 20:58:18
    今日学习(解析selenium爬取qq音乐,附带解析数据) 点此查看原博客 爬取QQ音乐官网指定歌手的前5首歌曲的基本信息和前五百条热门评论: selenium中文网点此学习selenium 简而言之,selenium就是运行在浏览器上面,...
  • python爬取QQ音乐

    2021-06-08 17:23:28
    爬虫爬取QQ音乐 import json import os import requests w=str(input('输入歌名:')) if not os.path.exists('./QQ音乐'): os.mkdir('./QQ音乐') url = f"https://c.y.qq.com/soso/fcgi-bin/client_search_cp?" ...
  • 今天小编就为大家分享一篇用Python爬取QQ音乐评论并制成词云图的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 原博文2020-08-09 12:56 −1、爬取QQ音乐榜单数据并存入数据库(MySQL)2、代码import requestsimport jsonfrom bs4 import BeautifulSoupimport pymysql def get_html(): url='https:/...相关推荐2019-12-20 10:22 ...
  • Python爬取QQ音乐单曲 爬虫步骤 1.爬虫准备 python安装了request模块,Chrome浏览器,明确目标,本次爬取的是QQ音乐《你不要担心》的前十页评论及对应的用户。 2.爬虫分析 首先我们打开 (QQ音乐网页),然后搜索 你...
  • python爬取qq音乐下载歌曲 完整代码: import requests import json from urllib.request import urlretrieve from selenium import webdriver import re import os def get_music_url(): driver.get(f'...
  • 首先呢,我们打开QQ音乐搜索周杰伦https://y.qq.com/portal/search.html#page=1&searchid=1&remoteplace=txt.yqq.top&t=song&w=周杰伦一切做好准备后呢,我们需要找到歌曲清单,找到client_search(客户端搜索)……...
  • 爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐

    万次阅读 多人点赞 2020-11-26 13:49:27
      大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写...PS:由于现在越来越多的人未经本人同意直接爬取博主本人.
  • 使用scrapy爬取qq音乐

    2019-01-22 16:44:39
    记录一下爬取qq音乐的过程 首先我们搜索一个歌手 如:周杰伦 就会得到周杰伦的歌曲列表 我们点击播放,在所有的请求中找到这个: 这个请求就是真正播放歌曲的请求,那我们看一下他的url ...
  • Python爬取QQ音乐内地专辑

    千次阅读 2018-01-04 18:25:24
    好久没写博客,中间玩了两天基于python的web开发,然继续学爬虫了,花三天做了一个小练习,爬取qq音乐所有的内地专辑内容 用到的工具:Chrome、Pycharm社区版、Anaconda Pycharm建立py文件后,引入anaconda的库,...
  • 爬取QQ音乐圣诞歌曲TOP10 '''圣诞歌曲TOP10''' import requests #导入相应库 from bs4 import BeautifulSoup #import time headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/...
  • #爬取qq音乐周杰伦首页歌词 import requests from bs4 import BeautifulSoup import json import re URL = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?' headers = { 'origin':'https://y.qq.com', '...
  • Python爬取qq音乐的过程实例

    千次阅读 2019-01-11 16:16:10
    一、前言  qq music上的音乐还是不少的,有些时候想要...二、Python爬取QQ音乐单曲 爬虫步骤 1.确定目标 首先我们要明确目标,本次爬取的是QQ音乐歌手刘德华的单曲。 (百度百科)->分析目标(策略...
  • 爬虫初上手之爬取QQ音乐

    热门讨论 2020-04-02 18:00:30
    爬虫初上手之爬取QQ音乐! 作为一名爬虫界的萌新,我终于通过了新手教程——requests库的学习,兴致勃勃地撸起袖子准备~~大爬一场~~ 大干一场。 我的第一个爬取目标是QQ音乐。在我的设想中,一个网站的根目录下有很...
  • python使用scrapy爬取qq音乐(一)

    千次阅读 2017-08-20 20:13:03
    爬取qq音乐,第一步,分析请求,拿到url
  • python爬取qq音乐歌曲

    千次阅读 2021-03-11 11:51:23
    1.找到我们要爬取的歌曲主页 ...:网页版的qq音乐它只展示几首音乐,全部音乐需要在客户端里面听。还有代码里面的2325794997是我的qq号 你们可以写自己的也可以写0 from lxml import etree import requests i
  • 用Python爬取QQ音乐评论并制成词云图

    千次阅读 热门讨论 2018-05-20 16:12:02
    环境:Ubuntu16.4 python版本:3.6.4 库:wordcloud 这次我们要讲的是爬取QQ音乐的评论并制成云词图,我们这里拿周杰伦的等你下课来举例。 第一步:获取评论 我们先打开QQ音乐,搜索周杰伦的《等你下课》,直接...
  • 爬取qq音乐歌单 话不多说,代码如下 #--coding:utf-8-- from selenium import webdriver # 从selenium库中调用webdriver模块 import time from bs4 import BeautifulSoup # option = webdriver.ChromeOptions() # ...
  • python爬取qq音乐免费歌曲 2020.7.26目标分析获取音乐列表1.浏览器网络请求追踪2.寻找音乐列表解析qq音乐下载连接组成获取vkey获取sign参数 目标分析 做一个音乐爬虫。 输入关键词,获取音乐列表与音乐下载连接 获取...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,105
精华内容 842
关键字:

爬取qq音乐