专栏首页Python编程与实战文章马伊琍离婚后微博评论太多了...用代码来解决吧

文章马伊琍离婚后微博评论太多了...用代码来解决吧

上周末文章同学的一条微博:“吾愛伊琍,同行半路,一别两宽,餘生漫漫,依然親情守候.

紧接着马伊琍的一条微博:“你我深爱过,努力过,彼此成就过。此情有憾,然无对错。往后,各生欢喜.

两人正式通过微博宣布离婚,结束了11年的婚姻。微博一出,迅速引来大批吃瓜群众。 文章之前说过:这辈子最大的骄傲就是娶了马伊琍,,,微博评论里面也炸开了锅…

so 本篇文章将爬取微博里面的评论,保存到 excel,然后做成词云图。

吃瓜嘛,越大越好,不能少了另一个主角,所以我还爬取了姚笛最新一条微博的评论,果然里面吃瓜群众还是很多滴!

页面分析

拿文章同学的微博来做分析 微博地址

2019-08-02_173241.png

没有加密,美滋滋呀,已经很久没碰到这么友好的网站了。

再看一下翻页的参数,

参数有点多呀…不过最主要的是 page 这个参数 so 我们直接在第一次请求的参数里面直接加上 page 这个参数,尝试一下,说不定有惊喜…

有数据,哈哈哈。所以其他参数都无关紧要不影响,另外注意将浏览器的 cookie 复制到请求头中,因为微博会对 cookie 作验证。

代码

分析完之后,就可以正式开始码代码了。 不多说了,比较简单,直接帖代码吧

headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",
        "Cookie": "",
    }

    def get_comment(self, num):
        url = "https://weibo.com/aj/v6/comment/big"
        result_list = []
        print(f"{num} start")
        for page in range(1, WeiBo.pages.value):
            params = {
                "ajwvr": "6",
                "id": num,
                "from": "singleWeiBo",
                "__rnd": int(time.time() * 1000),
                "page": page
            }
            response = requests.get(url, headers=self.headers, params=params)
            json_data = response.json()
            if json_data["code"] == "100000":
                html = json_data["data"]["html"]
                selector = Selector(text=html)
                ul_list = selector.css(".WB_text")
                for a in ul_list:
                    # 用户id
                    user_id = a.css("a ::attr(usercard)").extract_first("").replace("id=", "")
                    # 评论
                    comment = ''.join(a.xpath("./text()").extract()).strip().replace(":", "")
                    if comment == "等人" or "回复:" in comment:
                        continue

                    if comment:
                        result_list.append(comment.strip())
                print(f"{num}: 正在爬取第{page}页")

            time.sleep(2)

        return result_list

因为微博有 ip 反爬,所以加了一点延时,评论的页数和微博 id 写到配置文件中了,方便修改 下面是爬虫调度的和数据存储的代码

    def write_csv(self):
        writer = pd.ExcelWriter('result.xls')

        with ThreadPoolExecutor(max_workers=3)as t:
            task1 = t.submit(self.get_comment, WeiBo.ma_yi_li.value)
            task2 = t.submit(self.get_comment, WeiBo.wen_zhang.value)
            task3 = t.submit(self.get_comment, WeiBo.yao_di.value)

            ma_yi_li = task1.result()
            wen_zhang = task2.result()
            yao_di = task3.result()

            p1 = pd.DataFrame(data={"ma_yi_li_dict": ma_yi_li}, columns=["ma_yi_li_dict"])
            p2 = pd.DataFrame(data={"wen_zhang_dict": wen_zhang}, columns=["wen_zhang_dict"])
            p3 = pd.DataFrame(data={"yao_di_dict": yao_di}, columns=["yao_di_dict"])

            p1.to_excel(writer, sheet_name="ma_yi_li")
            p3.to_excel(writer, sheet_name="yao_di")
            p2.to_excel(writer, sheet_name="wen_zhang")

            writer.save()
            writer.close()

时间关系,代码就不那么讲究了,最后爬下来的结果如下:

文章

姚笛

马伊琍

