BeautifulSoup与aiohttp的简单应用-爬取《网上中华五千年》音频
香港电台的节目素质都比较不错,其中有个《中华五千年》的节目是以情景剧与旁白的形式来展示历史故事,由传说时代一直到民国,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的简单应用-爬取《网上中华五千年》音频的更多相关文章
- Python超简单的爬取网站中图片
1.首先导入相关库 import requests import bs4 import threading #用于多线程爬虫,爬取速度快,可以完成多页爬取 import os 2.使用bs4获取htm ...
- 使用webmagic爬虫对百度百科进行简单的爬取
分析要爬取的网页源码: 1.打开要分析的网页,查看源代码,找到要爬取的内容: (选择网页里的一部分右击审查元素也行) 2.导入jar包,这个就直接去网上下吧: 3.写爬虫: package com.g ...
- web scraper——简单的爬取数据【二】
web scraper——安装[一] 在上文中我们已经安装好了web scraper现在我们来进行简单的爬取,就来爬取百度的实时热点吧. http://top.baidu.com/buzz?b=1&a ...
- Python爬取网上车市[http://www.cheshi.com/]的数据
#coding:utf8 #爬取网上车市[http://www.cheshi.com/]的数据 import requests, json, time, re, os, sys, time,urlli ...
- 【Python数据分析】简单爬虫 爬取知乎神回复
看知乎的时候发现了一个 “如何正确地吐槽” 收藏夹,里面的一些神回复实在很搞笑,但是一页一页地看又有点麻烦,而且每次都要打开网页,于是想如果全部爬下来到一个文件里面,是不是看起来很爽,并且随时可以看到 ...
- 12月4日学习爬虫007.使用Urllib模块进行简单网页爬取
笔记如下: 1.https是http加强版协议(安全协议)http(普通网络通信协议) 爬数据 如果爬https发现和理想中的数据不同,可以改为http 直接去掉s即可 2.使用Urllib爬取简单网 ...
- 【Python】简单实现爬取小说《天龙八部》,并在页面本地访问
背景 很多人说学习爬虫是提升自己的一个非常好的方法,所以有了第一次使用爬虫,水平有限,依葫芦画瓢,主要作为学习的记录. 思路 使用python的requests模块获取页面信息 通过re模块(正则表达 ...
- python简单爬虫爬取百度百科python词条网页
目标分析:目标:百度百科python词条相关词条网页 - 标题和简介 入口页:https://baike.baidu.com/item/Python/407313 URL格式: - 词条页面URL:/ ...
- Python爬虫之简单的爬取百度贴吧数据
首先要使用的第类库有 urllib下的request 以及urllib下的parse 以及 time包 random包 之后我们定义一个名叫BaiduSpider类用来爬取信息 属性有 url: ...
随机推荐
- Beta版本冲刺第二天!
该作业所属课程:https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 作业地址:https://edu.cnblogs.com/c ...
- oracle错误:1067进程意外终止
oracle错误:1067进程意外终止我Oracle安装完了之后可以运行的 ,过了一段时间不可以了,就上网找了一下,原来是自己的ip已经改变.我一直使用IP地址的. 将D:\oracle\produc ...
- hdu1232 畅通工程 基础并查集
#include <cstdio> #include <cstring> #include <algorithm> #include <cstdlib> ...
- swiper.js插件的使用
swiper切换动画效果,需要先加载swiper.animate.min.js和animate.min.css. <!DOCTYPE html><html> <he ...
- bzoj1024 [SCOI2009]生日快乐【dfs】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1024 普通的深搜. #include <cstdio> #include < ...
- Suricata产生的数据存储目录
不多说,直接上干货! 我这里呢,分两种常用的Suricata. 一.源码编译安装的Suricata 这里不多说,大家可以去看我下面写的博客 使用 Suricata 进行入侵监控(一个简单小例子访问百度 ...
- C#方法拓展
作用: “扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.” 要求: 1.拓展方法必须是在一个非嵌套.非泛型的静态类中定义.2.他至少有一个参数.3. ...
- 洛谷P3254 圆桌问题(最大流)
题意 $m$个不同单位代表参加会议,第$i$个单位有$r_i$个人 $n$张餐桌,第$i$张可容纳$c_i$个代表就餐 同一个单位的代表需要在不同的餐桌就餐 问是否可行,要求输出方案 Sol 比较zz ...
- vs 2017 下 千万不要装force utf8 这个插件
千万不要装!!! 装了之后,传文件到linux系统下,各种xml和makefile报错(如下) Makefile:1: *** 遗漏分隔符 . 停止
- Chrome插件制作
由于网上很难找到关于Chrome插件制作的中文教程,为了总结和方便更多的开发者,本文以最常见的显示效果为browser_action的二维码插件为例,进行相关阐述.前端童鞋开发的话应该很简单的,鄙人是 ...