当前位置:
首页 > Python基础教程 >
-
python基础教程之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的方式,很快便可以下载完一页。
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式