国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

爬蟲學習(二)基礎階段

xiaoqibTn / 2955人閱讀

摘要:如果要添加該參數(shù),并且如果它是字節(jié)流編碼格式的內容,即類型,則需要通過方法轉化。通過的格式將字典進行字節(jié)流的編碼,將編碼后的字節(jié)流數(shù)據(jù)傳輸?shù)街付ㄟ@里存在一個,要進行指定方式解碼。第二個參數(shù)如果要傳,必須傳字節(jié)流類型的。

請求頭中的內容:

Date: 標識 響應產(chǎn)生 的時間 。

Last-Modified: 指定資源的最后修改時間。

Content-Encoding: 指定 響應 內容的編碼 。

Server: 包含服務器的信息,比如名稱、版本號等。

Content-Type: 文檔類型,指定返回的數(shù)據(jù)類型是什么,如 text/html代表返回 HTML文檔,

application/x-javascript !J!U代表返回 JavaScript文件, image/jpeg則代表返回圖片 。

Set-Cookie: 設置 Cookies。 響應頭 中的 Set-Cookie 告訴瀏覽器需要將此內容放在 Cookies中, 下次請求攜帶 Cookies請求。

Expires: 指定響應的過期時間 , 可以使代理服務器或瀏覽器將加載的內容更新到緩存。如果再次訪問時,就可以直接從緩存中加載,降低服務器負載,縮短加載時間。

1.urllib.request模塊

request: 最基本的HTTP請求模塊,可以用來模擬發(fā)送請求。就像在瀏覽器里輸入網(wǎng)址然后回車一樣,只需要給庫方法傳入 URL 以及額外的參數(shù),就可以模擬實現(xiàn)這個過程了 ,同時它還帶有處理授權驗證( authenticaton )重定向( redirection)瀏覽器 Cookies 以及其他內容

error: 異常處理模塊,如果出現(xiàn)請求錯誤,我們可以捕獲這些異常,然后進行重試或其他操作以保證程序不會意外終止 。

parse: 一個工具模塊,提供了許多 URL處理方法,比如拆分,解析,合并等。

robotparser:主要是用來識別網(wǎng)站的 robots.txt文件,然后判斷哪些網(wǎng)站可以爬,哪些網(wǎng)站不可以爬,它其實用得比較少 。

urllib.request.urlopen() 為最基本HTTP請求的方法

import urllib.request
response= urllib.request.urlopen("https://www.python.org") 
print(response.read().decode ("utf-8"))  //打印出網(wǎng)頁的源代碼
print(type(response))    //說明該對象類型為HTTPResponse類型。
print(response.status)    //200

print(response.getheaders()) //   
[("Server", "nginx"), ("Content-Type", "text/html; charset=utf-8"), ("X-Frame-Options", "DENY"), 
("Via", "1.1 vegur"), ("Via", "1.1 varnish"), ("Content-Length", "48995"), ("Accept-Ranges", "bytes"), 
("Date", "Mon, 13 May 2019 09:23:37 GMT"), ("Via", "1.1 varnish"), ("Age", "3595"), ("Connection", "close"), 
("X-Served-By", "cache-iad2139-IAD, cache-tyo19927-TYO"), ("X-Cache", "HIT, HIT"), 
("X-Cache-Hits", "1, 6071"), ("X-Timer", "S1557739417.434556,VS0,VE0"), ("Vary", "Cookie"), 
("Strict-Transport-Security", "max-age=63072000; includeSubDomains")]

print(response.getheader("Server"))    //nginx

HTTPResposne類型的對象,主要包含

read()、 readinto()、 getheader(name)、getheaders()、 fileno()等方法,以及 msg、 version、status、reason、debuglevel、closed等屬性。

如果想給鏈接傳遞一些參數(shù),該怎么實現(xiàn)呢?首先看一下urlopen()函數(shù)的 API:

urllib.request.urlopen(url, data=None, timeout=, *, cafile=None, capath=None, cadefault=False, context=None)

? data參數(shù)
data 參數(shù)是可選的。 如果要添加該參數(shù),并且如果它是字節(jié)流編碼格式的內容,即 bytes 類型, 則需要通過 bytes()方法轉化。 另外,如果傳遞了這個參數(shù),則它的請求方式就不再是 GET方式,而是POST方式。

