(2021.11.25自编自测)想和python爬虫谈恋爱?打打基础的你适合看下这个利用爬虫爬取歌曲

python是一门比较容易入手的编程,小编已经用它的在领导面前得瑟了好多吧了,坚持和努力才是成功的基石
小编做这个的时候也是遇见了好多的麻烦事,比如小编第一次尝试requests进行请求来接的时候,页面就被拦截了,但是百变不离其中,小编也是一点一点慢慢的折磨了下来
这个比较适合python爬虫初学者看看,来增加一下学习爬虫的兴趣,相信我这是个不错的选择

一切只为学习交流,无意冒犯,如有冒犯,请及时联系小编进行删除清理操作

首先呢,小编也得承认,小编的技术也称不上大佬,对于python也不能说是很熟,但是平时好多的工作上常用的辅助工具,其中就包括爬虫以及一些常用的运维工具,小编还是有这个开发能力的,比如说公司的平台需要从数据库里面导出来一下数据进行演示汇报作用的啦,如果从数据库里面导出数据的话,我相信大家都经历过,好不容易拿到了进入数据库服务的“大门钥匙”,又被各种字段跟弄迷糊了,还有就是客户之相信平台上面的数据(实际经验告诉我,数据库中的数据与平台上面展示的数据总是要多的多),所以“嘻嘻”,那就爬虫来收集数据,数据本身就是平台上面的,最要逻辑上面不出现任何的问题,基本上,数据是可以对的上的,然后把数据write导execl里面,ok,完美交工
针对这个网站的抓取,一方面进行学习交流,另一方面还是希望通过分析判断来了解需要改进的地方。

总体思路






做爬虫的大家都知道,首先是有有一个比较实际的思路,当然了小编上边的思路也是所有爬取资源的总体思路,首先呢,为什么要确定爬取的内容,因为你需要确定你需要爬取什么内容,也就是说你最基本的需要知道自己要干什么吧,其次呢,是怎么干,我知道了自己要干什么之后,我就的想法通过各种渠道来拿到我需要的资源,那怎么干,怎么 拿到资源,这个就是我们需要解决的,这个也是爬虫中的最关键的逻辑或者是技术,最后呢,你需要将爬取到的数据来保存到本地,至于你要干什么,这个也就不是很重要是吧。

本篇文章主要用的模块

import requests
import re
###都是一些最基本的用法,重要的事懂这个爬虫的逻辑

确定需要爬取的内容

我这边使用热搜榜作为今天的爬取内容,相对其他的来说,这个热搜榜是难度较大的

(2021.11.25自编自测)想和python爬虫谈恋爱?打打基础的你适合看下这个利用爬虫爬取歌曲_爬虫


ok,目标就选择他了,可是着手准备,通过界面我们可以得知,热搜榜总共500首歌曲,每页有20首歌曲,总共有25页。

敲黑板了哈,做笔记,必考点来了。

  • 通过上图我们可知



注意:这是我们人眼看见的,但是python程序他是不知道的,所以接下来我们就的需要用python让他自己来知道这些信息

确定每页展示多少内容,总共多少页

那么怎么来确定热搜榜总共500首歌曲,每页有20首歌曲,总共有25页。其实有很多的方法的,一般来说的话都会在首页也就是第一页来告诉页面有多少页了,当然还有其他的方法,小编这里是在第一页查找的。

有坑勿踩:这个网站做的还是比较好的,这个也是一种反爬机制,就是无论你显示多少页码的内容,艾叶,我的url都是一个(看下两张图的对比),让你无处可爬,对,你没有看错就是这样,但是咱还有反反爬以及到处都是办法的人称没办法

(2021.11.25自编自测)想和python爬虫谈恋爱?打打基础的你适合看下这个利用爬虫爬取歌曲_爬取歌曲_02


(2021.11.25自编自测)想和python爬虫谈恋爱?打打基础的你适合看下这个利用爬虫爬取歌曲_运维_03


首先我们需要确认下,无论你怎么变,那怕你是72边,我就是不动,我要明白我的目的,再怎么舞刀弄枪,哎呀,我就是不看,哎呀妈呀,你说急不急死个人哈。也就是我只要通过你这页面获取到 热搜榜总共500首歌曲,每页有20首歌曲,总共有25页,这就是我们的目的。

