当前位置:   article > 正文

python怎么爬取知乎回答并制作词云_爬虫|爬取微博动态

爬取知乎并生成词云图

da18b0280b8f1877ce6b2f96654dca6d.png

d6fdd1074cd2a4214d0791153180eb14.gif

爬取微博是爬虫新手入门项目,相对简单。但没想到还是遇到了些问题。。

0 踩点

老规矩第一步先踩点。某个用户的微博网址为:https://weibo.com/u/id,其中id是一长串数字,每个用户都有一个唯一的id对应。

打开网址后,右键-检查,切换到Network面板。往下滑,可以发现在微博加载出来的同时,Network也加载出来一些东西。推测这两者是有关系的。

12ce0e68e11dc8d9191c985a94e70a53.gif

在这个网址摸索一番之后没有任何收获,找不到有用的信息。

后来查阅资料发现,我打开的这个网址是PC端的,信息比较多,结构也比较复杂。一般来说,都是选择m端即mobile端也即手机端的页面进行爬取,虽然有时候信息会少一些,但是爬取难度低。

那要怎么打开m端页面呢?直接在PC端的网址前加个m.就行了!其实真正的m端网址是:https://m.weibo.cn/p/id2,但是加个m.就行了,会自动跳转到正确的m端网址去。id2和前面的PC端的id不一样,不过id2不重要,不需要研究他。

6efd45b13a0ab5a2e9665d3b6d77b97d.png

看起来就比PC端页面清爽多了啊...

接下来还是相同套路,右键-检查,切换到Network面板。往下滑,在加载出的文件中寻找可能有用的信息。耐心查找之后就可以发现:

141836e2566a4b4b8e6be67e49830adc.png

这一堆数据就是和微博动态相关的,随便打开一个就看到了相关信息。当然要想知道具体和微博中的什么信息对应,还要经过细心比对。

2c7b4fa90077c08aa0bb47a94a849fa3.png

但是任务依然没有完成,因为我们没有发现前后数据的关系。

containerid是固定的,但是since_id却没有规律,或者说我们没有发现这个参数的规律,那么我们就无法实现自动爬取。

卡在这里挺久的,去往上查了资料发现不久(可能就几个月)前,还有一个参数page来表示是第几页的动态。

page=1就得到第1页的动态,page=2就得到page第2页的动态。page这个参数显然比since_id好用得多。

经过测试,我发现page参数还是能用的。

但是我认为我并没有解决问题,因为我没有自己从微博网页发现page参数!所以我继续寻找。

1 继续寻找

经过很多次且很随意的测试,我发现了一个更简洁的页面。先点击主页,然后划到最下面,再点击查看全部微博。

6734e563e56eb9eb10f8d06d6ce9f86d.png

跳转到另一个页面:

f6eb11a1fe90bfd1cd3a0096affe2f34.png

这个页面又比刚刚的页面少了很多花里胡哨的东西。所以呢,还是那个套路。。

这次就发现了page参数,发现了有规律的网址!

028ea85e5916eea8bbdffca66f26121b.png

又经过多次测试,发现只有containerid和page这两个参数是有用的,其他参数不影响,可以删除!我们现在终于知道微博动态所在的网址了。

2 代码

现在就可以开始写代码了。

包导入和变量定义。

  1. import requests
  2. from pyquery import PyQuery as pq
  3. from wordcloud import WordCloud
  4. from PIL import Image
  5. import jieba
  6. import numpy as np
  7. weibo_id = '' # 微博用户id
  8. base_url = 'https://m.weibo.cn/api/container/getIndex?containerid=230413' + weibo_id + '&page='
  9. headers = {
  10. 'Accept': 'application/json, text/plain, */*',
  11. 'MWeibo-Pwa': '1',
  12. 'Referer': 'https://m.weibo.cn/u/6132300208',
  13. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
  14. + 'Chrome/75.0.3770.100 Safari/537.36',
  15. 'X-Requested-With': 'XMLHttpRequest'
  16. }
  17. FILE_NAME = 'weibo.txt' # 保存微博文本内容
  18. IMG_PATH = 'love2.jpg' # 词云的形状

