c爬虫抓取网页数据(2021-10-29刚学新浪微博热搜主题讨论量获取)
优采云 发布时间: 2022-02-05 09:16c爬虫抓取网页数据(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
分类:
技术要点:
相关文章: