爬蟲之動態頁面爬取

動態頁面爬取

  好久沒有寫爬蟲了,今天敲了一份爬蟲出來——爬取百度百科的歷史記錄,結果在時隔四個月之後再次遇到的對手居然是一個動態頁面(一開始把百度想的太簡單了),不過在一番努力之後還是達到了我的目標,然後就當複習似的寫了篇博客。

一、概念

  動態頁面其實是相對於靜態頁面而言的。在面對靜態頁面的時候直接查看response一般就是網頁的全部代碼了,但是動態頁面不然,一般動態頁面的response再打開的時候和你在網頁看的不一樣了。

二、實踐及實踐之前

  因爲本人超喜歡實踐,所以二話不說進行上實踐,實踐出真知,多實踐就懂了。

目標網頁:萬科百度百科歷史版本
實現環境:win32
version : python 3.6.2
實踐目標:獲取萬科百度百科歷史版本的歷史修改時間,做成圖表或者csv文件

三、流程闡述

  和所有的爬蟲一樣,我們第一步會進行網頁的分析,因爲我們目標選取了一個動態網頁,所以我們還需要對json文件等進行追蹤。
  流程:

1、網頁分析
2、查詢、追蹤json等文件或者xhr
3、進行文本匹配
4、畫圖或者製作csv

四、工具準備

  我們所需要的庫有(都是最新版):

1.requests
2.re
(以下的庫不是爬蟲必須的,但是是我這次所需要)
3.matplotlib(進行可視化)
4.datetime(對時間進行操作)
5.Pandas(python強大的數據處理庫)
6.os(對系統進行操作)
(本人更偏愛原始的re庫,當然這裏使用正則表達式已經能夠解決所有問題了)

  所需瞭解的知識:

1.python語法基礎
2.正則表達式的匹配規則
(以下非爬蟲必要)
3.datetime一些基本功能
4.matplotlib可視化的操縱(雖然此項爲非爬蟲必要,但是很多時候數據可視化出來會讓數據更爲直觀,讓人更容易做出判斷)
5.pandas庫的基本使用(此項爲非爬蟲必要,但是爲數據分析必學)

五、網頁分析

  首先我們打開我們的目標網頁→萬科百度百科歷史版本
這裏寫圖片描述
  看上去一切正常,然後我們查看url,也有之前所講的規律,但是真的一切正常了嗎?
這裏寫圖片描述
這裏寫圖片描述
  如果你把這個網頁當作靜態頁面來做那肯定完蛋了,因爲我一開始就是這麼做的,當你查詢第一頁的代碼時候你會發現一切正常,然而在你查詢第二頁的代碼的時候,你會發現一個事實就是——你所看到的第二頁甚至直到最後一頁的最後代碼都是相同的,有沒有覺得違背了常識?

六、追蹤

  其實不然,這是很正常的事情,很多頁面都會做成動態的,使用json或其他等文件來傳輸數據(不盡準確,也可能是用java、JavaScript等代碼調用端口等等),這樣子更安全些。
  到了這一步很多人都會選擇使用fiddle等第三方軟件來抓包這樣子方便點,但是這裏筆者比較難,直接在控制者平臺上看就好了。
  在一番查找之後我們鎖定了我們需要的幾個文件和xhr文件。

這裏寫圖片描述
  很多網頁的數據會藏在json裏面,莫非這個也是?當然,查看之後就失敗了,那麼我們看到xhr裏面,發現這個很熟悉的字段(當然可能是我比較熟悉)

這裏寫圖片描述
  明顯的答案在此了,簡單解讀一下這條

get historylist , 獲得歷史數據
tk 這個東西我猜是萬科的quantio語句(不知道這個單詞有沒有拼錯,實在是自己用的少,搞前後端的朋友可能認識)
lemmald 這不就是萬科在百度裏面的號碼嘛
from 一眼就看出是第七頁
size 顯示25條消息

  這個發現非常的棒,解決了許多問題。

七、僞裝

  作爲玩爬蟲的人,瞭解反爬蟲的套路是非常必要的,在這裏如果你對xhr進行正常的爬蟲你會發現,返回給你的是{error:xxxxx},這個時候就要警覺了,這證明你機器人的身份被百度識破了,它拒絕把數據給你,那麼我們就需要進行一些簡單僞裝。之前講過更改headers頭,這次講多一些。

1.headers僞裝,服務器使用這個判斷你使用的瀏覽器,當有這個的時候,服務器會認爲是瀏覽器正常的請求。
2.Referer:瀏覽器通過此來判斷你從哪一個網頁跳轉過來。
3.ip僞裝,這個只要構建好ip池就沒有問題了,推薦去西刺代理查看一些所需
4.Cookie僞裝,cookie是服務器用來辨別你此時的狀態的,比如你已經登錄啊,什麼的,每一次向服務器請求cookie都會隨之更新。

  最常用的就是上面幾個了,上面從上到下越來越難整,在此面對百度,僅僅只是改變headers顯然是不行的,於是我添加了Referer和cookie碼(關鍵是兩個月前建立的IP池已經廢掉了,懶得整)。
  好,做到這裏我們發現我們可以正常的獲得數據了。

八、文本匹配

  不得不說,解決上面的問題之後,文本匹配成爲了最爲簡單的事情了。
這裏寫圖片描述

  其實這是一個類似詞典的格式了,但是懶得思考的筆者,決定使用簡單粗暴的正則表達式。

九、轉化時間戳

  這個時候我們會發現,再creattime那裏給的時間是個什麼鬼?
  但是仔細一思考你會發現這是一個時間戳

python的時間戳:從1970年1月1日上午12:00到現在的秒數

  是不是很崩潰?
  不過還好決解這個問題只需要幾段簡短的代碼
這裏寫圖片描述
  輸入時間戳,好了,問題解決了。

十、畫圖、做csv

  圖

這裏寫圖片描述

  csv

這裏寫圖片描述

十一、總結和代碼

  感覺這次爬蟲還行,時隔兩個多月我還能想起來實屬不易,寫這次博客純屬複習了,至於上面沒有寫寫出如何作圖和如何做csv的原因,我可以說博主忽然不想寫了嗎?

以下是代碼:https://github.com/Don98/Spier_project/blob/master/wanke.py
(注:博主懶得寫註釋了,不懂可以評論詢問,謝謝)

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