import urllib

data = bytes(urllib.parse.urlencode({"word":"hello"}), encoding="utf8")    //通過utf8的格式將字典進行字節(jié)流的編碼,
response= urllib.request.urlopen("http://httpbin.org/post", data=data)        //將編碼后的字節(jié)流數(shù)據(jù)傳輸?shù)街付║RL
print(response.read().decode("utf-8"))//這里存在一個bug,要進行指定方式解碼。

Result:

  {
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "word": "hello"
  }, 
  "headers": {
    "Accept-Encoding": "identity", 
    "Content-Length": "10", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "Python-urllib/3.6"
  }, 
  "json": null, 
  "origin": "171.81.189.140, 171.81.189.140", 
  "url": "https://httpbin.org/post"
}

? timeout參數(shù)
timeout參數(shù)用于設置超時時間,單位為秒,意思就是如果請求超出了設置的這個時間,還沒有得到響應,就會拋出異常。如果不指定該參數(shù),就會使用全局默認時間。它支持HTTP,HTTPS,FTP請求。

import socket
import urllib


try:
    response = urllib.request.urlopen("http://httpbin.org/get", timeout=0.1)  //如果時間超過0.1S不響應就報錯。
except urllib.error.URLError as e:
    if isinstance(e.reason,socket.timeout):
        print("TIME OUT!")

? 其他參數(shù)
除了data參數(shù)和timeout參數(shù)外,還有context參數(shù),它必須是 ssl.SSLContext類型,用來指定SSL 設置。此外,cafile和 capath這兩個參數(shù)分別指定 CA證書和它的路徑,這個在請求 HTTPS鏈接時會有用。
cadefault參數(shù)現(xiàn)在已經(jīng)棄用了,其默認值為 False。

2.Request類
import urllib.request

request = urllib.request.Request("https://python.org")
response = urllib .request.urlopen(request)
print(response.read().decode ("utf-8"))

依然是用 urlopen()方法來發(fā)送這個請求,只不過該方法的參數(shù)不再是 URL, 而是一個 Request 類型的對象。通過構造這個數(shù)據(jù)結構,一方面我們可以將請求獨立成一個對象,另 一方面可更加豐富和靈活地配置參數(shù) 。

class urllib. request. Request (url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

第一個參數(shù)url用于請求URL,這是必傳參數(shù),其余可選。

第二個參數(shù) data 如果要傳,必須傳 bytes (字節(jié)流)類型的。如果它是字典,可以先用 urllib.parse模塊里的urlencode()編碼。將字典里面所有的鍵值轉化為query-string格式(key=value&key=value),并且將中文轉碼。

第三個參數(shù) headers是一個字典,它就是請求頭,我們可以在構造請求時通過 headers參數(shù)直 接構造,也可以通過調用請求實例的 add_header()方法添加。

添加請求頭最常用的用法就是通過修改 User-Agent 來偽裝瀏覽器,默認的 User-Agent 是Python-urllib,我們可以通過修改它來偽裝瀏覽器 。 比如要偽裝火狐瀏覽器,你可以把它設置為 :Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:66.0) Gecko/20100101 Firefox/66.0

第四個參數(shù) origin_req_host指的是請求方的host名稱或者IP地址。

第五個參數(shù) unverifiable表示這個請求是否是無法驗證 的,默認是 False,意思就是說用戶沒有足夠權限來選擇接收這個請求的結果。 例如,我們請求一個 HTML文檔中的圖片,但是我 們沒有向動抓取圖像的權限,這時unverifiable 的值就是True。

第六個參數(shù) method是一個字符串 ,用來指示請求使用的方法,比如 GET、 POST和 PUT等

from urllib import parse,request    

url = "http://httpbin.org/post"
headers = {
"User-Agent":"Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)",
"Host" :"httpbin.org"
}

dict={
"name":"Gremey"
}
data= bytes(parse.urlencode(dict), encoding="utf-8")

