03 爬虫实例-获取网页弹幕内容
Posted xiaodan1040
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了03 爬虫实例-获取网页弹幕内容相关的知识,希望对你有一定的参考价值。
练习:爬取哔哩哔哩网页弹幕内容,并将爬取的内容以五角星的形式显示出来
思路:
- 向哔哩哔哩网站发送请求
- 请求成功后,解析爬取的弹幕内容保存到一个文件中
- 读取文件并分析弹幕内容中词组或文字出现的频率
- 将这些词组或文字组成五角星图形
- 组成五角星图形后,以图片的形式输出
实现:
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # author:albert time:2019/10/28 4 import requests 5 from bs4 import BeautifulSoup 6 import pandas as pd 7 import re 8 import jieba 9 from wordcloud import WordCloud 10 from imageio import imread 11 import matplotlib.pyplot as plt 12 13 ‘‘‘ 14 --获取网站弹幕列表内容 15 ‘‘‘ 16 # 网页地址,该地址只针对哔哩哔哩弹幕网有效,获取方式查看 17 url = "http://comment.bilibili.com/124001121.xml" 18 19 # 网站访问的用户代理,建议携带,不携带可能无法访问 20 header = { 21 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/77.0.3865.120 Safari/537.36" 22 } 23 24 # 向对方服务器发送请求,返回访问状态, 25 # 返回状态如果是以[2]开头,表示访问成功,[4]开头表示网页不存在,[5]开头网站内部错误 26 # 访问状态无法直接读取,需通过属性[text]获取 27 response = requests.get(url,header) 28 29 # 获取网页的编码规则,建议通过该方式获取,而不是直接赋值,可能存在设置不对的情况,可能不是中文网页 30 # response.encoding = "utf-8" 31 response.encoding = response.apparent_encoding 32 # print(response.text) 33 34 # 获取网页文本内容 35 data = response.text 36 ‘‘‘ 37 --将获取到的弹幕内容处理后存放在txt文件中,并读取出来 38 --网页获取的弹幕内容是带html标签的,需要将标签和非汉字的内容清除 39 ‘‘‘ 40 # 解析文本xml,处理不规范标记并生成剖析树 41 soup = BeautifulSoup(data,‘lxml‘) 42 # print(soup) 43 # 获取所有<d>标签中的内容,此时是带标签的文本内容 44 d_list = soup.find_all(‘d‘) 45 46 # 去掉<d>标签,将文本内容存在在列表dlst 47 dlst = [] 48 for d in d_list: 49 danmu = {} 50 danmu[‘弹幕‘] = d.text # 循环获取所有<d>标签中内容 51 dlst.append(danmu) 52 53 df = pd.DataFrame(dlst) # 将列表dlst中的内容存放在数据集中,类似于Excel表格 54 # print(df) 55 56 # 创建并打开一个文件 57 f = open(‘cl.txt‘,‘w‘,encoding=‘utf-8‘) 58 # 进行文本过滤 59 for i in df[‘弹幕‘].values: # 遍历数据集中的所有的弹幕内容 60 pat = re.compile(r‘[一-龥+]‘) # 定义过滤规则,只保留中文汉字,该正则表达式几乎包含了所有汉字龥(yu,第四声) 61 filter_data = re.findall(pattern=pat,string=i) # 执行过滤操作 62 f.write(‘‘.join(filter_data)) # 将过滤后的弹幕内容写入创建的[cl.txt]文件中 63 f.close() 64 65 ‘‘‘ 66 --读取弹幕内容所在的文件[cl.txt] 67 ‘‘‘ 68 f1 = open(‘cl.txt‘,‘r‘,encoding=‘utf-8‘) 69 data = f1.read() 70 71 ‘‘‘ 72 --将弹幕内容分割成词组,并组合成五角星的图案 73 ‘‘‘ 74 result = " ".join(jieba.lcut(data)) 75 76 f1.close() 77 color_mask = imread("五角星.jpg") # 设置数据组合的图形,最好使用空心的图片 78 wc = WordCloud( 79 font_path="C:WindowsFontssimsun.ttc", # 数据显示的字体 80 width=1000, 81 height=800, 82 background_color=‘white‘, # 词云的背景色 83 mask=color_mask # 词云组成的图形,默认为二维 84 ) 85 86 wc.generate(result) # 将弹幕内容生成词云 87 wc.to_file(‘clanned.png‘) # 词云输出文件 88 89 ‘‘‘ 90 --显示弹幕内容组成的图片 91 ‘‘‘ 92 plt.imshow(wc) 93 plt.show()
使用到的类库,如果没有,需要下载,下载命令:
pip install requests pip install bs4 pip install pandas pip install lxml # 在解析xml文件时,需要使用 pip install jieba pip install wordcloud pip install imageio pip install matplotlib
知识点:
- request 向对方服务器发送请求
- BeautifulSoup 解析爬取的弹幕内容
- pandas 分析弹幕数据
- jieba 中文分词器,或称为中文词组切片器
- wordcloud 加载弹幕文本,并输出文件(这里使用图片的方式输出)
- matplotlib.pyplot 将整理后的弹幕文本以图形的方式输出(这里是以五角星的图片为例)
- imread 读取图片
问题:
- 爬取的弹幕内容被保存在了文件后,后又重新读取,是否可以不存放在文件中,直接使用列表或者其他对象存储,然后再读取?保存在文件和直接读取的优缺点是什么?
- 弹幕内容中除了汉字,实际上还包含了大量的字母,表情符号,这些内容可以通过什么正则表达式进行筛选,能否同时跟汉字一起筛选出来?
- 在导包的时候,使用[from scipy.misc import imread]报错,用[from imageio import imread]代替即可。为什么使用scipy.misc中的imread报错?
以上是关于03 爬虫实例-获取网页弹幕内容的主要内容,如果未能解决你的问题,请参考以下文章
用爬虫抓取网页得到的源代码和浏览器中看到的不一样运用了啥技术?