提取bilibili网页视频目录,网页提取标签、属性,list到写入文本

1、网页提取标签、及属性写入list

 # -*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup

html_doc3="""
<ul class="list-box"><li class="watched on"><a href="/video/BV1gp4y1q71w?p=1" class="" title="1.01 引言"><i class="van-icon-videodetails_play"></i><span class="s1">P1</span>
          1.01 引言
        </a></li><li class=""><a href="/video/BV1gp4y1q71w?p=2" class="" title="2.01 课前准备"><i class="van-icon-videodetails_play" style="display: none;"></i><span class="s1">P2</span>
       (内容太多写不下,忽略)
          4.11.10 集群_选举策略
        </a></li><li class=""><a href="/video/BV1gp4y1q71w?p=863" class="" title="4.11.11 集群_搭建集群"><i class="van-icon-videodetails_play" style="display: none;"></i><span class="s1">P863</span>
          4.11.11 集群_搭建集群
        </a></li><li class=""><a href="/video/BV1gp4y1q71w?p=864" class="" title="4.11.12 Java操作ZK_连接Zookeeper"><i class="van-icon-videodetails_play" style="display: none;"></i><span class="s1">P864</span>
          4.11.12 Java操作ZK_连接Zookeeper
        </a></li><li class=""><a href="/video/BV1gp4y1q71w?p=865" class="" title="4.11.13 Java操作ZK_查询操作"><i class="van-icon-videodetails_play" style="display: none;"></i><span class="s1">P865</span>
          4.11.13 Java操作ZK_查询操作
        </a></li><li class=""><a href="/video/BV1gp4y1q71w?p=866" class="" title="4.11.14 Java操作ZK_增删改操作"><i class="van-icon-videodetails_play" style="display: none;"></i><span class="s1">P866</span>
          4.11.14 Java操作ZK_增删改操作
        </a></li><li class=""><a href="/video/BV1gp4y1q71w?p=867" class="" title="4.11.15 Java操作ZK_监听通知机制"><i class="van-icon-videodetails_play" style="display: none;"></i><span class="s1">P867</span>
          4.11.15 Java操作ZK_监听通知机制
        </a></li></ul>
"""
soup3 = BeautifulSoup(html_doc3,features="lxml")
titlelist=[]
# n = soup3.find_all('a')
def gettitle(soup, label, attr):
	for x in soup.find_all(label):
		title = x.get(attr)
	#if title:
		titlelist.append(title)
	return titlelist
soup=soup3 
label = 'a'
attr = 'title'
gettitle(soup, label, attr)
print(titlelist)








   
	
# with open('D:/tongbupan/13587/spiderforbilibili/zzzzz.txt','w+',encoding="utf-8") as f:
	# for line in f:
		# ff.write(line)
# ff.close()












2、list写入到txt文本

 # -*- coding:utf-8 -*-
