c爬虫抓取网页数据(2021-10-29刚学新浪微博热搜主题讨论量获取)

优采云 发布时间: 2022-02-05 09:16

  c爬虫抓取网页数据(2021-10-29刚学新浪微博热搜主题讨论量获取)

  2021-10-29

  刚学python爬虫,用爬虫爬了新浪微博热搜,看看效果如何。也是这段时间学习python的一个总结。

  一、目的:

  抓取2020年1月3日星期五新浪微博热搜榜,动态展示抓取数据,生成当日微博热词云和微博热搜前20关键词条形图。

  二、事情:

  分析新浪微博热搜榜,分析网页结构,分析网页,获取当前热门话题、排名、话题讨论量、当前爬取时间。由于微博热搜动态刷新,选择20-30分钟抓取数据,时间范围为9:30-21:00。将上次采集的数据全部导入实现数据动态显示的模块,并进行相关调整。使用口吃分词对获取的数据进行分词,使用WordCloud展示当日热度搜索热点词云

  三、相关实现步骤

  1.网页分析

  定义一个请求头来模拟浏览器并随机生成一个请求头,方法def get_header():

  header1 = {

    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"

}

header2 = {

    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362"

}

header3 = {

    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"

}

header_list = [header1,header2,header3]

index = random.randint(0,1)

return header_list[index]

  

  解析 网站 方法:def get_data(url, headers)

  使用权

  req = requests.get(url=url, headers=headers)

req.encoding = "utf-8"

  通过lxml解析网页

  bf = BeautifulSoup(html, "lxml")

  通过观察,每个热搜都在tr class=""下,所以只需遍历所有class=""

  你可以上每一个热搜

  div_content = bf.find_all("tr", class_="")

  遍历div_content获取各个热搜的排名、话题、讨论量

  for item in div_content:

  删除顶部消息并将变量 t = 1 添加到循环中

  if (t == 1):

          t = 0

          continue

  tr下有3条td信息,分别代表排名、热搜话题和浏览量、标签表达。前两条信息是我们想要得到的。

  获取当前热搜排名

  num_content = item.select("td")[0].string

  热搜话题和浏览量分别在td-02的a标签和span标签下

  获取当前热门话题

  content = item.select("td")[1].select("a")[0].string

  获取当前热搜话题的讨论量

  num = item.select("td")[1].select("span")[0].string

  获取当前系统时间需要在前面import from time import strftime

  current_time = strftime("%Y-%m-%d %H:%M")

  将当前热搜排名、当前热搜话题、当前热搜话题讨论量、当前系统时间放入列表存储数据

  list = [content,num_content,num,current_time]

  将整个列表放入列表中

  list_content.append(list)

  2.存储数据

  存储爬取的数据,存储方式def store_Excel(list):

  写入文件,编码方式为utf_8_sig,生成的csv文件不会乱码,不换行的操作为newline=""

  with open("微博实时热搜.csv","a",encoding="utf_8_sig",newline="")as file:

  csv_writer = csv.writer(file)

  遍历列表,写

        for item in list:

       csv_writer.writerow(item)

  关闭文件

  file.close()

  3.生成词云

  想法:

  整合一天爬取的所有数据

  2、通过累加的方式遍历并累加列表,将列表变成长字符串

  3.通过口吃分词和空间分词来分割字符串

  4.找一张轮廓清晰的图片打开,使用numpy获取轮廓

  5、使用WordCloud生成当天微博热点词云。

  导入生成词云的库

  rom wordcloud import WordCloud

import Image

import numpy

import jieba

  为字符串存储定义字符串

  str = ""

  阅读热搜热点表

  with open("微博实时热搜test.csv","r",encoding="utf_8_sig",newline="") as file:

    csv_reader = csv.reader(file)

  遍历列表

  for item in csv_reader:

  去掉第一个无用的信息,在循环外定义变量t=1

  if t == 1:

        t = 0

        continue

  字符串拼接,热门话题在第一栏

  str += item[0]

  关闭文件

  file.close()

  口吃分词

  jieba_content = jieba.cut(str)

  空间连接的join方法

  join_content=" ".join(jieba_content)

  打开图片

  wei_bo = Image.open("logo.jpg")

  找到轮廓

  wei_bo_image = numpy.array(wei_bo)

  制作生成的词云

  word_cloud = WordCloud(font_path="font1.TTF",background_color="white",mask = wei_bo_image).generate(join_content)

