最近听闻「杨超越杯编程大赛」很是火热~


网友纷纷评论,原来追星还可以这么硬核,没点实力还不敢追了


本期,小F通过爬取新浪微博评论,来看看大家对此次大赛有什么看法。


在此之前,先查阅一下相关资料,发现从微博的手机端和移动端入手,效果还可以。


网页版的微博,想都不用想,去了就是自讨苦吃。


微博的反爬甚是厉害,我可不想去大动干戈...


虽然最后由于种种原因,还是没能够获取到完整的评论,不过也拿到了挺多数据。


还是可以拿来一窥的。



/ 01 / 网页分析


网页端微博直接不看,先看一下手机端。


网址为 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(2500):
    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([(1887253), (2536356), (127869)])
    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 / 总结


最后来看一波高赞的评论是怎么说的。



就第一、四条来看,原来比赛举办的还不少,果真实力追星。


万水千山总是情,点个「好看」行不行。





···  END  ···



©著作权归作者所有:来自51CTO博客作者mb5fe18ec4a4df8的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 为你的网页添加深色模式[每日前端夜话0x48]
  2. 用Python模拟登陆GitHub并获取信息
  3. 【软考高级知识点】第一章.信息化和信息系统(一)
  4. 『爬虫四步走』手把手教你使用Python抓取并存储网页数据!
  5. 官方示例(十二):网页加载道路及Geoline开发ThingJS
  6. 钻漏洞,他用爬虫非法获取 1500 万余条个人信息,倒卖获利 54 万被判
  7. 推荐一个牛逼的生物信息 Python 库 - Dash Bio
  8. 关于数据科学的趋势和前景,这里有你想了解的信息
  9. 动画:Flex布局 | 别再用传统方式进行网页布局了(上)

随机推荐

  1. 为什么我不能在同一个js文件中建立两个cl
  2. 如何在angularjs代码中单元测试jquery元
  3. 如何在向下滚动时执行TEXT淡入效果
  4. Jquery | 基础 | 慕课网 | 元素选择器
  5. jquery1.9+获取append后的动态元素
  6. 如何更新jqgrid中的数据值
  7. jQuery源码剖析学习笔记
  8. jquery $.ajax $.get $.post的区别是什么
  9. jQuery 1.3 API 参考文档中文版
  10. [置顶] JQuery datatables 使用Fi