香港电台的节目素质都比较不错,其中有个《中华五千年》的节目是以情景剧与旁白的形式来展示历史故事,由传说时代一直到民国,1983年首播至2000年,非常长寿的一个节目。网上能找到版本声音非常模糊,不过在其《网上中华五千年》的网站上可以在线收听所有节目。虽然可以在线听,但要science上网,而且在线听中断了就不能再续着听,很难受。因此,就想到利用Python来的爬虫来把节目都下载下来慢慢听。

  

分析Html页面

  在浏览器打开审查元素找到音频的链接标签,发现链接都在class为.listen-button的a标签里。只要定位到这个标签,取出text作为文件名,href作为下载url就可以了。

代码实现

  代码很简单,首先,主体结构是这样的:

'''
下载中华五千年
'''
from bs4 import BeautifulSoup
import requests,urllib,re
import time
import aiohttp
import asyncio
import os async def main():
start_page = 1
while True:
url = 'http://rthk9.rthk.hk/chiculture/fivethousandyears/subpage{0}.htm'.format(start_page)
soup = await getUrl(url) #取html内容
if not soup.title: return #直到无内容退出
title = soup.title.text
title = title[title.rfind(' ')+1:]
listenbutton = soup.select(".listen-button") #查出所有.listen-button类的标签
#根据title 创建相应的文件夹
rootPath = './中华五千年/'
if not os.path.exists(rootPath + title):
os.makedirs(rootPath + title) for l in listenbutton:
if l.text != "":
href = l['href']
filename = str(title) +'_' + str(l.text)
if filename.find('公元') > -1
await download(filename=filename,url=href,title=title) #下载语音
start_page += 1 #下一页 asyncio.run(main())

其中异步函数(协程)getUrl :

async def getUrl(url):
async with aiohttp.ClientSession() as session:
#因需science上网所以需要本地代理
async with session.get(url,proxy='http://127.0.0.1:1080') as resp:
wb_data = await resp.text()
soup = BeautifulSoup(wb_data,'lxml')
return soup

异步下载语音函数  download:

async def download(url,filename,title):
file_name = './中华五千年/{0}/{1}'.format(title,filename + '.mp3')
async with aiohttp.ClientSession() as session:
async with session.get(url,proxy='http://127.0.0.1:1080') as resp:
with open(file_name, 'wb') as fd:
while True:
chunk = await resp.content.read()
if not chunk:
break
fd.write(chunk)

由于用了异步IO的方式,很快便可以下载完一页。

BeautifulSoup与aiohttp的简单应用-爬取《网上中华五千年》音频的更多相关文章

  1. Python超简单的爬取网站中图片

    1.首先导入相关库 import requests import bs4 import threading #用于多线程爬虫,爬取速度快,可以完成多页爬取 import os 2.使用bs4获取htm ...

  2. 使用webmagic爬虫对百度百科进行简单的爬取

    分析要爬取的网页源码: 1.打开要分析的网页,查看源代码,找到要爬取的内容: (选择网页里的一部分右击审查元素也行) 2.导入jar包,这个就直接去网上下吧: 3.写爬虫: package com.g ...

  3. web scraper——简单的爬取数据【二】

    web scraper——安装[一] 在上文中我们已经安装好了web scraper现在我们来进行简单的爬取,就来爬取百度的实时热点吧. http://top.baidu.com/buzz?b=1&a ...

  4. Python爬取网上车市[http://www.cheshi.com/]的数据

    #coding:utf8 #爬取网上车市[http://www.cheshi.com/]的数据 import requests, json, time, re, os, sys, time,urlli ...

  5. 【Python数据分析】简单爬虫 爬取知乎神回复

    看知乎的时候发现了一个 “如何正确地吐槽” 收藏夹,里面的一些神回复实在很搞笑,但是一页一页地看又有点麻烦,而且每次都要打开网页,于是想如果全部爬下来到一个文件里面,是不是看起来很爽,并且随时可以看到 ...

  6. 12月4日学习爬虫007.使用Urllib模块进行简单网页爬取

    笔记如下: 1.https是http加强版协议(安全协议)http(普通网络通信协议) 爬数据 如果爬https发现和理想中的数据不同,可以改为http 直接去掉s即可 2.使用Urllib爬取简单网 ...

  7. 【Python】简单实现爬取小说《天龙八部》,并在页面本地访问

    背景 很多人说学习爬虫是提升自己的一个非常好的方法,所以有了第一次使用爬虫,水平有限,依葫芦画瓢,主要作为学习的记录. 思路 使用python的requests模块获取页面信息 通过re模块(正则表达 ...

  8. python简单爬虫爬取百度百科python词条网页

    目标分析:目标:百度百科python词条相关词条网页 - 标题和简介 入口页:https://baike.baidu.com/item/Python/407313 URL格式: - 词条页面URL:/ ...

  9. Python爬虫之简单的爬取百度贴吧数据

    首先要使用的第类库有 urllib下的request  以及urllib下的parse  以及 time包  random包 之后我们定义一个名叫BaiduSpider类用来爬取信息 属性有 url: ...

随机推荐

  1. Luogu P2326 AKN's PPAP【按位贪心】

    题目描述 “I have a pen,I have an apple.Eh,Apple-Pen!. I have a pen,I have pineapple.En,Pineapple-Pen! Ap ...

  2. Linux下tcp服务器创建的步骤

    创建一个socket,使用函数socket() socket(套接字)实质上提供了进程通信的端点,进程通信之前,双方首先必须建立各自的一个端点,否则没有办法通信.通过socket将IP地址和端口绑定之 ...

  3. sql mysql和sqlserver存在就更新,不存在就插入的写法(转)

    转自:http://hi.baidu.com/tidy0608/item/ff930fe2436f2601560f1dd9 sqlsever数据存在就更新,不存在就插入的两种方法 两种经常使用的方法: ...

  4. 模拟 HDOJ 5099 Comparison of Android versions

    题目传送门 /* 题意:比较型号的大小 模拟:坑点在长度可能为5,此时设为'A' */ #include <cstdio> #include <algorithm> #incl ...

  5. 1-20StringBuffer简介

    StringBuffer是一个字符串缓冲区,如果需要频繁的对字符串进行拼接时,建议使用StringBuffer. 工作原理 StringBuffer的底层是char数组,如果没有明确设定,则系统会默认 ...

  6. sql注入原理及解决方案

    sql注入原理 sql注入原理就是用户输入动态的构造了意外sql语句,造成了意外结果,是攻击者有机可乘 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的 ...

  7. 前端打印console

    很多时候,我们都想知道,是否已经选中或得到数据时,我们可以利用console 打印出来.console有几种方式使用.具体有: console.log($scope.getParkId); conso ...

  8. AJPFX总结List的三个子类的特点

    ArrayList:                        底层数据结构是数组,查询快,增删慢.                        线程不安全,效率高.              ...

  9. leetcode410 Split Array Largest Sum

    思路: dp. 实现: class Solution { public: int splitArray(vector<int>& nums, int m) { int n = nu ...

  10. COGS 1406. 邻居年龄排序[Age Sort,UVa 11462](水题日常)

    ★   输入文件:AgeSort.in   输出文件:AgeSort.out   简单对比时间限制:1 s   内存限制:2 MB [题目描述] Mr.Zero(CH)喜闻乐见地得到了一台内存大大增强 ...