查看源代码

【火狐浏览器】----【所需内容的第一页】----【右键】-----【查看网页源代码】就可以看到网页的源代码了,咱们只希望通过源代码,获取到我们所需要的数据就行

这里同时也教大家一个小窍门。ctrl+f组合键可以搜索网页中的关键字,比如说咱这个要找总共500首歌曲,那就搜“500”

(2021.11.25自编自测)想和python爬虫谈恋爱?打打基础的你适合看下这个利用爬虫爬取歌曲_运维_04


通过上图可知有这个500的关键字存在,那么是不是我们要找的这个歌曲总数呢,看变量名PageData.totalCount应该是的,还有就是全网页就这一个关键词,还有重大发现哟,就是下面的 "var pageSize = 20;(下图位置) ",哈哈,果然得来全不费功夫

(2021.11.25自编自测)想和python爬虫谈恋爱?打打基础的你适合看下这个利用爬虫爬取歌曲_爬取歌曲_05


开始敲代码,重点来了哈

#定义总页数的变量Page_Show
Page_Show=''
#定义每页多少数据size的变量Page_Size
Page_Size=''
#传递第一页内容的url来获取当前多少数据,多少页码,每页数据szie
Page_Url = 'http://www.htqyy.com/top/hot'


##requests.get来获取一下当前url的网页源代码
Page_res = requests.get(Page_Url)

##利用re模块来对当前url进行内容识别
    ##创建re.compile规则
Page_All_Find = re.compile(r'PageData.totalCount = (?P<PageData_totalCount>.*?);.*?var pageSize = (?P<pageSize>.*?);',re.S)
    ##通过re.fiditer来指定来源数据
Page = Page_All_Find.finditer(Page_res.text)
    ##利用for循环来进行规则匹配结果的输出,并相应的进行赋值
for it in Page:
    Page_Size = int(it.group('pageSize'))
    Page_Show = int(int(it.group("PageData_totalCount"))/int(it.group('pageSize')))
##打印出总页数:测试用
print(Page_Show)
##打印出每页szie:测试用
print(Page_Size)

输出展示:

(2021.11.25自编自测)想和python爬虫谈恋爱?打打基础的你适合看下这个利用爬虫爬取歌曲_运维开发_06


重点来了,里面的re.compile规则是怎么来的,是这样来的呦,请看下面

<script type="text/javascript">
        var PageData = {};
        PageData.totalCount = 500;
    </script>
    <script type="text/javascript">
        var pageIndex = 0;     //页面索引初始值
        var pageSize = 20;     //每页显示条数初始化,修改显示条数,修改这里即可

这个是网页源码中的我们所需要的代码。小编这边使用re就是简简单单的用了他的一个拼接的。我们所需要的部分用".?"来进行代替,如果非要给这个.?部分加上一个名字可以利用(?P<这个里面填写你自己定义的名称,你自己能记住就行>.*?),对,你没有看错就是这么简单。后面的it.group(“名称”)就是在调取我们所需要的值了。
好了,通过这一步,我们知道了,如果你要采用for循环来实现分页现在数据,那么你的需要循环25次了,每个页码上面是20条数据

确定切换页码的时候,url变化的规律

通过上面的示例,大家也应该看到了,就是说,在切换页码的时候,每个页码的url都是一样的,让我们没有地方下手,但是小编不慌,道路千万条,目标第一条,实在不行就用selunm,来操作浏览器完成,但是小编没有这样做,为什么呢,因为小编想到了方法,并且经过实践,证明了小编的想法还是可行的。
那就是既然源码搞不出来我们所需要的东西来,那我们就搞requests请求

【F12打开浏览器的开发模式】—【清空当前已有的请求】–【进行页码切换】—【进行大脑飞速的运转】效果看下图

(2021.11.25自编自测)想和python爬虫谈恋爱?打打基础的你适合看下这个利用爬虫爬取歌曲_运维_07


(2021.11.25自编自测)想和python爬虫谈恋爱?打打基础的你适合看下这个利用爬虫爬取歌曲_python_08


(2021.11.25自编自测)想和python爬虫谈恋爱?打打基础的你适合看下这个利用爬虫爬取歌曲_运维_09

