python 爬蟲基礎知識(繼續補充)

學了這麼久爬蟲,今天整理一下相關知識點,還會繼續更新html

HTTP和HTTPS

HTTP協議(HyperText Transfer Protocol,超文本傳輸協議):是一種發佈和接收 HTML頁面的方法。git

HTTPS(Hypertext Transfer Protocol over Secure Socket Layer)簡單講是HTTP的安全版,在HTTP下加入SSL層。github

SSL(Secure Sockets Layer 安全套接層)主要用於Web的安全傳輸協議,在傳輸層對網絡鏈接進行加密,保障在Internet上數據傳輸的安全。json

  • HTTP的端口號爲80
  • HTTPS的端口號爲443

HTTP工做原理

網絡爬蟲抓取過程能夠理解爲模擬瀏覽器操做的過程api

瀏覽器的主要功能是向服務器發出請求,在瀏覽器窗口中展現您選擇的網絡資源,HTTP是一套計算機經過網絡進行通訊的規則。瀏覽器

 

HTTP請求主要分爲GetPost兩種方法

  • GET是從服務器上獲取數據,POST是向服務器傳送數據安全

  • GET請求參數顯示,都顯示在瀏覽器網址上,HTTP服務器根據該請求所包含URL中的參數來產生響應內容,即「Get」請求的參數是URL的一部分。 例如: http://www.baidu.com/s?wd=Chinese服務器

  • POST請求參數在請求體當中,消息長度沒有限制並且以隱式的方式進行發送,一般用來向HTTP服務器提交量比較大的數據(好比請求中包含許多參數或者文件上傳操做等),請求的參數包含在「Content-Type」消息頭裏,指明該消息體的媒體類型和編碼,cookie

注意:避免使用Get方式提交表單,由於有可能會致使安全問題。 好比說在登錄表單中用Get方式,用戶輸入的用戶名和密碼將在地址欄中暴露無遺。網絡

 

經常使用的請求報頭:

1. Host (主機和端口號)

Host:對應網址URL中的Web名稱和端口號,用於指定被請求資源的Internet主機和端口號,一般屬於URL的一部分。

2. Connection (連接類型)

Connection:表示客戶端與服務鏈接類型

  1. Client 發起一個包含 Connection:keep-alive 的請求,HTTP/1.1使用 keep-alive 爲默認值。

  2. Server收到請求後:

    • 若是 Server 支持 keep-alive,回覆一個包含 Connection:keep-alive 的響應,不關閉鏈接;
    • 若是 Server 不支持 keep-alive,回覆一個包含 Connection:close 的響應,關閉鏈接。
  3. 若是client收到包含 Connection:keep-alive 的響應,向同一個鏈接發送下一個請求,直到一方主動關閉鏈接。

keep-alive在不少狀況下可以重用鏈接,減小資源消耗,縮短響應時間,好比當瀏覽器須要多個文件時(好比一個HTML文件和相關的圖形文件),不須要每次都去請求創建鏈接。

3. Upgrade-Insecure-Requests (升級爲HTTPS請求)

Upgrade-Insecure-Requests:升級不安全的請求,意思是會在加載 http 資源時自動替換成 https 請求,讓瀏覽器再也不顯示https頁面中的http請求警報。

HTTPS 是以安全爲目標的 HTTP 通道,因此在 HTTPS 承載的頁面上不容許出現 HTTP 請求,一旦出現就是提示或報錯。

4. User-Agent (瀏覽器名稱)

User-Agent:是客戶瀏覽器的名稱

5. Accept (傳輸文件類型)

Accept:指瀏覽器或其餘客戶端能夠接受的MIME(Multipurpose Internet Mail Extensions(多用途互聯網郵件擴展))文件類型,服務器能夠根據它判斷並返回適當的文件格式。

舉例:

