爬蟲系列之知乎

“ 今天要爬取的目標網站是知乎,獲取知乎上某個(如何看待山東的合村並居政策?)問題的所有回答,並對回答進行文本分析(分詞、詞頻統計、抽取關鍵詞及生成詞雲)”

爬蟲系列之大衆點評爬蟲系列之微博之後,今天繼續推送 有關知乎的爬蟲。仍然採用python的requests庫發送網絡請求,cookies信息依然採用在chrome瀏覽器F12狀態下進行復制粘貼。雖然網上有大量關於使用selenuim自動登錄知乎,解決手動複製cookies的缺點,但經過多次嘗試發現兩點:

1 使用selenuim 工具,手機號+密碼方式,點擊登錄按鈕無反映,失敗

2 使用selenuim 工具, qq號+密碼方式, 登錄成功,但是點擊搜索問題按鈕無反映,失敗。因此手動複製cookies是我認爲目前較爲方便穩妥的方式。後續會針對爬蟲自動登錄問題進行詳細講解。本文共分爲三個部分爬蟲步驟、爬蟲代碼、爬蟲結果。

本文的環境配置和之前是一致的(爬蟲系列之大衆點評),後續推出的網易音樂爬蟲、微信公衆號爬蟲、豆瓣電影爬蟲都是使用此配置。

01

知乎爬蟲步驟

 

知乎爬蟲關鍵步驟:

登錄知乎,明確“如何看待山東的合村並居政策?” 的url

https://www.zhihu.com/question/393313903/answer/1231430180,點擊下圖中的“查看全部2194個回答”

此時大家會發現,答案會展開,但是不會顯示所有的回答。F12進入開發者模式,如下圖所示,選擇XHR,

其中 answers?********就是返回給我們的數據。 

點擊第一個answers?*******, 選擇headers獲取cookies,選擇preview獲取data信息。如下圖。

到這裏,我們已經找到了要爬取的信息,同時requests發送請求的url,查詢 參數及cookies都可以獲得。

下一步就是在data數據中獲取需要的字段,可以發現data是json格式,可以直接requests().json進行解析。

繼續分析,我們發現知乎回答的頁面末端沒有頁碼標記,當我們下拉頁面時,回答會自動的增加,這就是ajax技術啦(網址不變,網頁內容更新,豆瓣網站也是如此),面對此類網站,我們在構造下一頁時,可以觀察xhr返回的url規律,在answers?************鏈接中,每次變動的參數只有 offset 。並且每次移動5個量,即每次下拉答案頁面,會增加5個回答。

至此,在經過F12分析後,我們做了明確url地址、詳細頁解析、下一頁url構造的工作。具體的爬蟲代碼在第二部分。

 

02

爬蟲代碼

知乎爬蟲代碼,結果保存在合村並居.xlsx

注意添加自己的cookie信息


# time  : 2020/6/24 10:29
# author :wujiajia
# email :[email protected]
# file  : gzh_zhihu_requests_v2.py
# Software: PyCharm
# python_version: 
# funcation:
# 功能:爬取知乎某個問題下的所有評論
# 知乎評論爬蟲特點:ajax響應, 需要解析url 地址。登入知乎賬號後,找到某個問題的所有評論,
# <-- 查看network 中的  answers 的 xhr 信息, 解析它的url地址。
import pandas as pd
import requests
import time

zid = []  # 保存用戶id
ztime = []  # 保存用戶發表評論的時間
zname = []  # 保存用戶姓名
zcomment = []  # 保存用戶評論內容
totals = []  # 記錄評論的總條數
def zhuhuSipder(page):
    url = "https://www.zhihu.com/api/v4/questions/393313903/answers"  # 合村並居 url
    # url = "https://www.zhihu.com/api/v4/questions/264739425/answers"  # 全國喫辣排行榜
    # 必須添加cookie 信息
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:57.0) Gecko/20100101 Firefox/57.0',
               "cookie": '自己的cookies',
               }
    data = {  # 這個data  就是 xhr 中 的查詢參數
        "include": "data[*].is_normal,admin_closed_comment,reward_info,is_collapsed,annotation_action,annotation_detail,collapse_reason,is_sticky,collapsed_by,suggest_edit,comment_count,can_comment,content,editable_content,voteup_count,reshipment_settings,comment_permission,created_time,updated_time,review_info,relevant_info,question,excerpt,relationship.is_authorized,is_author,voting,is_thanked,is_nothelp,is_labeled,is_recognized,paid_info,paid_info_content;data[*].mark_infos[*].url;data[*].author.follower_count,badge[*].topics",
        "limit": "5",  #
        "offset": str(page),
        "platform": "desktop",
        "sort_by": "default"
    }
    data_html = requests.get(url=url, params=data, headers=headers).json()  # 返回 json 信息, 5個用戶一頁

    # 將毫秒數變成 日期格式
    def timestamp_to_date(time_stamp, format_string="%Y-%m-%d %H:%M:%S"):
        time_array = time.localtime(time_stamp)
        str_date = time.strftime(format_string, time_array)
        return str_date

    # print(timestamp_to_date(data_html[0]["created_time"]))

    for i in data_html["data"]:
        id = i['author']['id']
        name = i['author']['name']
        comment = i["content"]
        time_ = timestamp_to_date(i["created_time"])
        # print(name + str(id) + ":" + comment)
        zid.append(id)
        ztime.append(time_)
        zname.append(name)
        zcomment.append(comment)

    totals_ = data_html["paging"]["totals"]  # 評論總條數
    totals.append(totals_)
    # print(totals[0])
    return totals[0]
