python爬蟲(一)

get與post

印象中get是請求數據,post是提交數據,然後博主在網上查了這個問題,一些比較深入的原理性的解釋並沒有看懂,所以下面放的是w3school給的二者之間的差別,日後真正需要理解原理再看原理

1.get
/test/demo_form.asp?name1=value1&name2=value2
//get請求的參數可以直接在網址中看到
2.post
POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2
//查詢字符串(名稱/值對)是在 POST 請求的 HTTP 消息主體中發送的

GET在瀏覽器回退時是無害的,而POST會再次提交請求。
GET產生的URL地址可以被Bookmark,而POST不可以。
GET請求會被瀏覽器主動cache,而POST不會,除非手動設置。
GET請求只能進行url編碼,而POST支持多種編碼方式。
GET請求參數會被完整保留在瀏覽器歷史記錄裏,而POST中的參數不會被保留。
GET請求在URL中傳送的參數是有長度限制的,而POST沒有。
對參數的數據類型,GET只接受ASCII字符,而POST沒有限制。
GET比POST更不安全,因爲參數直接暴露在URL上,所以不能用來傳遞敏感信息。
GET參數通過URL傳遞,POST放在Request body中。

使用urlopen實現簡單的get請求
from urllib import request
url = 'http://www.baidu.com'
response = request.urlopen(url)
print(type(response))
// <class 'http.client.HTTPResponse'>
print(response.status)
// 200
print(response.getheaders())
// [('Bdpagetype', '1'), ('Bdqid', '0xe33e78e7008aa464'), ('Cache-Control', 'private'), ('Content-Type', 'text/html'), ('Cxy_all', 'baidu+e9796a138c6d3b396ecc3acff17c10fa'), ('Date', 'Wed, 07 Aug 2019 01:34:03 GMT'), ('Expires', 'Wed, 07 Aug 2019 01:33:12 GMT'), ('P3p', 'CP=" OTI DSP COR IVA OUR IND COM "'), ('Server', 'BWS/1.1'), ('Set-Cookie', 'BAIDUID=917778D9E1FD56AA30FC9D358F772C52:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com'), ('Set-Cookie', 'BIDUPSID=917778D9E1FD56AA30FC9D358F772C52; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com'), ('Set-Cookie', 'PSTM=1565141643; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com'), ('Set-Cookie', 'delPer=0; path=/; domain=.baidu.com'), ('Set-Cookie', 'BDSVRTM=0; path=/'), ('Set-Cookie', 'BD_HOME=0; path=/'), ('Set-Cookie', 'H_PS_PSSID=1439_21114_29522_29519_29099_29567_28835_29221_26350_22160; path=/; domain=.baidu.com'), ('Vary', 'Accept-Encoding'), ('X-Ua-Compatible', 'IE=Edge,chrome=1'), ('Connection', 'close'), ('Transfer-Encoding', 'chunked')]
print(response.read().decode('utf-8'))
// 返回網頁源代碼
斷開網絡再運行會發生錯誤,常見的狀態碼

常見的狀態碼:

  • 200:請求正常,服務器正常的返回數據。
  • 301:永久重定向。
  • 302:臨時重定向。比如在訪問一個需要登錄的 頁面的時候,而此時沒有登錄,那麼就會 重定向到登錄頁面。
  • 400:請求的url在服務器上找不到。換句話說就是請求url錯誤。
  • 403:服務器拒絕訪問,權限不夠。
  • 404:請求失敗,請求所希望的資源未被在服務器上發現。
請求頭,如何添加請求頭

在http協議中,向服務器發送一個請求,數據分爲三部分,第一個是把數據放在url中,第二個是把數據放在body中(在post請求中),第三個就是把數據放在head中。下面是一些請求頭參數,經常會用到的是:Referer、Cookie、User-Agent

Accept:瀏覽器可接受的MIME類型。
Accept-Encoding:瀏覽器能夠進行解碼的數據編碼方式,比如gzip。Servlet能夠向支持gzip的瀏覽器返回經gzip編碼的HTML頁面。許多情形下這可以減少5到10倍的下載時間。
Accept-Charset:瀏覽器可接受的字符集。
Accept-Language:瀏覽器所希望的語言種類,當服務器能夠提供一種以上的語言版本時要用到。
Authorization:授權信息,通常出現在對服務器發送的WWW-Authenticate頭的應答中。
Connection:表示是否需要持久連接。
Content-Length:表示請求消息正文的長度。
Referer:表明當前這個請求是從哪個url過來的。這個一般也可以用來做反爬蟲技術。如果不是從指定頁面過來的,那麼就不做相關的響應。
Cookie:http協議是無狀態的。也就是同一個人發送了兩次請求,服務器沒有能力知道這兩個請求是否來自同一個人。因此這時候就用cookie來做標識。一般如果想要做登錄後才能訪問的網站,那麼就需要發送cookie信息了。
User-Agent:瀏覽器名稱。這個在網絡爬蟲中經常會被使用到。請求一個網頁的時候,服務器通過這個參數就可以知道這個請求是由哪種瀏覽器發送的。如果我們是通過爬蟲發送請求,那麼我們的****User-Agent就是Python,這對於那些有反爬蟲機制的網站來說,可以輕易的判斷你這個請求是爬蟲。因此我們要經常設置這個值爲一些瀏覽器的值,來僞裝我們的爬蟲。

設置headers

1、爲什麼要設置headers
在請求網頁爬取的時候,輸出的text信息中會出現抱歉,無法訪問等字眼,這就是禁止爬取,需要通過反爬機制去解決這個問題。headers是解決requests請求反爬的方法之一,相當於我們進去這個網頁的服務器本身,假裝自己本身在爬取數據。
2、 headers在哪裏
谷歌或者火狐瀏覽器,在網頁面上點擊右鍵,–>檢查–>Network界面下點擊All,然後刷新一下

import requests
user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
headers = {'User-Agent':user_agent}
r = requests.get('https://www.baidu.com',headers = headers)
print(r.headers)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章