1. 程式人生 > >Python爬蟲(入門+進階)學習筆記 1-6 瀏覽器抓包及headers設定(案例一:爬取知乎)

Python爬蟲(入門+進階)學習筆記 1-6 瀏覽器抓包及headers設定(案例一:爬取知乎)

爬蟲的一般思路:

  • 抓取網頁、分析請求
  • 解析網頁、尋找資料
  • 儲存資料、多頁處理 
  • 本節課主要講授如何通過谷歌瀏覽器開發者工具分析真實請求的方法。

尋找真實請求的三個步驟

  • 分析:使用谷歌瀏覽器開發者工具分析網頁的請求
  • 測試:測試URL請求中每個引數的作用,找出控制翻頁等功能的引數
  • 重複:多次重複尋找符合爬蟲需要的真實請求

實戰環節:爬取知乎

通過爬取知乎“輪子哥”——vczh關注的人分析Ajax或者JavaScript載入的資料的真實請求並展示這種爬取方法的具體過程。

1. 尋找真實請求的測試

  • 首先,進入“輪子哥——vczh”關注的人的頁面(注意:需要先登入個人知乎賬號
  • 通過禁止JavaScript載入的方法發現頁面不能正常載入,確認該頁面的翻頁是通過JavaScript載入資料實現的
  • 使用谷歌瀏覽器開發者工具尋找包含關注人資訊的真實請求,可以發現真實請求是以“followees”開頭的請求,其返回一個JSON格式的資料,該資料對應下一頁的“他關注的人”: 
  • 雙擊這個請求,返回一個JSON格式的資料,可以通過安裝JSONView外掛在瀏覽器中更好地顯示該資料
  • 接下來便可以嘗試爬取該請求的資料

2. 嘗試爬取真實請求的資料

    首先使用前幾節課所學requests.get()嘗試爬取資料

    可以發現返回了“500 Server Error”,即由於網站反爬蟲的原因,伺服器返回了“500服務錯誤”

    該問題可以通過新增hearders請求頭資訊解決

3. 新增hearders請求頭資訊模擬瀏覽器訪問

    請求頭資訊承載了關於客戶端瀏覽器、請求頁面、伺服器等相關的資訊,用來告知伺服器發起請求的客戶端的具體資訊

    知乎的反爬蟲機制是通過核對請求頭資訊實現的,所以需要在使用requests請求資料的時候加上所需的請求頭

    對比知乎的請求頭資訊和常見的請求頭資訊,發現知乎請求頭多了authorization和X-UDID的資訊

    在爬蟲程式中新增請求頭資訊,即新增headers

# -*- coding:utf-8 -*-

import requests

headers = {
   'authorization':' ', #括號中填上你的authorization
   'User-Agent':' ', #括號中填上你的User-Agent
}
url = 'https://www.zhihu.com/api/v4/members/excited-vczh/followees?include=data%5B*%5D.answer_count%2Carticles_count%2Cgender%2Cfollower_count%2Cis_followed%2Cis_following%2Cbadge%5B%3F(type%3Dbest_answerer)%5D.topics&offset=20&limit=20'
response= requests.get(url, headers = headers).json()

print(response) 

最終程式碼:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Mar 20 16:01:47 2018

@author: Jackie
"""

import requests
import pandas as pd
import time

headers = {
        'authorization':'Bearer 2|1:0|10:1519627538|4:z_c0|92:Mi4xYzBvWkFBQUFBQUFBSU1JaTVqRU1EQ1lBQUFCZ0FsVk5FdnVBV3dEdHdaRmtBR1lmZEpqT3VvdmtpSm5QMWtkZ1ZB|787597598f41757929f46f687f78434dbc66d6abc980e40fb50b55cd09062b07',
        'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',
        'x-udid':'ACDCIuYxDAyPTg7eVnDe8ytVGX6ivGdKZ9E=',
        }


user_data = []

def get_user_data(page):
    
    for i in range(page):
        url = 'https://www.zhihu.com/api/v4/members/excited-vczh/followees?include=data%5B*%5D.answer_count%2Carticles_count%2Cgender%2Cfollower_count%2Cis_followed%2Cis_following%2Cbadge%5B%3F(type%3Dbest_answerer)%5D.topics&offset={}&limit=20'.format(i*20)
        response = requests.get(url, headers = headers).json()['data']
        user_data.extend(response)
        print('正在爬取第%s頁' %str(i+1))
        time.sleep(1)
    
    
if __name__ == '__main__':
    get_user_data(3)
    df = pd.DataFrame(user_data)
    df.to_csv('users.csv')

補充知識

1. JSON

  • JSON是一個輕量級的資料交換格式,連線API進行資料爬取的時候,資料的一般返回格式為JSON。
  • JSONView外掛:前往Chrome JSONView外掛安裝,下載並安裝JSONView外掛,使JSON格式的資料在谷歌瀏覽器中更好地呈現

2. HTTP請求