【python爬虫】知乎互联网话题问答内容可视化分析

摘要:本文主要针对知乎网站互联网话题下的QA问答对内容进行分析,观察当前互联网话题下用户都比较关注什么。文章从数据爬取、问题分析、高赞答案分析、关键词可视化等方面进行QA内容解读,希望本文开源的代码能给您带来帮助。

开发环境说明:

  1. windows python 2.7
  2. requests库
  3. beautifulsoup
  4. jieba
  5. wordcloud

01

数据获取

一、知乎网站爬取

1. 模拟用户登录

(1)知乎的登录网站地址:https://www.zhihu.com/signin?next=%2F

(2)设置所使用的浏览器的header信息:(注意浏览器的版本)

header_info = {
    "Accept": "*/*",
    "Accept-Encoding": "gzip,deflate,sdch",
    "Accept-Language": "zh-CN,zh;q=0.8",
    "Connection": "keep-alive",
    "Connect-Length": "127",
    "Connect-type": "application/x-www-form-urlencoded; charset=UTF-8",
    "DNT": "1",
    "Host": "www.zhihu.com",
    "Origin": "http://www.zhihu.com",
    "Referer": "http://www.zhihu.com/people/xiaofeng-tong-xue/followers",
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36",
    "X-Requested-With": "XMLHttpRequest",
}

(3)设置用户登录信息:
data = {
    'account' : '你的登录名',
    'password' : '你的密码',
    'rememberme' : 'true',
}(4)登录过程:
首先访问登录界面,再提交你的用户登录信息
def login():
   loginurl = 'https://www.zhihu.com/signin?next=%2F
   global s
   s = requests.session()
   req = s.get(url, headers=header_info)
   print req
   loginREQ = s.post(loginurl, headers=headers, data=data)
   print loginREQ

2. 访问“互联网”话题下的问答页面,地址:https://www.zhihu.com/topic/19550517/top-answers

(1)查看页面HTML的结构,找到问题的链接地址和问题标题,如下:

(2)使用beautifulSoup解析该页面后,得到链接地址,进一步访问改地址获取答案的内容:

response = s.get(music_url, headers=header_info)
soup = BeautifulSoup(response.content, 'html.parser')
questions = soup.findAll('a', attrs={'class':'question_link'})

question_id = question.get('href') 
response = s.get("https://www.zhihu.com" + question_id, headers=header_info)

、
(3)进入问答内容的页面后,如下结构,继续查看HTML的结构,进行内容抽取



抓取的数据文本以Json格式保存,如下:

02

数据可视化

上一部分介绍了数据的抓取过程(完整代码请参见第三部分),本节主要介绍如何将获取的数据进行可视化展示。主要处理过程包括文本分词、去停用词、词频统计、可视化展示,针对问题和答案分别进行分析。

1.问题分析,可以发现大家提问主要着眼于关键词:王者荣耀、发现商机、打游戏、创业、百度、小米手机等。

2.答案分析,对于答案分析,主要选择点赞数最多的答案进行分析。类似问题进行可视化展示。区别于问题,答案中更多出现共享单车、数据、游戏、手机等关键词。

3.具体实现过程包括:jieba分词,去停用词以及wordcloud词云展示三部分。(完整代码参见第三部分)

03

完整代码分析

  1. 数据获取
import operator
import json
import os
import time
import re
import requests
import ConfigParser
import sys
from bs4 import BeautifulSoup
import json

reload(sys)
sys.setdefaultencoding('utf-8')

header_info = {
    "Accept": "*/*",
    "Accept-Encoding": "gzip,deflate,sdch",
    "Accept-Language": "zh-CN,zh;q=0.8",
    "Connection": "keep-alive",
    "Connect-Length": "127",
    "Connect-type": "application/x-www-form-urlencoded; charset=UTF-8",
    "DNT": "1",
    "Host": "www.zhihu.com",
    "Origin": "http://www.zhihu.com",
    "Referer": "http://www.zhihu.com/people/xiaofeng-tong-xue/followers",
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36",
    "X-Requested-With": "XMLHttpRequest",
}


def login():
   loginurl = 'https://www.zhihu.com/signin?next=%2F'
   data = {
        'account' : '你的账号',
        'password' : '你的密码',
        'rememberme' : 'true',
    }
   global s
   s = requests.session()
   req = s.get(url, headers=header_info)
   print req
   loginREQ = s.post(loginurl, headers=headers, data=data)
   print loginREQ

def ContentParser(content):
    dicReturn = {}
    soup = BeautifulSoup(content,"html.parser")
    title = soup.find_all("title")[0].get_text()
    title =  title[:-5]
    print title
    AnswerTop = soup.find_all("div",class_="RichContent-inner")[0].get_text()
    dicReturn["Q"] = title
    dicReturn["A"] = AnswerTop
    return dicReturn