#req = request.Request(url=url, data=data, headers=headers, method="POST")
//上面是直接寫好headers傳遞參數(shù)傳遞給對象,下面是多帶帶的通過對象的方法傳遞
req=request.Request(url=url, data=data, method="POST")
req.add_header("User-Agent","Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)")
response = request.urlopen(req)
print(response.read().decode("utf-8"))

3. 高級用法

在上面的過程中,我們雖然可以構造請求,但是對于一些更高級的操作(比如 Cookies處理 、 代理設置等),該如何處理?
就需要更強大的工具 Handler 登場了。簡而言之,我們可以把它理解為各種處理器,有專門處理登錄驗證的,有處理 Cookies 的,有處理代理設置的。利用它們,我們幾乎可以做到 HTTP請求中所有的事。
urllib .request 模塊里的 BaseHandler類,它是所有其他 Handler 的父類,它提 供了最基本的方法,例如 default_open()、 protocol_request()等。

接下來,就有各種 Handler 子類繼承這個 BaseHandler類,舉例如下 。

HITPDefaultErrorHandler:用于處理HTTP響應錯誤,錯誤都會拋出 HTTPError類型的異常。

HTTPRedirectHandler:用于處理重定向。

HTTPCookieProcessor: 用于處理 Cookies。

ProxyHandler:用于設置代理 , 默認代理為空 。

HπPPasswordMgr:用于管理密碼,它維護了用戶名和密碼的表。

HTTPBasicAuthHandler: 用于管理認證,如果一個鏈接打開時需要認證,那么可以用它來解決認證問題。

另一個比較重要的類就是 OpenerDirector,我們可以稱為 Opener。 我們之前用過 urlopen()這個方法,實際上它就是urllib為我們提供的一個Opener。
那么,為什么要引人Opener 呢?因為需要實現(xiàn)更高級的功能。之前使用的 Request 和 urlopen() 相當于類庫為你封裝好了極其常用的請求方法,利用它們可以完成基本的請求,但是現(xiàn)在不一樣了,我們需要實現(xiàn)更高級的功能,所以需要深入一層進行配置,使用更底層的實例來完成操作,所以這里就用到了Opener。
Opener可以使用 open()方法,返回的類型和urlopen()如出一轍。 那么,它和 Handler 有什么關 系呢?簡而言之,就是利用 Handler來構建 Opener。

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/43914.html

相關文章

  • Python爬蟲學習路線

    摘要:以下這些項目,你拿來學習學習練練手。當你每個步驟都能做到很優(yōu)秀的時候,你應該考慮如何組合這四個步驟,使你的爬蟲達到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學習不是一朝一夕的事情,建議多看看一些比較優(yōu)秀的爬蟲的設計方案,比如說。 (一)如何學習Python 學習Python大致可以分為以下幾個階段: 1.剛上手的時候肯定是先過一遍Python最基本的知識,比如說:變量、數(shù)據(jù)結構、語法...

    liaoyg8023 評論0 收藏0
  • 史上最詳細Python學習路線-從入門到精通,只需90天

    摘要:針對的初學者,從無到有的語言如何入門,主要包括了的簡介,如何下載,如何安裝,如何使用終端,等各種開發(fā)環(huán)境進行開發(fā),中的語法和基本知識概念和邏輯,以及繼續(xù)深入學習的方法。 ...

    gghyoo 評論0 收藏0
  • 首次公開,整理12年積累的博客收藏夾,零距離展示《收藏夾吃灰》系列博客

    摘要:時間永遠都過得那么快,一晃從年注冊,到現(xiàn)在已經(jīng)過去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設置私密了,不收拾不好看呀。 ...

    Harriet666 評論0 收藏0
  • 我是如何零基礎自學轉行人工智能的(附十問十答)

    摘要:我的決定是學人工智能,當時對這個比較感興趣。從機器學習學到深度學習再學回機器學習。面試,成功地去公司從事機器學習深度學習方面的基礎工作。這個系列不僅僅以學習為目的,目的是為了達到機器學習的工作入門標準。 每個字都是經(jīng)驗所得,都是站在一個零基礎的人的角度寫的,純手打+網(wǎng)上優(yōu)秀資源整合,希望大家能每個字都認真看。 接下來文章會側重在以下幾方面 1、零基礎如何進行人工智能的自學(以找工作為目...

    IamDLY 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<