Accept: */*:表示什麼均可以接收。

Accept:image/gif:代表客戶端但願接受GIF圖像格式的資源;

Accept:text/html:代表客戶端但願接受html文本。

Accept: text/html, application/xhtml+xml;q=0.9, image/*;q=0.8:表示瀏覽器支持的 MIME 類型分別是 html文本、xhtml和xml文檔、全部的圖像格式資源。

q是權重係數,範圍 0 =< q <= 1,q 值越大,請求越傾向於得到其「;」以前的類型表示的內容。若沒有指定q值,則默認爲1,按從左到右排序順序;若被賦值爲0,則用於表示瀏覽器不接受此內容類型。

Text:用於標準化地表示的文本信息,文本消息能夠是多種字符集和或者多種格式的;Application:用於傳輸應用程序數據或者二進制數據。詳細請點擊

6. Referer (頁面跳轉處)

Referer:代表產生請求的網頁來自於哪一個URL,用戶是從該 Referer頁面訪問到當前請求的頁面。這個屬性能夠用來跟蹤Web請求來自哪一個頁面,是從什麼網站來的等。

有時候遇到下載某網站圖片,須要對應的referer,不然沒法下載圖片,那是由於人家作了防盜鏈,原理就是根據referer去判斷是不是本網站的地址,若是不是,則拒絕,若是是,就能夠下載;

7. Accept-Encoding(文件編解碼格式)

Accept-Encoding:指出瀏覽器能夠接受的編碼方式。編碼方式不一樣於文件格式,它是爲了壓縮文件並加速文件傳遞速度。瀏覽器在接收到Web響應以後先解碼,而後再檢查文件格式,許多情形下這能夠減小大量的下載時間。

舉例:Accept-Encoding:gzip;q=1.0, identity; q=0.5, *;q=0

若是有多個Encoding同時匹配, 按照q值順序排列,本例中按順序支持 gzip, identity壓縮編碼,支持gzip的瀏覽器會返回通過gzip編碼的HTML頁面。 若是請求消息中沒有設置這個域服務器假定客戶端對各類內容編碼均可以接受。

8. Accept-Language(語言種類)

Accept-Langeuage:指出瀏覽器能夠接受的語言種類,如en或en-us指英語,zh或者zh-cn指中文,當服務器可以提供一種以上的語言版本時要用到。

9. Accept-Charset(字符編碼)

Accept-Charset:指出瀏覽器能夠接受的字符編碼。

舉例:Accept-Charset:iso-8859-1,gb2312,utf-8
  • ISO8859-1:一般叫作Latin-1。Latin-1包括了書寫全部西方歐洲語言不可缺乏的附加字符,英文瀏覽器的默認值是ISO-8859-1.
  • gb2312:標準簡體中文字符集;
  • utf-8:UNICODE 的一種變長字符編碼,能夠解決多種語言文本顯示問題,從而實現應用國際化和本地化。

若是在請求消息中沒有設置這個域,缺省是任何字符集均可以接受。

Cookie:瀏覽器用這個屬性向服務器發送Cookie。Cookie是在瀏覽器中寄存的小型數據體,它能夠記載和服務器相關的用戶信息,也能夠用來實現會話功能,之後會詳細講。

11. Content-Type (POST數據類型)

Content-Type:POST請求裏用來表示的內容類型。

舉例:Content-Type = Text/XML; charset=gb2312:

指明該請求的消息體中包含的是純文本的XML類型的數據,字符編碼採用「gb2312」。

 

Cookie 和 Session:

服務器和客戶端的交互僅限於請求/響應過程,結束以後便斷開,在下一次請求時,服務器會認爲新的客戶端。

爲了維護他們之間的連接,讓服務器知道這是前一個用戶發送的請求,必須在一個地方保存客戶端的信息。

Cookie:經過在 客戶端 記錄的信息肯定用戶的身份。

Session:經過在 服務器端 記錄的信息肯定用戶的身份。

 

 

requests:

r = requests.get('http://www.baidu.com')

r.status_code #響應狀態碼,爲方便引用

r.raw #返回原始響應體,也就是 urllib 的 response 對象,使用 r.raw.read() 讀取

r.content #字節方式的響應體,會自動爲你解碼 gzip 和 deflate 壓縮
r.text #字符串方式的響應體,會自動根據響應頭部的字符編碼進行解碼
r.headers #以字典對象存儲服務器響應頭,可是這個字典比較特殊,字典鍵不區分大小寫,若鍵不存在則返回None
#*特殊方法*#
r.json() #Requests中內置的JSON解碼器
r.raise_for_status() #失敗請求(非200響應)拋出異常

 

get請求:

params的時候之間接把參數加到url後面,只在get請求時使用
 1 import requests
 2 
 3 
 4 #get 請求 header 和 params
 5 base_url = 'http://www.baidu.com/s'
 6 
 7 headers = {
 8     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
 9 }
10 response = requests.get(base_url,headers=headers,params={'wd':'ip','pn':'0'})
11 
12 print(response.status_code)
13 print(response.url)

 

post請求:

data用於post請求時

1 # post 請求
2 login_url = 'http://www.renren.com/PLogin.do'
3 data = {
4     'email' : '1111@qq.com',
5     'password' : '1234qwer'
6 }
7 response = requests.post(login_url,data=data,headers={},params={})
8 print(response.url)

 

複雜的post請求:

傳遞一個字典給 data 參數。你的數據字典在發出請求時會自動編碼爲表單形式:

payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.post("http://httpbin.org/post", data=payload)
print(r.text)

'''

"args": {},
"data": "",
"files": {},
"form": {
"key1": "value1",
"key2": "value2"

'''

 

你還能夠爲 data 參數傳入一個元組列表。在表單中多個元素使用同一 key 的時候

payload = (('key1', 'value1'), ('key1', 'value2'))
r = requests.post('http://httpbin.org/post', data=payload)
print(r.text)

{
 ...  "form": {  "key1": [  "value1",  "value2"  ]  },  ... }

 

Github API v3 接受編碼爲 JSON 的 POST/PATCH 數據:

import json
url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
r = requests.post(url, data=json.dumps(payload))

還能夠直接傳遞

url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
r = requests.post(url, json=payload)

 

響應碼:

r = requests.get('http://httpbin.org/get')
r.status_code

>>>200

Requests還附帶了一個內置的狀態碼查詢對象:

r.status_code == requests.codes.ok

若是發送了一個錯誤請求(一個 4XX 客戶端錯誤,或者 5XX 服務器錯誤響應),咱們能夠經過 Response.raise_for_status() 來拋出異常:

bad_r = requests.get('http://httpbin.org/status/404')
bad_r.status_code
相關文章
相關標籤/搜索