黃聰:關於抓取網頁,分析網頁內容,模擬登陸網站的邏輯/流程和注意事項(轉)


抓取網頁的一般邏輯和過程

一般普通用戶,用瀏覽器,打開某個URL地址,然后瀏覽器就可以顯示出對應的頁面的內容了。

這個過程,如果用程序代碼來實現,就可以被稱為(用程序實現)抓取網頁(的內容,並進行后期處理,提取所需信息等)

對應的英文說法有,website crawl/scrape/data mining。

而用來抓取網頁的工具,也常被叫做 spider,crawler等。

即,一般所謂的取網頁內容,指的是通過程序(某種語言的程序代碼,比如Python腳本語言,C#語言等)實現訪問某個URL地址,然后獲得其所返回的內容(HTML源碼,Json格式的字符串等)。

而對於這個抓取網頁的過程,是有一套自己的邏輯的。

想要用程序實現對應的網頁內容的抓取,就是要先搞懂這套邏輯,然后再去用對應的不同的語言實現,即可。

抓取網頁的一般邏輯

去訪問一個URL地址,獲得對應的網頁的過程,其對應的內部機制是

准備好對應的Http請求(Http Request)+ 提交對應的Http Request

–>

獲得返回的響應(Http Response) + 獲得Http Response中的網頁源碼

下面介紹這兩大步驟的具體操作流程:

准備此Http請求Request (訪問URL之前的准備工作)

1.知道了要訪問的URL地址是什么

request url

2.[可選]如果是GET方法,是否還有其他一些參數

此參數:

  • IE中算是稱為request parameter
  • Chrome中稱為query string

3.確定是GET還是POST方法

4.添加對應的頭(Header)信息

即request header

5.[可選]如果是POST方法,則還需要填寫對應的數據

此數據:

  • IE中稱為request body
  • Chrome中稱為Post Data

換句話說:

如果是GET,則是沒有POST數據的。

提示:所以,你在IE9中通過F12抓取到的內容中,會看到,對於所有的GET請求,對應的“請求正文(request body)”都是空的。

6.其他一些可能需要准備的東西

(1)代理proxy

(2)設置最大超時timeout時間

(3)是否有cookie

 

提交HttpRequest,即可獲得此http請求的響應Response(訪問URL之后的要做的工作)

1.獲得對應的響應response

2.從響應中獲得對應的網頁源碼等信息

(1)獲得返回的網頁HTML源碼(或json等)

(2)[可選]如果有需要,還要獲得對應的cookie

(3)[可選]判斷返回的其他一些相關信息,比如response code等

 

【網頁抓取過程中的注意事項】

1.網頁跳轉Redirect

(1)直接跳轉

(2)間接跳轉

A。javascript腳本中有對應的代碼實現網頁跳轉

B。本身所返回的HTML源碼中包含refresh動作,所實現的網頁跳轉

 

抓取網頁后,如何分析獲得所需要的內容

一般來說,去訪問一個URL地址,所返回的內容,多數都是網頁的HTML源碼,也有其他一些形式的內容的,比如json等。

我們所想要的則是,從返回的內容(HTML或json等)中,提取我們所需要的特定的信息,即對其進行一定的處理,獲得所需信息。

就我所遇到的情況,有幾種方法可以實現提取所需的信息:

1. 對於HTML源碼:

(1)如果是Python中的話,可以通過調用第三方的Beautifulsoup庫

然后再調用find等函數,來提取對應的信息。

這部分內容,相對很復雜,需要詳細了解的,可以參考一下:

BlogsToWordPress v3.0 – 將百度空間,網易163等博客搬家到WordPress

中的源碼。

(2)直接使用正則表達式自己去提取相關內容

對於內容的分析和提取,很多時候,都是通過正則表達式來實現的。

關於正則表達式的相關知識和總結,去看這里:

【總結】關於正則表達式 v2012-02-20

 

正則表達式是一種規范/規則,具體用何種語言實現,取決於你自己。

我遇到的有Python和C#兩種語言:

A。Python:使用re模塊,常用的函數是find,,findall,search等。

B:C#:使用Regex類,用對應的pattern和match函數來匹配。

關於C#中的Regex,更多內容請參考:

【總結】C#中的Regex的使用心得和注意事項

 

2.對於Json

可以先去看專門的關於JSON的介紹:

【整理】什么是JSON+如何處理JSON字符串

然后再看下面的如何處理Json。

(1)使用庫(函數)來處理

A。Python

Python中,有對應的json庫,常用的是json.load,即可將json格式的字符串,轉換為對應的字典Dictionary類型變量,很是好用。

(2)還是使用正則表達式來處理

A。Python

Python中的re模塊,同上。

B。C#

C#中貌似沒有自帶json的庫,倒是有很多第三方的json庫,但是我當時遇到解析json字符串的時候,覺得這些庫,使用起來還是很麻煩,所以還是直接使用regex類來處理了。

模擬登陸網站的一般邏輯和過程

而對於用C#實現網頁內容抓取和模擬登陸網頁方面,一些心得和注意事項,去看這里:

【經驗總結】Http,網頁訪問,request,response相關的知識

 

多種語言(Python/C#)實現抓取網頁,模擬登陸網站

【教程】抓取網並提取網頁中所需要的信息 之 Python版

【教程】模擬登陸網站 之 Python版(內含兩種版本的完整的可運行的代碼)

【教程】抓取網並提取網頁中所需要的信息 之 C#版

【教程】模擬登陸網站 之 C#版(內含兩種版本的完整的可運行的代碼)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM