上周末文章同学的一条微博:“吾愛伊琍,同行半路,一别两宽,餘生漫漫,依然親情守候.”
紧接着马伊琍的一条微博:“你我深爱过,努力过,彼此成就过。此情有憾,然无对错。往后,各生欢喜.”
两人正式通过微博宣布离婚,结束了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 字体,而这个字体是本机中的字体格式
具体格式内容,请自行参考下图寻找
词云图的背景用的是最近很火热的哪吒!
运行之后耐心等待,会在本地生成三张图片,结果如下:
姚笛在中间的位置,嗯…
本来这篇文章以为只要花一点点时间就能完成的,没想到最后还是拖拖拖了将近两个小时,加班才完成的…