# 多頁爬蟲
def mulitypage():
    page = 0
    zhuhuSipder(page)
    time.sleep(10)
    while (page < totals[0]):
        print("正在抓取第{}頁".format(int(page / 5)))
        page += 5
        zhuhuSipder(page)
# 保存數據
def savedata():
    v = list(zip(zid, ztime, zname, zcomment))
    print(v)
    pd.DataFrame(v, columns=["id", "time", "name", "comment"]).to_excel("合村並居.xlsx")


if __name__ == "__main__":
    mulitypage()
    savedata()

03

關鍵詞抽取及詞雲

獲取知乎的回答內容後,文本中有大量的html標記。文本分析的首要工作就是數據清洗嘍,去除html標記。

下面對excel數據進行清洗,運用jieba對清洗後的數據進行關鍵詞抽取,保存在"關鍵詞.txt"。作爲下一步詞雲的輸入數據。

# time  : 2020/6/24 13:56
# author :wujiajia
# email :[email protected]
# file  : gzh_data_wash.py
# Software: PyCharm
# python_version: 
# funcation:

import pandas as pd
import re
import jieba
df = pd.read_excel("合村並居.xlsx")
comment = df["comment"]
# print(comment)
rawdata = []
cut_rawdata = []
for i in  comment:
    # print(i.replace("<p>",""))
    #re.sub 可以使用 或 條件
    # print(re.sub("<p>|</p>|<figure.*?</figure>|<p.*?br/>|<br/>|<a .*?</a>|<h2>.*?</h2>|<hr/>|<b>|</b>|<ul>|</ul>","",i))

    comment_line = re.sub("<p>|</p>|<figure.*?</figure>|<p.*?br/>|<br/>|<a .*?</a>|<h2>.*?</h2>|<hr/>|<b>|</b>|<ul>|</ul>","",i)
    # print(type(comment_line))
    rawdata.append(comment_line)

for i in range(0, len(rawdata)):
        t = jieba.lcut(rawdata[i])
        cut_rawdata.append(" ".join(t))

def savetext(rawdata):
   for i in range(0, len(rawdata)):
    t = jieba.lcut(rawdata[i])
    with open("fenci.txt",'a',encoding="utf-8") as f:
        f.write(" ".join(t))

# savetext(rawdata)
#  jieba 對抽取關鍵詞
import jieba.analyse
 #index =0
se_ = []
for i in range(0, len(cut_rawdata)):
    # print(abstract_df["abstract"][index])
    abstract_s = "".join(cut_rawdata[i])
    # print(" ".join(jieba.analyse.extract_tags(abstract_s,topK=5,withWeight=False)))
    names = " ".join(jieba.analyse.extract_tags(abstract_s, topK=10, withWeight=False))
    se_.append(names)
    with open("關鍵詞.txt",'a',encoding="utf-8") as f:
        f.write(names)


# print(se_)
# jieba_tf_idf = pd.DataFrame({"jieba_tfidf": se_})
# print(jieba_tf_idf)

製作詞雲

from wordcloud import WordCloud
import PIL.Image as image
import numpy as np


with open("關鍵詞.txt",'r',encoding="utf-8") as f:
    # print(f.read())
    text = f.read()
    # 背景圖片
    mask = np.array(image.open("山東省地圖白.jpg"))  # 背景圖片一定要是白色底。形狀爲非白色的。
    wordcloud = WordCloud(mask=mask,font_path="C:\Windows\Fonts\STXINGKA.TTF").generate(text)
    image_produce = wordcloud.to_image()
    image_produce.show()

詞雲結果展示

 


老規矩代碼及數據獲取方式,關注公衆號回覆【知乎】即可領取案例教程。

寫在最後:這是爬蟲系列的第三篇文章,後續還有網易雲音樂、豆瓣電影等。但主要針對的是文本數據,後續將在財經數據進行擴展。爬蟲系列完結後,會爲大家繼續數據挖掘、文本分析的講解。

歡迎關注轉發,用案例教你學python!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章