def get_topic_music(music_url,fw):
   response = s.get(music_url, headers=header_info)
    soup = BeautifulSoup(response.content, 'html.parser')
    questions = soup.findAll('a', attrs={'class':'question_link'})
    for question in questions:
        question_id = question.get('href')
        response = s.get("https://www.zhihu.com" + question_id, headers=header_info)
        try:
            dicReturn = ContentParser(response.content)
        except:
            continue
        dicStr = json.dumps(dicReturn,ensure_ascii=False)
        fw.write(dicStr+"\n")
        time.sleep(0.5)

if __name__=='__main__':
   login()
   path = "你存文件目录"
   if not os.path.isdir(path):
       os.mkdir(path)
   file_name = path + "QA_zhihu.txt"
   fw = open(file_name, "a+")
   Url = "https://www.zhihu.com/topic/19550517/top-answers?page="
   for i in range(1,50):
      currentURL = Url+str(i)
      get_topic_music(currentURL,fw)
      time.sleep(2.5)
   fw.close()

2. 数据可视化

from wordcloud import WordCloud,STOPWORDS,ImageColorGenerator
import matplotlib.pyplot as plt
import jieba

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

f = open("你抓取的数据","r")
text = ""
for line in f.readlines():
    line = line.strip("\n")
    line = eval(line)["A"]
    text += ' '.join(jieba.cut(line))
    text += ' '

fstop = open("你的停用词表","r")
stopws = []
for idx,line in enumerate(fstop):
    line = line.strip("\n").strip()
    stopws.append(line)
stopwset = set(stopws)

fstop.close()
background_Image = plt.imread('你的背景图片')

wc=WordCloud(
background_color='white',
mask=background_Image,
font_path='C:\Windows\Fonts\STZHONGS.TTF',
max_words=200,
stopwords=stopwset,
max_font_size=150,
random_state=30
)

wc.generate_from_text(text)
print('开始加载文本')
img_colors=ImageColorGenerator(background_Image)
wc.recolor(color_func=img_colors)
plt.imshow(wc)
plt.axis('off')
plt.savefig("pro.png",dpi=1600)
print('display success!')

原文发布于微信公众号 - CodeInHand(CodeInHand)

原文发表时间:2018-01-06

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AhDung

【C#】让ReSharper灰色显示未使用的非私有成员的关键

1、在Inspection Severity中设置Non-private accessibility为Warning。如图:

1532
来自专栏吉浦迅科技

NVIDIA Jetson开发压箱底的秘密都在这里,很多人还不知道(一)

经常有人在群里问我各种“小”问题: Jetson TX2 显存是多大? Jetson TX2 开发板的尺寸是多大?给我个孔位图纸 Jetson TX2 支持最...

8018
来自专栏企鹅号快讯

微信跳一跳可以用 Python 刷分;macOS 再曝重大安全漏洞,或许已存在 15 年

转自:开源中国、solidot、cnBeta、腾讯科技等 ? 如果你每次都能挑到各自的正中间的话,可以 + 2 分,如果连着跳到中间会 + 4、+6、+8、+1...

22910
来自专栏逍遥剑客的游戏开发

一个困扰我一个多星期的Nebula3的BUG

1783
来自专栏Python中文社区

雪球网沪深全站股票评论爬虫

專 欄 ❈ 蜗牛仔,Python中文社区专栏作者,怒学Python爬虫,争当爬虫工程师, github地址: https://github.com/xiaob...

7406
来自专栏java达人

分布式系统的事务处理

当我们在生产线上用一台服务器来提供数据服务的时候,我会遇到如下的两个问题: 1)一台服务器的性能不足以提供足够的能力服务于所有的网络请求。 2)我们总是害怕我们...

25210
来自专栏上善若水

### 0x01 C++ 资源大全

关于 C++ 框架、库和资源的一些汇总列表,内容包括:标准库、Web应用框架、人工智能、数据库、图片处理、机器学习、日志、代码分析等。

3533
来自专栏小詹同学

Python程序员需要掌握的网络爬虫技术

当下是一个大数据的时代,各个行业都离不开数据的支持,因此,网络爬虫应运而生。编写网络爬虫当下最为火热的语言毫无疑问是Python,原因是,Python开发爬虫相...

1773
来自专栏lgp20151222

关于一次性的数据输入,excel字符串连接保存到服务器还是CRUD?

开发中遇到个问题,线下一个紧急的活动,给一个excel的文件,要把里面的一次性的数据放进活动里面,说真的几百几千个数据啊,手写进数据库不是更麻烦了吗?

1322
来自专栏VRPinea

撩妹必备技能之:如何用Unity 3D创建一个VR场景?

2.5K4

扫码关注云+社区

领取腾讯云代金券