1. 程式人生 > >爬蟲案例|從攻克反爬機制到地理資訊視覺化!

爬蟲案例|從攻克反爬機制到地理資訊視覺化!

爬蟲案例|從攻克反爬機制到地理資訊視覺化!

 

上圖是上海醫療服務資訊便民查詢系統網站(http://www.soyi.sh.cn/)上公佈的醫療機構位置的熱力圖。

本案例先從該網站抓取全部醫療機構的座標資訊,然後用免費的BDP個人版(http://www.bdp.cn)線上做圖。爬取資料時,我找到了資料的API介面,但是獲取資料時發現獲取失敗。排查原因,發現是網站用了一種反爬蟲的機制,我用偽造Cookie的方式繞開了反爬機制,順利獲取到資料。

下面開始一步步講解。

  1. 在Chrome瀏覽器裡輸入網址 http://www.soyi.sh.cn/ 看到公告頁
  2.  

爬蟲案例|從攻克反爬機制到地理資訊視覺化!

 

  1.  
  2. 點選下面的 前往搜醫網 連結,然後看到的才是真正的主頁
  3.  

爬蟲案例|從攻克反爬機制到地理資訊視覺化!

 

  1.  
  2. 尋找資料
  3. 點選上圖分類列表裡的不限連結,首頁就會出現資料庫裡所有醫療機構的資訊列表。
  4.  

爬蟲案例|從攻克反爬機制到地理資訊視覺化!

 

  1.  
  2. 資訊載入後,網頁網址並沒有發生變化,所以懷疑網頁用了非同步載入的技術。接下來用快捷鍵 Ctrl + Shift + I 開啟Chrome的開發者工具,切換到Network標籤欄。重現剛才點選頁面的操作,也就是再點選不限連結,頁面就重新載入了。
  3.  

爬蟲案例|從攻克反爬機制到地理資訊視覺化!

 

  1. 進群:548377875 即可獲取數十套PDF哦!
  2. 然後發現,多出了6個請求,第一個是個XHR型別的請求,這就是非同步載入的意思,後5個是圖片,不是我們關心的。選中第一個請求,看看Preview,發現頁面上展示的資訊,就在裡面,是個JSON格式的資料
  3.  

爬蟲案例|從攻克反爬機制到地理資訊視覺化!

 

  1.  
  2. 所以第一個請求就是我們要找的資料介面。再看Header資訊
  3.  

爬蟲案例|從攻克反爬機制到地理資訊視覺化!

 

  1.  
  2. Request URL是 http://www.soyi.sh.cn/h/show?page=1&type=2&qx=&traps=&category=&category_s3_ul=&level=&tech=&calve=&quick=&stype=&length=10
  3. 頁面上顯示,總共有505頁的資料,我們看到的是第一頁,上面URL裡,我把page=1用紅色標出來了,能猜出來什麼意思吧。
  4. Request Method表示的是請求方法,在這裡是GET方法,這決定了我們在用Python寫爬蟲時用什麼函式獲取資料。
  5.  
  6. 第一次嘗試獲取資料
  7. 用requests庫裡的get函式獲取介面的資料
  8.  

爬蟲案例|從攻克反爬機制到地理資訊視覺化!

 

  1.  
  2. 發現抓取下來的並不是JSON格式的資料,檢視下結果,發現是我們最初訪問的公告頁的程式碼
  3.  

爬蟲案例|從攻克反爬機制到地理資訊視覺化!

 

  1.  
  2.  
  3. 反爬蟲機制的分析
  4. 嘗試給上面程式碼裡的URL賦予該網站其他頁面或連結的網址,結果都出現公告頁的HTML程式碼。
  5. 我猜想該網址是不是用了這樣的反爬蟲機制:如果使用者第一次訪問該網站,就會自動跳轉到公告頁,如果已經訪問過該網站,就會獲得想檢視的資源。而網站判斷使用者有沒有訪問過,依據是session和cookie,前者是在伺服器端控制,後者在瀏覽器端留下痕跡。
  6. 怎麼驗證我的猜想呢,我現在再次訪問網址http://www.soyi.sh.cn/ ,發現直接看到了網站主頁,而不是公告頁。請回過頭看看第一步裡公告頁的網址
  7.  

爬蟲案例|從攻克反爬機制到地理資訊視覺化!

 

  1.  
  2. 發現並其網址並不是http://www.soyi.sh.cn/,而是http://www.soyi.sh.cn/op,說明在我第一次訪問網站時,發生了頁面跳轉,而再次訪問網站時,不會跳轉。
  3. 然後我再換個瀏覽器,訪問http://www.soyi.sh.cn/,發現果然轉到公告頁了,因為此時是用新的瀏覽器第一次訪問該網站
  4. 以上證明我的猜想是正確的。那要怎麼攻克這道防線呢?
  5.  
  6. 偽造Cookie
  7. 為什麼這種反爬的手段有用呢?因為人登入網站,只要訪問過,就會在瀏覽器留下Cookie,證明已經訪問過了。但是如果用Python程式碼來獲頁面,就留不下Cookie。
  8. 我這裡用的突破手段就是用Chrome的開發者工具,拿到瀏覽器裡的Cookie,強行加在Python爬蟲的程式碼裡,讓伺服器識別不出這是個爬蟲程式。與其說是偽造,不如說是借用Cookie。
  9. 還是回到尋找資料來源的那步,檢視Header資訊裡的Request Headers,找到Cookie那段,把Cookie資訊複製出來。
  10.  

爬蟲案例|從攻克反爬機制到地理資訊視覺化!

 

  1.  
  2. Python爬蟲程式
  3.  

爬蟲案例|從攻克反爬機制到地理資訊視覺化!

 

  1.  
  2. 可以看到,跟之前的程式碼相比,我再呼叫request.get函式時,增加了headers引數,在headers引數裡,把Cookie和瀏覽器型號等資訊加進去了,目標網站的伺服器接收到這些資訊就會以為我的程式是瀏覽器,並且已經訪問過他們網站,於是給我傳送了醫療機構的資料,也就是後面的res變數。利用json模組解析後,得到的res變數是個字典構成的列表,列表裡每個元素都是字典,代表一個醫療機構。
  3. 資料整理
  4.  

爬蟲案例|從攻克反爬機制到地理資訊視覺化!

 

  1.  
  2. 上面得到的變數res可以直接轉化為資料框,程式碼如上。
  3. 獲取全部資料並整理
  4. 上面獲取的res變數只是全面醫療機構的一部分,總共505頁資料,我們只拿到了第一頁,不過這已經跨過了一大步。
  5.  

爬蟲案例|從攻克反爬機制到地理資訊視覺化!

 

  1.  
  2. 我們第一頁的資料會獲取了,其他504的資料,只要做個迴圈就行了。在每一步迴圈裡,都把抓下來的資料寫到csv檔案裡,並且是附加的方式來寫檔案,而不是清除前一步檔案裡的內容。
  3.  
  4. 視覺化

這步比較簡單,在BDP個人版(http://me.bdp.cn)網站上註冊個賬號。

先上傳好資料。

再建立儀表盤。

 

爬蟲案例|從攻克反爬機制到地理資訊視覺化!

 

 

然後新增圖表,選經緯度地圖,選擇之前上傳的資料soyi。

 

爬蟲案例|從攻克反爬機制到地理資訊視覺化!

 

 

設定好經緯度對應的變數名稱

 

爬蟲案例|從攻克反爬機制到地理資訊視覺化!

 

 

剩下的工作就是託託拽拽了,看看幫助文件的動畫就會做了。

  • BDP幫助中心 https://book.bdp.cn/
  • 視訊教程 https://me.bdp.cn/instructional_video.html

 

爬蟲案例|從攻克反爬機制到地理資訊視覺化!

 

加群:960410445    領取數十套PDF哦!

看完本文是不是覺得爬蟲其實很簡單呢?

如果你想進一步學習更多案例,或者現在手頭有網站資料項爬取,不如來參加我們的網路爬蟲和文字分析實戰案例研討會。我們的原則是,能少學程式碼就少教程式碼,能不寫程式碼就教你不寫程式碼完成任務。

我們的課程專門為人文財經類專業的學員設計,除了R和Python,還會教knime軟體,讓你輕鬆點選幾下滑鼠就能完成文字分析。

 

爬蟲案例|從攻克反爬機制到地理資訊視覺化!