数据都在同一个 excel 不同的 sheet 里面,因为为了赶时间只爬了 100 页,总共 3000 多条评论。

词云图

数据都有了,词云图就很好搞了,基于 WordCloud 模块 直接上代码:

@staticmethod
    def read_csv():
        path = os.getcwd()
        img = Image.open(path + r'\1.jpg')  # 打开图片
        img_array = np.array(img)  # 将图片装换为数组

        for name in ["ma_yi_li", "yao_di", "wen_zhang"]:
            d = pd.read_excel("result.xls", sheet_name=name, usecols=[1])
            df_copy = d.copy()
            df_copy[name] = df_copy['{}_dict'.format(name)].apply(lambda x: x)
            df_list = df_copy.values.tolist()
            comment = jieba.cut(str(df_list), cut_all=False)
            words = ' '.join(comment)
            stop_word = {'xa0'}

            wc = WordCloud(scale=4, width=2000, height=1800, background_color='white', font_path="simfang.ttf",
                           stopwords=stop_word, contour_width=3, mask=img_array)
            wc.generate(words)
            wc.to_file('{}.png'.format(name))

注意,WordCloud 这里有个坑,中文的词云图需要指定 font_path 字体,而这个字体是本机中的字体格式

具体格式内容,请自行参考下图寻找

词云图的背景用的是最近很火热的哪吒! 运行之后耐心等待,会在本地生成三张图片,结果如下:

姚笛在中间的位置,嗯… 本来这篇文章以为只要花一点点时间就能完成的,没想到最后还是拖拖拖了将近两个小时,加班才完成的…

本文分享自微信公众号 - Python编程与实战(pthon1024),作者:Jerryning

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python爬虫之JS逆向入门篇

    我们都知道现在是大数据时代,用爬虫来获取数据的越来越多,与之对应的就是破解反爬的难度也越来越大

    Python编程与实战
  • 爬虫之线程池 ThreadPoolExecutor 的用法及实战

    从Python3.2开始,标准库为我们提供了 concurrent.futures 模块,它提供了 ThreadPoolExecutor (线程池)和Proce...

    Python编程与实战
  • Flask 蓝图机制及应用

    我们都知道 flask 是一个轻量级的 web 框架,相对于其他同类型框架更为灵活、轻便、安全且容易上手。开发者可以随意编写自己想要的项目结构,同时还有很多的第...

    Python编程与实战
  • 【一起学源码-微服务】Ribbon 源码二:通过Debug找出Ribbon初始化流程及ILoadBalancer原理分析

    上一讲讲了Ribbon的基础知识,通过一个简单的demo看了下Ribbon的负载均衡,我们在RestTemplate上加了@LoadBalanced注解后,就能...

    一枝花算不算浪漫
  • JavaScript中的类型判断

    类型判断在 web 开发中有非常广泛的应用,简单的有判断数字还是字符串,进阶一点的有判断数组还是对象,再进阶一点的有判断日期、正则、错误类型,再再进阶一点还有比...

    ConardLi
  • spring boot 基于yml整合jsp

    对应习惯了jsp开发的朋友来说,使用spring boot的时候也想使用jsp怎么办?本文将图文并茂的讲解怎么在spring boot中使用jsp。

    凯哥Java
  • c#中的可空类型和空合并操作符(Nullable Types 和 Null Coalescing Operator)

    程序你好
  • 帝国cms支持的变量及灵动标签变量汇总

      帝国CMS对首页、列表页、内容页这三个页面模板支持的变量是不同的,有的是通用的,有的不是通用的,本文就这三个模板常用的变量列于此,另外灵动标签很好用啊,也顺...

    ytkah
  • (新瓶旧酒)谷歌官方MVP项目学习--浅入源码

    项目的目的是通过展示各种架构app的不同方式来帮助开发者解决架构问题。项目中通过不同的架构概念及方式实现了功能相同的app。你可以用示例来当做参考,或是干脆拿来...

    用户2802329
  • 【Android】RxJava + Retrofit完成网络请求

    Gavin-ZYX

扫码关注云+社区

领取腾讯云代金券