敲黑板了,重点来了
通过上面的几张图可以看出一下几个关键




ok,了这不就知道了吗,规律就是在这,但是这里咱们先不要急着去进行for循环遍历去,为什么呢,因为现在我们是知道了页码切换的规律了,但是我们在这个前提还的找打,在每一页中我们怎么找到url的播放地址,通过播放地址,我们在找到下载地址,等能下载了,再进行一个for循环遍历,岂不是美哉

确定每一首歌曲的播放url地址

这个查找方法还是比较考研人的饿大脑的,有点难度的呦,下面就跟着小编一起来吧

首先我们需要点击任意一首歌进去,看看生成的url,然后再返回对比一下网页源码看看是不是能够通过一些技术手段来生成或者拼成播放url

点击进去,我们可以看到他的播放url是“http://www.htqyy.com/play/33”

(2021.11.25自编自测)想和python爬虫谈恋爱?打打基础的你适合看下这个利用爬虫爬取歌曲_运维开发_10

那么,讲到这里小编忍不住的想问一下,这个url是怎么生成的呢,我们能不能通过上面带页码的页面来生成一下这个页面的,一般来说小编还是比较有自信的,为什么呢,因为小编找到了方法

重新打开上一个页面

(2021.11.25自编自测)想和python爬虫谈恋爱?打打基础的你适合看下这个利用爬虫爬取歌曲_运维开发_11


网页源码中,我们发现了这个"/play/33这个herf标签了",看来是有好事发生了(如果不懂的话,请看下图)。

为什么呢,因为“清晨”这首歌的播放url是““http://www.htqyy.com/play/33”,现在有了这个“/play/33”,我是不是可以假设,这要在这个herf标签的值前面加上“http://www.htqyy.com/”这个就可以了哈,实际上就是的,http://www.htqyy.com/这个是域名,后面的“/play/33”是uri,这两个组合起来就是url网址。为了验证下这个想法大家可以去测试一下,小编这边就不演示了,小编测过,就是这样的

(2021.11.25自编自测)想和python爬虫谈恋爱?打打基础的你适合看下这个利用爬虫爬取歌曲_运维_12


重点,开始敲代码

##定义歌曲名称变量,方便下载保存
Song_Name=''
##定义歌曲播放url
Song_Play_url=''
##批量爬取单个页码的上面所有歌曲的播放url
    ##假设爬取的是第一页码的内容,后期配合for进行全25页码的查询
Play_url = "http://www.htqyy.com/top/musicList/hot?pageIndex=0&pageSize=20"

##反Referer反爬虫法:反反爬虫
header = {
'Referer':"http://www.htqyy.com/top/hot"
}

##创建requests请求,get一下页面
Play_res = requests.get(Play_url,headers=header)


##通过re模块对数据进行抽取
    ##re.compile创建规则
page_all_find = re.compile(r'<span class="title"><a href="(?P<Play_url2>.*?)" target="play" title="(?P<S_name>.*?)" sid=.*?target="_blank">(?P<S_author>.*?)</a></span',re.S)
page = page_all_find.finditer(Play_res.text)
for i in page:
	##拼接歌曲的名称,'S_name为歌曲名称,S_author为歌曲作者
    Song_Name = i.group('S_name') + "-" + i.group("S_author")
    ##拼接歌曲的播放url
    Song_Play_url = 'http://www.htqyy.com'+ i.group("Play_url2")
    ##测试用
    print(Song_Play_url,Song_Name)

查看运行结果:

(2021.11.25自编自测)想和python爬虫谈恋爱?打打基础的你适合看下这个利用爬虫爬取歌曲_爬虫_13


注意:上面的re.compile也是用的拼接的方式来进行规则提取的哈

点击其中的一个url查看是不是对应着相应歌曲的播放url,小编可以很骄傲的告诉大家是的,既然我们找到了歌曲的播放的url,那么下边我们该进行什么了呢,对的,你没有猜错,就是在每一首歌播放url里面找到歌曲的下载url

确定每一首歌的下载url,并进行下载

这个是最复杂的,所以这个时候,是不是的需要一个小本本来记录一下了哈

首先,我们随便找一个播放url

就他了,说实在话,这首歌还是比较好听的哈

(2021.11.25自编自测)想和python爬虫谈恋爱?打打基础的你适合看下这个利用爬虫爬取歌曲_爬虫_14

