惊闻马大姐婚变,我连夜爬了微博评论,沦陷

9,199 阅读4分钟

娱乐圈的瓜真的是一波又一波,这次又轮到文章和马伊琍了。他们具体为啥会婚变,咱也不知道,啥也不敢问,啥也不干说。不过他们微博下面还是开锅了,下面就一起来看看吧。

微博页面分析

首先我们先来看看微博页面,爬虫要从何处下手。

页面分析

我们直接进入到马伊琍微博的评论页面

weibo.com/1196235387/…

可以看到页面如下:

然后我们使用 Chrome 的调试工具(F12),切换到 Network 页签,再次刷新页面,能够看到一条请求,如下:

先拷贝出这个请求 URL,放到 Postman 里试一试,如图:

这都是些啥???

果然没那么简单,看来有反爬在作怪,那么反反爬三板斧先用起来,headers 加一哈

再来继续继续观察 Network 中的请求 headers,发现有一个 Cookie 是那么的长,拷贝出来添加上试试吧

再次使用 Postman 调用

哎呦,不错哦,有正常数据返回了

URL 分析

现在再来看看我们使用的 URL:

weibo.com/aj/v6/comme…

总共有4各参数,ajwvr、id、from 和 __rnd。

1.精简 URL

我们先从后往前一个一个的去掉每个参数试试,发现去掉后面两个,我们都可以获取到评论记录,那么后面两个参数我们就去掉它,现在的 URL 变为:

weibo.com/aj/v6/comme…

2.增加 page 参数

再次观察现在获取到的数据,发现返回的数据还有一个 page 的数据域,如下:

而且当前是在 "pagenum": 1 的,那么我们要怎么控制到不同的 page 页面呢,试着增加一个 page 参数到 URL 中,如:

weibo.com/aj/v6/comme…

果然,真的访问到 page 2 了,是不是很香啊

至此,我们的页面分析就基本完成了,下面就是拿数据喽。

获取并保存数据

获取保存数据的部分就比较常规了,直接看看代码

import requests
import json
from bs4 import BeautifulSoup
import pandas as pd
import time


Headers = {'Cookie': 'SINAGLOBAL=4979979695709.662.1540896279940; SUB=_2AkMrYbTuf8PxqwJRmPkVyG_nb45wwwHEieKdPUU1JRMxHRl-yT83qnI9tRB6AOGaAcavhZVIZBiCoxtgPDNVspj9jtju; SUBP=0033WrSXqPxfM72-Ws9jqgMF55529P9D9W5d4hHnVEbZCn4G2L775Qe1; _s_tentry=-; Apache=1711120851984.973.1564019682028; ULV=1564019682040:7:2:1:1711120851984.973.1564019682028:1563525180101; login_sid_t=8e1b73050dedb94d4996a67f8d74e464; cross_origin_proto=SSL; Ugrow-G0=140ad66ad7317901fc818d7fd7743564; YF-V5-G0=95d69db6bf5dfdb71f82a9b7f3eb261a; WBStorage=edfd723f2928ec64|undefined; UOR=bbs.51testing.com,widget.weibo.com,www.baidu.com; wb_view_log=1366*7681; WBtopGlobal_register_version=307744aa77dd5677; YF-Page-G0=580fe01acc9791e17cca20c5fa377d00|1564363890|1564363890'}


def mayili(page):
    mayili = []
    for i in range(0, page):
        print("page: ", i)
        url = 'https://weibo.com/aj/v6/comment/big?ajwvr=6&id=4399042567665659&page=%s' % int(i)
        req = requests.get(url, headers=Headers).text
        html = json.loads(req)['data']['html']
        content = BeautifulSoup(html, "html.parser")
        # comment = content.find_all('div', attrs={'class': 'list_li S_line1 clearfix'})
        comment_text = content.find_all('div', attrs={'class': 'WB_text'})
        for c in comment_text:
            mayili_text = c.text.split(":")[1]
            mayili.append(mayili_text)
        time.sleep(5)

    return mayili


def wenzhang(page):
    wenzhang = []
    for i in range(0, page):
        print("page: ", i)
        url = 'https://weibo.com/aj/v6/comment/big?ajwvr=6&id=4399042089738682&page=%s' % int(i)
        req = requests.get(url, headers=Headers).text
        html = json.loads(req)['data']['html']
        content = BeautifulSoup(html, "html.parser")
        # comment = content.find_all('div', attrs={'class': 'list_li S_line1 clearfix'})
        comment_text = content.find_all('div', attrs={'class': 'WB_text'})
        for c in comment_text:
            wenzhang_text = c.text.split(":")[1]
            wenzhang.append(wenzhang_text)
        time.sleep(5)

    return wenzhang


if __name__ == '__main__':
    print("start")
    ma_comment = mayili(1001)
    mayili_pd = pd.DataFrame(columns=['mayili_comment'], data=ma_comment)
    mayili_pd.to_csv('mayili.csv', encoding='utf-8')

    wen_comment = wenzhang(1001)
    wenzhang_pd = pd.DataFrame(columns=['wenzhang_comment'], data=wen_comment)
    wenzhang_pd.to_csv('wenzhang.csv', encoding='utf-8')

总共 page 页面有 2000 多页,要爬完还真是需要一段时间,我这里配置了 1000,应该是够了。而且还做了 sleep 5 的操作,一个是爬取太快,会被微博视为异常请求,被禁,而且也不会对人家的正常服务产生影响,毕竟盗亦有道嘛!

词云做成

等爬虫跑完之后,我们简单看下数据的内容

马伊琍微博评论

文章微博评论

数据都拿到了,下面就做成词云看看,各路粉丝的态度吧

这里就不对评论内容做过多置喙了,毕竟说多了都是错

def wordcloud_m():
    df = pd.read_csv('mayili.csv', usecols=[1])
    df_copy = df.copy()
    df_copy['mayili_comment'] = df_copy['mayili_comment'].apply(lambda x: str(x).split())  # 去掉空格
    df_list = df_copy.values.tolist()
    comment = jieba.cut(str(df_list), cut_all=False)
    words = ' '.join(comment)
    wc = WordCloud(width=2000, height=1800, background_color='white', font_path=font,
                   stopwords=STOPWORDS, contour_width=3, contour_color='steelblue')
    wc.generate(words)
    wc.to_file('m.png')

马伊琍评论词云

文章评论词云

最后,我把所有的代码都上传到 GitHub 上了,需要的可以自取 github.com/zhouwei713/…