获得json格式的数据。

  1. def get_content(page_num):
  2. url = base_url + str(page_num)
  3. response = requests.get(url, headers=headers)
  4. if response.status_code == 200: # 200表示正常,没被限制
  5. content_json = response.json()
  6. return content_json
  7. else:
  8. return [] # 返回空列表

解析json,提取需要的文本内容。

  1. def parse_json(content_json):
  2. text = ''
  3. if content_json:
  4. items = content_json.get('data').get('cards')
  5. for item in items:
  6. item = item.get('mblog')
  7. # 找到文本内容
  8. temp = pq(item.get('text')).text()
  9. pos = temp.find('/')
  10. # 把之前转发此微博的人发的文本内容去掉
  11. if pos != -1:
  12. temp = temp[:pos]
  13. text = text + temp
  14. # 找到转发的微博的文本内容
  15. # 如果此微博是本人发的,retweeted_status就不存在
  16. item = item.get('retweeted_status')
  17. if item:
  18. text = text + pq(item.get('text')).text() + 'n'
  19. return text

制作词云所需的函数。

  1. def transform(text):
  2. word_list = jieba.cut(text)
  3. # 分词后在单独个体之间加上空格
  4. text = ' '.join(word_list)
  5. return text
  6. def get_word_cloud():
  7. with open(FILE_NAME, 'r', encoding='utf-8') as f:
  8. img_matrix = Image.open(IMG_PATH)
  9. mask = np.array(img_matrix)
  10. wc = WordCloud(mask=mask, scale=4, font_path=r'C:WindowsFontssimhei.ttf', background_color='white',
  11. max_font_size=40, min_font_size=2)
  12. text = f.read()
  13. text = transform(text)
  14. wc.generate(text)
  15. wc.to_file(weibo_id + 'wc.png')

词云在之前的文章介绍过,这里不再重复说了。移步

爬虫|用Python小数据分析bilibili鬼畜巨头波澜哥(●◡●)_python_小z的笔记本-CSDN博客​blog.csdn.net
666fdf77cf76fcaeb4062d4999451e6c.png

主函数。

  1. if __name__ == '__main__':
  2. all_text = '' # 保存所有的文本
  3. for page in range(1, 11):
  4. content_json = get_content(page)
  5. text = parse_json(content_json)
  6. all_text = all_text + text
  7. # 保存到文件
  8. with open(FILE_NAME, 'w', encoding='utf-8') as f:
  9. f.write(all_text)
  10. # 生成词云
  11. get_word_cloud()

3 结果

看一下结果吧。

c978d6626dda7702f1d23b42fcf7d52f.png

所以这个人是什么状况看得一清二楚了。。可以分析的还有其他内容,比如分析时间,可以知道这个人在什么时间玩微博。

4 一点感想

很早就爬过微博了,本以为会是很简单的一次实践却遇到了困难。

靠自己解决了在网上找不到方法的问题。

第一次知道了还有m站这种东西。

新技能:爬取微博并制作词云get√

往期瞎写:

多目标进化算法在求解多值网络逻辑网络问题的应用!​mp.weixin.qq.com
3dafb2758313ac8d40c86439431fff65.png
在GitHub上大热的狗屁不通文章生成器是什么原理?​mp.weixin.qq.com
36161fe147ec5e57b3077c7c0797311b.png
用Python小数据分析bilibili鬼畜巨头波澜哥(●'◡'●)​mp.weixin.qq.com
f7c45e78f0a293badfe1c9893b411967.png

水平有限,如有错误,欢迎交流和批评指正!转载注明出处即可。

转自公众号「小z的笔记本」

每周更新各种内容

包括但不限于Python、爬虫、其他骚操作

欢迎关注

1e929dd0a9b10d03b3b50d0069d91be1.png

012ac47b40e3677533cc6551120242bf.png

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/847208
推荐阅读
相关标签
  

闽ICP备14008679号