原文網址:http://www.crifan.com/summary_about_flow_process_of_fetch_webpage_simulate_login_website_and_some_notice/
這里只是做為小結和吸收要點
去訪問一個URL地址,獲得對應的網頁的過程,其對應的內部機制是
准備好對應的Http請求(Http Request)+ 提交對應的Http Request
–>
獲得返回的響應(Http Response) + 獲得Http Response中的網頁源碼
一: 准備此Http請求Request (訪問URL之前的准備工作)
1:基本的url + 查詢字符串
比如: 完整的url = http://www.crifan.com/?s=crifan&submit=Search
URL地址,其實涉及到編碼和解碼的問題:
具體可以看如下的
http://www.crifan.com/summary_url_encode_and_decode_during_http_get_post_request
2:GET還是POST
2.1. get是從服務器上獲取數據,post是向服務器傳送數據。
2.2. get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應,在URL中可以看到。post是通過HTTP post機制,將表單內各個字段與其內容放置在HTML HEADER內一起傳送到ACTION屬性所指的URL地址。用戶看不到這個過程。
2.3. 對於get方式,服務器端用Request.QueryString獲取變量的值,對於post方式,服務器端用Request.Form獲取提交的數據。
2.4. get傳送的數據量較小,不能大於2KB。post傳送的數據量較大,一般被默認為不受限制。但理論上,IIS4中最大量為80KB,IIS5中為100KB。
2.5. get安全性非常低,post安全性較高。但是執行效率卻比Post方法好。
建議:
2.1、get方式的安全性較Post方式要差些,包含機密信息的話,建議用Post數據提交方式;
2.2、在做數據查詢時,建議用Get方式;而在做數據添加、修改或刪除時,建議用Post方式;
更多的get和post的區別其實可以看:http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html
3:必須或可選:Headers
即request header,頭信息Headers,包含很多個Header
有些是必須的,有些是可選的(根據不同情況,可忽略的)
有的時候,甚至不設置任何header也是可以的。
4:[可選]Post Data
如果是POST方法,則還需要填寫對應的數據:
此數據:
-
IE中稱為request body
-
Chrome中稱為Post Data
換句話說:
如果是GET,則是沒有POST數據的。
提示:所以,你在IE9中通過F12抓取到的內容中,會看到,對於所有的GET請求,對應的“請求正文(request body)”都是空的。
5: 必須或可選:cookie
很多時候,訪問對應url還需要提供對應的cookie。
一般來說,模擬登陸等情況下,往往都會涉及到cookie的
6:其他一些可能需要准備的東西
(1)代理proxy
(2)設置最大超時timeout時間
二:提交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等。
1. 對於HTML源碼:
(1)如果是Python中的話,可以通過調用第三方的Beautifulsoup庫
BlogsToWordPress v3.0 – 將百度空間,網易163等博客搬家到WordPress
(2)直接使用正則表達式自己去提取相關內容
A。Python:使用re模塊,常用的函數是find,,findall,search等。
B:C#:使用Regex類,用對應的pattern和match函數來匹配。
關於C#中的Regex,更多內容請參考:
2.對於Json
可以先去看專門的關於JSON的介紹:
然后再看下面的如何處理Json。
(1)使用庫(函數)來處理
A。Python
Python中,有對應的json庫,常用的是json.load,即可將json格式的字符串,轉換為對應的字典Dictionary類型變量,很是好用。
(2)還是使用正則表達式來處理
A。Python
Python中的re模塊,同上。
B。C#
C#中貌似沒有自帶json的庫,倒是有很多第三方的json庫,但是我當時遇到解析json字符串的時候,覺得這些庫,使用起來還是很麻煩,所以還是直接使用regex類來處理了。
