创造太阳 发表于 2020-4-26 01:28

用python来下载北京广播网节目

本帖最后由 创造太阳 于 2020-4-26 01:34 编辑

一个悬赏帖子求助北京广播网节目下载,主要打算帮老人下载点节目,就简单写了一下。
@梦入寒冬 ,思路和方法就给你写出来了。主要利用python中的requests库的get函数来实现。
1.先打开网址:http://www.rbc.cn/audio/kaixinchaguanwanchang_1.shtml

可以看到每个节目后边都有一个日期,如20200426这样的,这个是很重要!将来需要用到!
2.打开一个节目的网址,然后右键选择“检查”或者“审查元素”,快捷键“Ctrl”+“shift”+“i”,进行播放节目。
建议最好在打开“检查”后再刷新一下页面,这个网页会自动播放。
然后观察返回的数据,简单的说就是最长的那个。

3.然后选中这个,单击后出来详细信息。

4.找到资源的实际地址,然后再在浏览器中打开。

5.你会发现:在资源实际地址中可以发现,资源变更的只有蓝色框中的日期,红色框中的内容没用,可以直接删除。

实操部分:
所以下载资源就通过拼接网址来进行了。
先观察要爬取页面的网址:http://www.rbc.cn/audio/kaixinchaguanwanchang_1.shtml
第二页:http://www.rbc.cn/audio/kaixinchaguanwanchang_1_2.shtml
最后一页:http://www.rbc.cn/audio/kaixinchaguanwanchang_1_38.shtml
可以明显看出来网页2-38页都是有规律的,所以可以利用python来拼接网址,然后来提取节目的名称。
之后再用xpath提取节目名称,再用正则表达式来提取日期,用来拼接最后的实际资源地址。
代码如下:
# -- coding: utf-8 --
# 导入需要的包
import time    #导入time库
import requests    #导入requests库
from lxml import etree#导入etree
import re#导入re库



headers = {
    "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36"
}    #设置请求头以突破网站反爬,该网站好像没设置反爬,个人习惯
all_times = []    #定义一个空列表all_times来准备装爬取的信息
url = "http://www.rbc.cn/audio/kaixinchaguanwanchang_1.shtml"    #第一页的网址
res = requests.get(url,headers=headers).text    #用requests库的get函数来访问网址,并将数据转变为text文本格式数据,然后传递给变量res
time.sleep(3)    #设定延时3秒,适当休息,以防对网站服务器造成影响
res_xpath = etree.HTML(res)    #将变量res中存储的数据转换为xpath格式
times = res_xpath.xpath('/html/body/div/div/div/div/div/div/ul/li/a/text()')    #用xpath来提取节目名字
for t in times:    #依次循环列表times来提取节目名称
    all_times.append(t)    #将每个节目名称装入到空列表all_times
for i in range(2,39):    #拼接第2页到最后一页(38)
    url = "http://www.rbc.cn/audio/kaixinchaguanwanchang_1_" + str(i) + ".shtml"    #拼接网址
    res = requests.get(url,headers=headers).text   #注释参考上边部分
    time.sleep(5)
    res_xpath = etree.HTML(res)
    times = res_xpath.xpath('/html/body/div/div/div/div/div/div/ul/li/a/text()')
    # print(times)
    for t in times:
      all_times.append(t)
for all_time in all_times:   #依次循环列表all_times,就是之前装了所有节目名称的列表
    file = re.findall('\d*',all_time)    #用正则表达式提取数字
    file = "".join(file)    #将提取出来的数字列表转换为str格式来进行拼接
    print("正在下载" + file)   #显示“正在下载”+编号
    url = "http://playback.rbc.cn/audioD/fm876/" + file + "/2130001800_mp4/213000_1800_96K.mp4"   #拼接实际网址
    time.sleep(5)
    res = requests.get(url,headers=headers).content    #利用requests库的get函数来获得资源网址的二进制数据
    with open(file+".mp4","wb") as f:    #新建一个mp4文件,名字是节目日期    注意:是mp4而不是mp3,资源是MP4格式
      f.write(res)    #写入二进制数据
      print(file + "保存完成")    #保存完成


具体代码就是这个,要爬取其他节目信息就按照这个思路和方法来自己找吧。

打包的话,用pythinller来打包就可以,要是只是自己用的话,代码速度会更快点。



创造太阳 发表于 2020-4-26 01:43

sutramusic 发表于 2020-4-26 01:41
这个说明很简单,应该也可以适用于其它的类似下载片段。

下载ts文件的片段需要先下载m3u8文件,提取m3u8中的信息拼接后再下载。

XinSong 发表于 2020-4-26 01:36


我丢,不愧是大佬

sutramusic 发表于 2020-4-26 01:41

这个说明很简单,应该也可以适用于其它的类似下载片段。

青铜时代号 发表于 2020-4-26 01:46

这是大佬

毒瘤 发表于 2020-4-26 02:23

厉害了。大佬,我只是看看,代码虽然被你写出来了,可我也打包不来!

小白兔白又白腿 发表于 2020-4-26 05:00

感谢分享!!!!!!!!!!

xxscwsrym 发表于 2020-4-26 05:53

感谢大佬。

OO2OO 发表于 2020-4-26 08:06

强大,强大,谢谢分享

王星星 发表于 2020-4-26 08:19

页: [1] 2 3 4
查看完整版本: 用python来下载北京广播网节目