打开开发者模式,找requests请求

为什么要找这个requests请求呢,这个是因为,这个下载的url地址,是动态生成的,注意看,他是一个灰色的,请看下图

(2021.11.25自编自测)想和python爬虫谈恋爱?打打基础的你适合看下这个利用爬虫爬取歌曲_运维开发_15

我们先不要考虑这个url是怎么来的,我们的先看看这个url是不是歌曲的真是地址,将url复制到浏览器中查看

(2021.11.25自编自测)想和python爬虫谈恋爱?打打基础的你适合看下这个利用爬虫爬取歌曲_运维开发_16

可以正常的进行播放,说明这个就是歌曲的真是地址了

那么问题来了,我们该怎么样形成这个url地址呢
首先我们来看看源代码

(2021.11.25自编自测)想和python爬虫谈恋爱?打打基础的你适合看下这个利用爬虫爬取歌曲_爬虫_17


网页源码是帮不了我们了。那么我们猜想这个是后期js形成的,事实上他就是js生成的,但是吧,小编在这个上面也是吃了一次亏,为什么这样说呢,大家知道,一般来说的话,js应该是和html进行分离开的,分文件存放的,小编就在网页源代码文件里面找了好久,因为按照常规的操作就是,找到js文件(一般的作用js文件名会有所表现),然后进到这个文件中搜索一下关键词尽可以找到相应的function了,但是吧,这次,小编看了所有的js源文件他就是没有,所以一切从头再来,结合断点,一步一步的走,终于让小编发现了一个天大的秘密,就是,他的js脚本是写进了html里面

虽然浪费了好长的时间,但是脚本写进了html源码里面,那就好办了,方便你我他

(2021.11.25自编自测)想和python爬虫谈恋爱?打打基础的你适合看下这个利用爬虫爬取歌曲_运维开发_18

看到这里大家也就明白该怎么办了吧

var fileHost="http://f3.htqyy.com/play9/";
  var mp3="33/mp3/5";
  mp3=fileHost+mp3;

大家一起来完拼接吧,通过re模块获取fileHost的值,然后获取mp3=的值,然后进行组合就是下载的 url了

代码时间
这个是在上面一段代码的for循环里面

##定义一个歌曲下载url的变量
Down_url=''

#下载音乐
   ##创建一个requests。get来获取歌曲播放页的网页代码
Down_res = requests.get(Song_Play_url)
##创建一个re.compile规则
Down_obj = re.compile(r'var fileHost="(?P<fileHost>.*?)".*?var mp3="(?P<mp3>.*?)";', re.S)

##指定re规则查找范围
a1 = Down_obj.finditer(Down_res.text)


for i in a1:
   ##提取相re规则对应的取值
   Down_url = i.group("fileHost") + i.group("mp3")
   ##循环打印出Down_url,测试用
   print(Down_url,Song_Name)

查看效果图:

(2021.11.25自编自测)想和python爬虫谈恋爱?打打基础的你适合看下这个利用爬虫爬取歌曲_运维开发_19

最后,对歌曲进行下载

首先要考虑的就是requests请求了哈,因为这个下载较方便

直接上下载源码

##进行下载操作
                ###创建头部
        headers_down={
        'Referer':Down_url,
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0'
        }
        ##创建一个requests请求
        res = requests.get(url=Down_url,headers=headers_down)
        ##对文件进行保存操作
        with open("E:\\python2\\music\\{}.mp3".format(Song_Name), "wb") as f:
            f.write(res.content)
            ###打印完成进度
            print(Song_Name,"已经下载完毕")

看看效果图:

(2021.11.25自编自测)想和python爬虫谈恋爱?打打基础的你适合看下这个利用爬虫爬取歌曲_python_20

查看对应的文件夹:

(2021.11.25自编自测)想和python爬虫谈恋爱?打打基础的你适合看下这个利用爬虫爬取歌曲_运维_21


已经成功的下载了

这里还是有坑的哈,大家可以看到我下载的时候头部是下面这样的

headers_down={
        'Referer':Down_url,
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0'
        }

