当前位置:   article > 正文

基于Python网络爬虫的评论大数据采集分析及可视化_大数据爬虫可视化案例

大数据爬虫可视化案例

目录

实例简介:

系统结构图:

=================P1 数据获取与保存=================

要使用的库

找到目标数据

爬虫设计

保存到数据库

保存数据至XLSX工作表

将工作表上传至HDFS文件管理系统

 主函数

想知道有没有方法解决!!!!

===================P2 生成词云===================

要使用的库

 程序代码如下,生成词云

===================P3 数据展示===================

===================P4其他===================

实例简介:

通过网络爬虫获取目标网页评论区数据(官方账号/知名UP),使用评论区评论内容生成词云,并将数据保存至数据库和XLSX 工作表。再读取数据库内数据并展示到HTML网页;同时将生成的XLSX 工作表上传至HDFS文件管理系统。

(链接:【冰冰vlog.001】带大家看看每个冬天我必去的地方_哔哩哔哩_bilibili

系统结构图:

=================P1 数据获取与保存=================

要使用的库

  1. import re
  2. import xlwt
  3. import requests
  4. import json
  5. import sqlite3
  6. import time
  7. import random

找到目标数据

打开目标网页(B站评论显示为动态加载),使用F12键打开开发者工具,使用开发者工具中的网络工具。

查看内容刷新时服务器向浏览器返回的内容,找到main?csrf=项,点击查看请求url和user-agent(爬虫需要使用该部分内容)。滑动评论区,观察每次展示新评论时url的变换,找到其中的规律。

爬虫设计

1.自定义ask_url(in_url)函数:in_url表示要爬取的网页url链接,函数返回HTML信息,下一步从中挑选需要的内容。User-Agent通过上一部分使用开发者工具获得。

  1. def ask_url(in_url):
  2. head = {
  3. "User-Agent": "Mozilla / 5.0(WindowsNT10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 112.0.0.0Safari / 537.36Edg / 112.0.1722.68"
  4. }
  5. try:
  6. time.sleep(random_time())
  7. r = requests.get(in_url, headers=head)
  8. r.raise_for_status()
  9. print(r.status_code)
  10. r.encoding = r.apparent_encoding
  11. html = r.text
  12. return html
  13. except:
  14. print("ERROR")

2.从HTML中找到数据。自定义函数getdata(dep),通过正则表达式筛选内容。dep表示需要爬取的页面数目,函数返回列表data_list

  1. # 从html信息中获得需要的内容,并把获得的内容保存到data_list中
  2. def getdata(dep):
  3. data_list = []
  4. for i in range(dep):
  5. url1 = 'https://api.bilibili.com/x/v2/reply/main?csrf=885d8049fbe8d890325dbac3ad57a05a&mode=3&next=' + \
  6. str(i + 1) + '&oid=800760067&plat=1&type=1'
  7. html = ask_url(url1)
  8. data = re.findall(find, html)
  9. jsonobj = json.loads(data[0])
  10. for item in jsonobj:
  11. data = []
  12. name = item['member']['uname']
  13. mid = item['mid']
  14. organisation = item['member']['official_verify']['desc']
  15. comment = item['content']['message'].replace('\n', '')
  16. link = 'https://space.bilibili.com/' + str(mid)
  17. reply_text = item['reply_control']["sub_reply_entry_text"]
  18. reply_num = re.findall(find_num, reply_text)[0]
  19. if organisation != '':
  20. data.append(name)
  21. data.append(link)
  22. data.append(mid)
  23. data.append(organisation)
  24. data.append(comment)
  25. data.append(int(reply_num))
  26. if not data:
  27. continue
  28. else:
  29. data_list.append(data)
  30. print('获取数据完成')
  31. return data_list

用到的正则表达式

  1. find = re.compile(r'\"replies\":(.*?),\"top\"')
  2. find_num = re.compile(r'共(.*?)条回复')

保存到数据库

 本例使用PyCharm 2023.1专业版,可以直接使用数据库(社区版可能不行)。

以下部分代码是使用Python操作数据库(初始化(建表)、删除表、保存数据)。

  1. # 数据库初始化
  2. def db_init(db_path): # db_path表示数据库位置(路径)
  3. dbpath = db_path
  4. sql = '''
  5. create table comment
  6. (
  7. id integer primary key autoincrement,
  8. user_name varchar,
  9. space_link varchar,
  10. mid numeric,
  11. be_organ varchar,
  12. comment varchar,
  13. reply_count numeric
  14. )
  15. '''
  16. conn = sqlite3.connect(dbpath)
  17. cursor = conn.cursor()
  18. cursor.execute(sql)
  19. conn.commit()
  20. conn.close()
  21. print('数据库初始化完成')
  22. # 删除数据库中的表格
  23. def delete_table(db_path='comment.db'):
  24. dbpath = db_path
  25. sql1 = '''drop table comment;'''
  26. conn = sqlite3.connect(dbpath)
  27. cursor = conn.cursor()
  28. cursor.execute(sql1)
  29. conn.commit()
  30. conn.close()
  31. # 把data_list中的内容保存到已经初始化的数据库中
  32. def save_date_to_db(data_list, in_path):
  33. db_init(in_path)
  34. conn = sqlite3.connect(in_path)
  35. cur = conn.cursor()
  36. for date in data_list:
  37. for index in range(len(date)):
  38. if index == 2 or index == 5:
  39. continue
  40. date[index] = '"' + str(date[index]) + '"'
  41. sql = '''
  42. insert into comment(
  43. user_name, space_link, mid, be_organ, comment, reply_count)
  44. values(%s)''' % ",".join('%s' % a for a in date)
  45. # print(sql)
  46. cur.execute(sql)
  47. conn.commit()
  48. cur.close()
  49. conn.close()
  50. print("数据已保存至数据库")

保存数据至XLSX工作表

把列表data_list中的数据保存到工作表中。position表示要保存的位置

  1. # 将data_list中的内容保存到xlsx文件中
  2. def save_data(data_list, position):
  3. book = xlwt.Workbook(encoding="utf-8")
  4. sheet = book.add_sheet("sheet1", cell_overwrite_ok=True)
  5. col = ("昵称", "空间链接", "mid", "所属机构", "评论内容", "评论回复")
  6. for i in range(0, len(col)):
  7. sheet.write(0, i, col[i])
  8. for m in range(len(data_list)):
  9. print("正在保存第{}条数据到xlsx文件".format(m + 1))
  10. data = data_list[m]
  11. for n in range(0, len(col)):
  12. sheet.write(m + 1, n, data[n])
  13. book.save(position)
  14. print('数据已保存至xlsx文件中')

保存效果

将工作表上传至HDFS文件管理系统

在Linux系统,完成大数据平台(Hadoop)相关配置,打开终端,通过命令进行文件上传、下载操作,表格在hdfs保存路径:/user/data/comment.xlsx

  1. start-dfs.sh 启动hdfs
  2. Jps 查看进程
  3. hdfs dfs -ls /user 查看hdfs目录内容
  4. hdfs dfs -put /home/jerry/桌面/comment.xlsx /user/data 上传文件至目标目录
  5. hdfs dfs -rm -f /user/data/comment.xlsx 删除目标文件
  6. hdfs dfs -ls /user/data 查看目录内容
  7. hdfs dfs -get /user/data/comment.xlsx /home/jerry/下载 把文件下载至路径/home/jerry/下载
  8. 登陆网站 http://localhost:9870 查看文件
  9. hdfs dfs -chmod 777 /user/data 给目标文件夹增加权限

 主函数

  1. def main():
  2. print("请输入要爬取的页面数目(请输入小于23的正整数):")
  3. depth = int(input()) # 获取爬取页面数目
  4. list1 = getdata(depth)
  5. print('共获得%d条数据' % len(list1))
  6. # 数据的保存路径,xlsx路径和数据库路径
  7. path = r"C:\Users\C11\Desktop\co.xlsx"
  8. path_to_db = "comment.db"
  9. save_data(list1, path) # 保存数据到指定路径的xlsx文件中
  10. delete_table()
  11. save_date_to_db(list1, path_to_db) # 保存数据到指定路径的数据库中
  12. print('共用时:', time.perf_counter() - start)
  13. main() # 调用主函数
  14. print('FINISH')

 测试发现,dep大于等于23时会报错。

想知道有没有方法解决!!!!

执行效果(dep=11)

===================P2 生成词云===================

要使用的库

  1. import re
  2. import numpy as np
  3. import requests
  4. import jieba
  5. import json
  6. from matplotlib import pyplot as plt
  7. from wordcloud import WordCloud
  8. from PIL import Image
  9. import time
  10. import random

 程序代码如下,生成词云

  1. start = time.perf_counter()
  2. exception = re.compile(r'\[.*?\]')
  3. find = re.compile(r'\"replies\":(.*?),\"top\"')
  4. # 获取网页内容
  5. def ask_url(in_url):
  6. head = {
  7. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.34"
  8. }
  9. try:
  10. r = requests.get(in_url, headers=head)
  11. r.raise_for_status()
  12. print(r.status_code)
  13. r.encoding = r.apparent_encoding
  14. html = r.text
  15. except:
  16. print("ERROR")
  17. return html
  18. # 将字符串分割
  19. def word_cut(in_text):
  20. cut = jieba.cut(in_text)
  21. string = ' '.join(cut)
  22. return string
  23. # 生成词云
  24. def word_cloud(str1):
  25. # 要使用的图片模板(背景颜色必须为白色)
  26. img = Image.open(r'C:\Users\C11\Desktop\QQpicture1.jpg')
  27. img_array = np.array(img)
  28. wordcloud = WordCloud(
  29. background_color='white',
  30. stopwords=['的', '了', '是', '我', '在'],
  31. mask=img_array,
  32. font_path='STHUPO.TTF', # 设置字体样式,从C:\Windows\Fonts 路径下寻找字体
  33. )
  34. wordcloud.generate_from_text(str1)
  35. # fig = plt.figure(1)
  36. plt.imshow(wordcloud)
  37. plt.axis('off')
  38. plt.savefig(r"C:\Users\C11\Desktop\comment.jpg", dpi=1100)
  39. # 将html中的评论连接成一个字符串
  40. def connect_word(text, count_num):
  41. data = re.findall(find, text)
  42. jsonobj = json.loads(data[0])
  43. s1 = ''
  44. in_count = count_num
  45. for item in jsonobj:
  46. d = item['content']
  47. # print(item['content'])
  48. # print(type(item['content']))
  49. in_count += 1
  50. s1 += d['message']
  51. s1 = re.sub(exception, '', s1)
  52. s1 = s1.replace('\n', '').replace('
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/434993
    推荐阅读
    相关标签