word_cloud.to_file("微博热搜.jpg")

  最终词云展示:

  微博logo图片勾勒出文字云。字体大小代表受欢迎程度。字体越大,受欢迎程度越高。字体越小,受欢迎程度越低。

  

  4.分析数据

  想法:

  1.将微博热门话题存储在txt文件中

  2.读取txt文件,使用jieba分词进行分词,生成关键词

  3. 对 关键词 执行频率统计

  4.按频率降序对统计信息进行排序关键词

  5. 将排序结果存储在 csv 文件中以供以后操作

  定义词典

  word_dic = {}

  打开文件,读取数据

  使用 open("1.txt", "r", encoding="utf-8") 作为文件:

  txt = file.read()

  文件.close()

  jieba分词数据

  单词 = jieba.lcut(txt)

  循环数据

  言归正传:

  如果关键字数量为1,则不计入

  如果 len(word) == 1:

  继续

  否则频率增加 1

  别的:

  word_dic[word] = word_dic.get(word, 0) + 1

  将字典数据转换为元组数据,用zip实现

  word_zip = zip(word_dic.values(), word_dic.keys())

  根据值从大到小对元组中的数据进行排序

  word_sort = list(排序(word_zip, reverse=True))

  定义两个数据存储列表

  list_1 = ["name", "count_name"]

  list_2 = []

  列表_2.追加(列表_1)

  对于 word_sort 中的项目:

  # 词频

  计数 = 项目 [0]

  #关键字

  名称 = 项目 [1]

  list_1 = [名称,计数]

  列表_2.追加(列表_1)

  写入文件

  以open("微博热搜关键词词频统计.csv", "w", encoding="utf_8_sig", newline="")为文件:

  csv_writer = csv.writer(文件)

  遍历list_2并写入每一行

  对于 list_2 中的 i:

  csv_writer.writerow(i)

  5.生成绘图

  思路:根据热搜关键词的排序文件,提取频率最高的前20位数据,绘制条形图

  导入绘图工具包

  将熊猫导入为 pd

  将 matplotlib.pyplot 导入为 plt

  定义绘图样式和颜色

  plt.style.use('ggplot')

  颜色1 = '#6D6D6D'

  读取排序文件

  df = pd.read_csv("微博热搜关键词词频统计.csv",encoding="utf-8")

  提取前 20 个 关键词 和频率

  name1 = df.name[:20]

  count1 = df.count_name[:20]

  要绘制条形图,请使用 range() 使 x 轴保持正确的顺序

  plt.bar(范围(20),count1,tick_label = name1)

  设置纵坐标范围

  plt.ylim(0,90)

  显示中文字体标签

  plt.rcParams['font.sans-serif'] = ['SimHei']

  标题

  plt.title('微博热搜关键词词频统计',color = colors1)

  x 轴标题,y 轴标题

  plt.title('微博热搜关键词词频统计',color = colors1)

  plt.xlabel('关键词')

  为每个条添加数字标签

  对于枚举中的 x,y (list(count1)):

  plt.text(x,y+1,'%s'%round(y,90),ha = 'center',color = colors1)

  x轴关键字旋转300度

  plt.xticks(旋转 = 300)

  自动控制空白边距以显示所有 x 轴坐标

  plt.tight_layout()

  保存图片

  plt.savefig('微博热搜关键词词频统计top20.png')

  显示图像

  plt.show()

  绘图结果显示:

  

  这次爬虫抓取了大约20组数据,每组数据对应50个热搜榜。爬取时间为2020年1月1日9:30-21:00,每次爬取时间间隔为20-30分钟。抓取这么多组数据的主要目的是为了做数据的动态效果,展示过去一天微博热搜的动态变化。

  数据动态展示效果图:

  

  完整数据动态效果视频请参考微博热搜数据动态展示.mp4

  分类:

  技术要点:

  相关文章:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线