其中有两种类型的反爬虫机制,一个是User-Agent’,这个好说,但是第二个是,'Referer,大家不知道看出了问题了没。当前url和上一跳的url居然是一样的。('Referer,这个参数代表着,你是从那个网址访问到我这网址的),这个也是小编发现奇怪的地方之一,也就是说当你访问下载url的时候,他会默认再重新的跳转到当前的这个url,一些浏览器上面是不显示这个referer参数的,小编在这个上面也是吃了不小的亏,老是下载空文件,那么你就有可能就是这个问题了

整合前面的分页功能,进行批量下载

=学习委员出来一下,敲黑板了,因为咱的总共是25页,页码请求页格式为:“http://www.htqyy.com/top/musicList/hot?pageIndex=页码-1&pageSize=这个也就是每页size的大小”=

正好可以添加一个for i in rang(0,总页码)

整合代码:

import requests
import re

#定义总页数的变量Page_Show
Page_Show=''
#定义每页多少数据size的变量Page_Size
Page_Size=''
##定义歌曲名称变量,方便下载保存
Song_Name=''
##定义歌曲播放url
Song_Play_url=''

#传递第一页内容的url来获取当前多少数据,多少页码,每页数据szie
Page_Url = 'http://www.htqyy.com/top/hot'


##requests.get来获取一下当前url的网页源代码
Page_res = requests.get(Page_Url)

##利用re模块来对当前url进行内容识别
    ##创建re.compile规则
Page_All_Find = re.compile(r'PageData.totalCount = (?P<PageData_totalCount>.*?);.*?var pageSize = (?P<pageSize>.*?);',re.S)
    ##通过re.fiditer来指定来源数据
Page = Page_All_Find.finditer(Page_res.text)
    ##利用for循环来进行规则匹配结果的输出,并相应的进行赋值
for it in Page:
    Page_Size = int(it.group('pageSize'))
    Page_Show = int(int(it.group("PageData_totalCount"))/int(it.group('pageSize')))
##打印出总页数:测试用
# print(Page_Show)
##打印出每页szie:测试用
# print(Page_Size)


##遍历所有页码
for i in range(0,Page_Show):
    ##批量爬取单个页码的上面所有歌曲的播放url
        ##假设爬取的是第一页码的内容,后期配合for进行全25页码的查询
    Play_url = "http://www.htqyy.com/top/musicList/hot?pageIndex="+str(i)+"&pageSize=" + str(Page_Size)

    ##反Referer反爬虫法:反反爬虫
    header = {
    'Referer':"http://www.htqyy.com/top/hot"
    }

    ##创建requests请求,get一下页面
    Play_res = requests.get(Play_url,headers=header)


    ##通过re模块对数据进行抽取
        ##re.compile创建规则
    page_all_find = re.compile(r'<span class="title"><a href="(?P<Play_url2>.*?)" target="play" title="(?P<S_name>.*?)" sid=.*?target="_blank">(?P<S_author>.*?)</a></span',re.S)
    page = page_all_find.finditer(Play_res.text)
    for i in page:
        Song_Name = i.group('S_name') + "-" + i.group("S_author")
        Song_Play_url = 'http://www.htqyy.com'+ i.group("Play_url2")
        # print(Song_Play_url,Song_Name)

        ##定义一个歌曲下载url的变量
        Down_url=''

        #下载音乐
            ##创建一个requests。get来获取歌曲播放页的网页代码
        Down_res = requests.get(Song_Play_url)
        ##创建一个re.compile规则
        Down_obj = re.compile(r'var fileHost="(?P<fileHost>.*?)".*?var mp3="(?P<mp3>.*?)";', re.S)

        ##指定re规则查找范围
        a1 = Down_obj.finditer(Down_res.text)


        for i in a1:
            ##提取相re规则对应的取值
            Down_url = i.group("fileHost") + i.group("mp3")
            ##循环打印出Down_url,测试用
            # print(Down_url,Song_Name)

            ##进行下载操作
                    ###创建头部
            headers_down={
            'Referer':Down_url,
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0'
            }
            ##创建一个requests请求
            res = requests.get(url=Down_url,headers=headers_down)
            ##对文件进行保存操作
            with open("E:\\python2\\music\\{}.mp3".format(Song_Name), "wb") as f:
                f.write(res.content)
                ###打印完成进度
                print(Song_Name,"已经下载完毕")


阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: python