a=['1.01 引言', '2.01 课前准备', '2.02 安装环境JDK与JRE', '2.03 程序的定义、Java的历史', '2.04 Java的语言特点', '2.05 计算机执行机制与Java执行机制', '2.06 名词解释(JVM、JRE、JDK)', '2.07 Java环境变量的配置方式', '2.08 常用DOS命令', '2.09 第一个应用程序的书写', '2.10 编译源文件、运行字节码文件', '2.11 类的阐述与定义规范', '2.12 package关键字(上)', '2.13 package关键字(下)', '2.14 NotePad++编辑器的设置与使用', '2.15 编码规范之书写格式', '2.16 编码规范之单行注释与多行注释', '2.17 编码规范之文档注释', '2.18 编码规范之标识符命名规范', '2.19 概述与环境搭建总结', '3.01 内存的基本概念', '3.02 变量的概念与组成', '3.03 变量的声明、赋值、应用', '3.04 强类型与弱类型编程语言的区别', '3.05 变量的多种定义方式', '3.06 Java语言中数据类型的分类', '3.07 基本数据类型之整数(byte、short)', '3.08 基本数据类型之整数(int、long)', '3.09 基本数据类型之小数(float、double)基本应用', '3.10 基本数据类型之小数(float、double)科学计数法', '3.11 基本数据类型之小数(float、double)正负取值范围', '3.12 基本数据类型之布尔(boolean)', '3.13 字符相关前置知识之ASCII编码', '3.14 字符相关前置知识之Unicode编码', '3.15 基本数据类型之字符(char)', '3.16 字符相关后置知识之转义字符', '3.17 引用数据类型之字符串(String)', '3.18 自动类型转换', '3.19 强制类型转换(上)', '3.20 强制类型转换(下)', '3.21 运算符之算术运算符', '3.22 运算符之赋值运算符', '3.23 运算符之关系运算符', '3.24 运算符之逻辑运算符', '3.25 运算符之三元运算符', '3.26 Java中的表达式', '3.27 Java中的自动类型提升', '3.28 与String拼接的类型提升', '3.29 扫描仪控制台录入(上)', '3.30 扫描仪控制台录入(下)', '3.31 Java语言基础总结', '4.01 基本if选择结构', '4.02 if-else选择结构', '4.03 多重if选择结构', '4.04 嵌套if选择结构', '4.05 Switch分支结构(上)', '4.06 Switch分支结构(下)', '4.07 局部变量的特点与注意事项', '4.08 选择结构与分支结构总结', '5.01 循环的概念以及执行流程', '5.02 while循环以及循环的组成部分', '5.03 while循环的特点', '5.04 while循环解决具体问题(上)', '5.05 while循环解决具体问题(下)', '5.06 do-while循环的特点与执行流程', '5.07 do-while循环的应用场景及解决具体问题', '5.08 for循环的特点及执行流程', '5.09 for循环解决具体问题', '5.10 流程控制语句(break)特性', '5.11 流程控制语句(break)应用案例', '5.12 流程控制语句(continue)特性', '5.13 流程控制语句(continue)应用案例', '5.14 嵌套循环(矩形)', '5.15 嵌套循环(平均分)', '5.16 嵌套循环(直角三角形)', '5.17 嵌套循环(九九乘法表)', '5.18 循环结构总结', '6.01 方法的概述与应用前提', '6.02 方法定义的语法', '6.03 方法定义的位置', '
### 关于Python编写的Bilibili视频爬虫整合方案 构建一个完整的Bilibili视频爬虫需要综合运用多种技术和库来处理请求、解析HTML以及存储数据。以下是详细的解决方案: #### 1. 请求模块的选择 为了获取网页内容,可以使用`requests`或更高级的异步HTTP客户端如`aiohttp`。这些库能够模拟浏览器行为并发送GET/POST请求。 ```python import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', } response = requests.get('https://www.bilibili.com/video/BVxxxxxx', headers=headers) print(response.text) ``` 此代码片段展示了如何设置自定义头部信息以伪装成真实用户的访问[^2]。 #### 2. 数据提取方法 对于页面上的结构化数据提取,推荐使用BeautifulSoup或者lxml库来进行DOM操作。它们支持XPath表达式和CSS选择器语法,方便定位目标节点。 ```python from bs4 import BeautifulSoup soup = BeautifulSoup(html_content, 'html.parser') title = soup.select_one('#viewbox_report > h1').text.strip() print(f'Video Title: {title}') ``` 这里演示了利用Beautiful Soup查找特定标签内的文本值[^3]。 #### 3. 多线程或多进程加速抓取效率 当面对大量URL列表时,单一线程可能显得效率低下。因此引入concurrent.futures中的ThreadPoolExecutor可以帮助我们同时发起多个网络请求从而提升整体性能。 ```python from concurrent.futures import ThreadPoolExecutor def fetch(url): resp = session.get(url, timeout=10).json() return resp['data'] with ThreadPoolExecutor(max_workers=8) as executor: results = list(executor.map(fetch, urls)) ``` 上述例子说明了怎样创建固定大小的工作池去并发执行函数调用[^4]。 #### 4. 存储采集到的数据 最后一步就是决定保存方式——文件系统(JSON/csv),数据库(MySQL/MongoDB etc.)或者其他形式的服务接口推送等等。下面给出写入CSV的一个简单示范: ```python import csv fields = ['id','name'] rows = [[item['aid'], item['title']]for item in videos] with open('output.csv', mode='w')as file: writer = csv.writer(file) writer.writerow(fields) writer.writerows(rows) ``` 这段脚本实现了将结果导出至本地csv文档的功能[^5]。 ### 注意事项 - 遵守网robots.txt协议及版权法律。 - 不要频繁刷新同一IP地址下的请求以免触发反爬机制。 - 对动态加载的内容需借助Selenium或其他渲染引擎完成整个交互过程后再捕获最终呈现出来的资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值