zoukankan      html  css  js  c++  java
  • 03 爬虫实例-获取网页弹幕内容

    练习:爬取哔哩哔哩网页弹幕内容,并将爬取的内容以五角星的形式显示出来

     需求实现

    思路:

    1. 向哔哩哔哩网站发送请求
    2. 请求成功后,解析爬取的弹幕内容保存到一个文件中
    3. 读取文件并分析弹幕内容中词组或文字出现的频率
    4. 将这些词组或文字组成五角星图形
    5. 组成五角星图形后,以图片的形式输出

    实现:

     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报错?
  • 相关阅读:
    array_unique() 去重复
    datagrid导出数据
    $this->success传递数据
    二分+暴力状压+桶——cf1288D
    乱搞+虚假莫队?+树状数组——cf1288E
    字符串+置换+莫队离线处理——cf1290B
    扩展域并查集+图论——cf1290C 好题
    换根dp+暴力+预处理+记忆化搜索——cf1292C好题!
    线段树,思维——cf1295E
    暴力,贪心——cf1292B
  • 原文地址:https://www.cnblogs.com/xiaodan1040/p/11755274.html
Copyright © 2011-2022 走看看