最近听闻「杨超越杯编程大赛」很是火热~
网友纷纷评论,原来追星还可以这么硬核,没点实力还不敢追了。
本期,小F通过爬取新浪微博评论,来看看大家对此次大赛有什么看法。
在此之前,先查阅一下相关资料,发现从微博的手机端和移动端入手,效果还可以。
网页版的微博,想都不用想,去了就是自讨苦吃。
微博的反爬甚是厉害,我可不想去大动干戈...
虽然最后由于种种原因,还是没能够获取到完整的评论,不过也拿到了挺多数据。
还是可以拿来一窥的。
/ 01 / 网页分析
**完整代码加群:683380553 获取!**
网页端微博直接不看,先看一下手机端。
网址为 https://m.weibo.cn。
对于手机端的微博,主要是获取它的id值。
为什么不用它来爬取评论信息呢?
因为在对评论翻页时,它的url参数是改变的,需要构造新的url。
当然新的url也是有办法构造出来的,只不过需要去找一下参数信息。
不过有方便的方法,为何不用~
比如下面这个方法,使用上面获取的id值,通过特定的接口获取评论信息。
但是这个办法也是有问题的,当请求超过100页时,就没有评论信息返回。
那么就该移动端上场了,相信在诺基亚的时代,你对下面这样的网页应该并不陌生。
上面两个办法的响应信息都是json格式。
而这里则是正常的网页情况。
此外这里的评论信息有时会少掉一些,具体什么原因我也不得而知。
对于本次爬取,少了30页的评论信息。
不过不封IP,不封Cookie,个人感觉挺好的...
/ 02 / 评论获取
通过移动端微博获取评论信息。
具体代码如下。
from copyheaders import headers_raw_to_dict from bs4 import BeautifulSoup import requests import time import re headers = b""" accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 accept-encoding:gzip, deflate, br accept-language:zh-CN,zh;q=0.9 cache-control:max-age=0 cookie:你的cookie upgrade-insecure-requests:1 user-agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 """ # 将请求头字符串转化为字典 headers = headers_raw_to_dict(headers) # 第一页有热门评论,拿取信息较麻烦,这里偷个懒~ for i in range(2, 500): print('第' + str(i) + '页') time.sleep(5) # 请求网址 url = 'https://weibo.cn/comment/HjNyl82IU?uid=5852861043&rl=0&page=' + str(i) response = requests.get(url=url, headers=headers) html = response.text # print(html) soup = BeautifulSoup(html, 'html.parser') # 评论信息 result_1 = soup.find_all(class_='ctt') # 点赞数 result_2 = soup.find_all(class_='cc') # 评论时间 result_3 = soup.find_all(class_='ct') # 获取用户名 result_4 = re.findall('id="C_.*?href="/.*?">(.*?)</a>', html) try: for j in range(len(result_1)): # 获取点赞数 res = re.findall('(\d+)', result_2[j * 2].get_text()) if len(res) > 0: praise = res[0] name = result_4[j] text = result_1[j].get_text().replace(',', ',') date = result_3[j].get_text().split(' ')[0] # print(praise) if '@' in text: if ':' in text: # 去除@及用户信息 comment = text.split(':')[-1] print(name, comment, praise, date) # 写入csv with open('101.csv', 'a+') as f: f.write(name + ',' + comment + ',' + praise + ',' + date + '\n') f.close() else: # 无评论信息时 print(name, '无', praise, date) with open('ycy.csv', 'a+') as f: f.write(name + ',' + '无' + ',' + praise + ',' + date + '\n') f.close() else: # 只有评论信息 print(name, text, praise, date) # 写入csv with open('101.csv', 'a+') as f: f.write(name + ',' + text + ',' + praise + ',' + date + '\n') f.close() else: pass # 出现字符编码报错 except: continue
最后成功获取评论信息。
包含了用户名、评论、点赞数、评论发表时间。
微博里是显示一共有5000多条评论,但是最后却只获取了3000多条。
这里很大的一个原因就是编码问题...
因为我去掉了不少编码有问题的评论(我没去解决这个问题)。
/ 03 / 生成词云
针对大家的评论,生成词云。
from wordcloud import WordCloud import matplotlib.pyplot as plt import numpy as np import pandas import random import jieba # 设置文本随机颜色 def random_color_func(word=None, font_size=None, position=None, orientation=None, font_path=None, random_state=None): h, s, l = random.choice([(188, 72, 53), (253, 63, 56), (12, 78, 69)]) return "hsl({}, {}%, {}%)".format(h, s, l) # 绘制圆形 x, y = np.ogrid[:1500, :1500] mask = (x - 700) ** 2 + (y - 700) ** 2 > 700 ** 2 mask = 255 * mask.astype(int) # 读取信息 df = pandas.read_csv('101.csv', header=None, names=['name', 'comment', 'praise', 'date'], encoding='gbk') words = pandas.read_csv('chineseStopWords.txt', encoding='gbk', sep='\t', names=['stopword']) # 分词 text = '' for line in df['comment']: text += ' '.join(jieba.cut(str(line), cut_all=False)) # 停用词 stopwords = set('') stopwords.update(words['stopword']) wc = WordCloud( background_color='white', mask=mask, font_path='C:\Windows\Fonts\华康俪金黑W8.TTF', max_words=2000, max_font_size=250, min_font_size=15, color_func=random_color_func, prefer_horizontal=1, random_state=50, stopwords=stopwords ) wc.generate_from_text(text) # 看看词频高的有哪些 process_word = WordCloud.process_text(wc, text) sort = sorted(process_word.items(), key=lambda e: e[1], reverse=True) print(sort[:50]) plt.imshow(wc) plt.axis('off') wc.to_file("微博评论词云.jpg") print('生成词云成功!')
词云图如下。
还是能发现一些有趣的信息,比如说里面的「不配」「只会」「只能」「拖后腿」。
粉丝们都在疯狂的调侃自己。
当然也有很鼓舞人的话,比如「厉害」「优秀」「有趣」。
其实我在想「村民」又是什么新名词...
/ 04 / 总结
最后来看一波高赞的评论是怎么说的。
就第一、四条来看,原来比赛举办的还不少,果真实力追星。