1. 程式人生 > 實用技巧 >python 爬蟲 02-urllib+request

python 爬蟲 02-urllib+request

1. urllib.request模組

1.1 版本

python2 :urllib2、urllib

python3 :把urllib和urllib2合併,urllib.request

1.2 常用的方法

  • urllib.request.urlopen("URL") 作用 :向網站發起一個請求並獲取響應
  • 位元組流 = response.read()
  • 字串 = response.read().decode("utf-8")
  • urllib.request.Request"URL",headers="User-Agent , Referer 之類")   # 其得到的物件是

    urlopen()不支援重構User-Agent 其中的request才可以用,一般套路都是 框架或模組 urllib.reauest.Request

(url, data=none, headers={},origin_req_host=none,

unverifiable=False, method=None)

    • 第一個引數url用於請求URL,肯定是必傳引數,其他都是可選
    • 第二個引數data如果要傳,必須是bytes(位元組流)類,如果它是字典可以先用

    urllib.parse模組裡的urlencode()編碼

    • 第三個引數headers是一個字典,它就是請求頭,我們可在構造請求是通過headers引數直接構造,

    也可通過呼叫請求例項的add_header()方法

    新增請求頭★最常用的用法是通過修改User-Agent來偽裝瀏覽器,,預設的User-Agent是

    python-urllib,我們可以通過修改它來偽裝瀏覽器。

    如要偽裝火狐瀏覽器:

    Mozilla/5.0(X11;U; Linux i686) Gecko/20071127 Firefox/2.0.0.11

    • 第四個引數origin_req_host指的是請求方的host名稱或IP地址
    • 第五個引數unverifiable表示這個請求是否無法驗證,預設False,意思是說使用者沒有足夠許可權

    來接受這個請求的結果。

    如我們請求一個HTML文件中的圖片,但是我們沒自動抓取影象的許可權,這是unverifiable的值

    就是True

    • 第六個引數method是一個字串,用來致死請求使用的方法,如GET,POST,PUT

1 import urllib.request
2 
3 request = urllib.request.Request('https://python.org')        
4 response = urllib.request.urlopen(request)        #urlopen傳送這個請求
5                             #但是引數不再是URL
6                             #而是一個Request的物件
7 print(response.read().decode('utf-8'))

1.3 響應物件

  • read() 讀取伺服器響應的內容
  • getcode()返回HTTP的響應碼    # 就是相應狀態碼 200,301,302,304,404
  • geturl() 返回實際資料的URL(防止重定向問題)  # 這裡就是 先urlopen()之後的網站 呼叫其 geturl()看 其重定向

2. urllib.parse模組

2.1 常用方法

  • urlencode(字典)  #將一些ASCII 不可以列印的字元給轉化了,就是相當於搜尋欄裡面搜中文,&也會被轉,空格也會,非法字元也會
  • quote(字串) (這個裡面的引數是個字串)

from urllib import request,parse

url = 'http://httpbin.org/post'
headers = {
    'User-Agent':'自己的User-Agent',
    'Host':'httpbin.org'
}
dict = {
    'name':'Sun'
}
data = bytes(parse.urlencode(dict),encoding = 'utf8')
req = request.Request(url = url,data = data,headers = headers,method = 'POST')
reponse = request.urlopen(zeq)
print(reponse.read().decaode('utf-8'))

# 其中url請求URL
# headers指定User-Agent和Host
# 引數data用urlencode()和bytes()方法轉成位元組流
# 請求方法是POST

# 另外,headers也可以用add_header()方法新增!
# req = request.Request(url=url, data=data, method='POST')
# req.add.header('User-agent','新增的User-Agent')

一些其他用法:

 1 #urllib.request模組裡的BaseHandler類是所有其他Handler的父類
 2 #其提供了default_open()、protocol_request()
 3 
 4 
 5 #HTTPDefaultErrorHandler:用於處理HTTP響應錯誤,錯誤都會丟擲HTTPError型別的異常
 6 #HTTPRedirectHandler:用於處理重定向
 7 #HTTPCookieProcessor:用於處理Cookies
 8 #ProxyHandler:用於設定代理,預設空
 9 #HTTPPasswordMgr:用於管理密碼,它維護了使用者名稱和密碼的表
10 #HTTPBasicAuthHandler:用於管理認證,如連線開啟需認證,則可解決

3. 請求方式

  • GET 特點 :查詢引數在URL地址中顯示
  • POST
    • 在Request方法中新增data引數 urllib.request.Request(url,data=data,headers=headers)
    • data :表單資料以bytes型別提交,不能是str

4. requests模組

4.1 安裝

  • pip install requests
  • 在開發工具中安裝

4.2 request常用方法

  • requests.get(網址)

4.3 響應物件response的方法

  • response.text 返回unicode格式的資料(str)
  • response.content 返回位元組流資料(二進位制)
  • response.content.decode('utf-8') 手動進行解碼
  • response.url 返回url
  • response.encode() = 編碼

4.4 requests模組傳送 POST請求

4.5 requests設定代理

  • 使用requests新增代理只需要在請求方法中(get/post)傳遞proxies引數就可以了
  • 代理網站

想看代理集合? 來這裡!!!

重要的就是找到免費代理網站然後存下來做成代理池

4.6 cookie

cookie :通過在客戶端記錄的資訊確定使用者身份

HTTP是一種無連線協議,客戶端和伺服器互動僅僅限於 請求/響應過程,結束後斷開,下一次請求時,伺服器會認為是一個新的客戶端,為了維護他們之間的連線,讓伺服器知道這是前一個使用者發起的請求,必須在一個地方儲存客戶端資訊。

4.7 session

session :通過在服務端記錄的資訊確定使用者身份 這裡這個session就是一個指的是會話

  解釋:相當於 我登入給了cookie,但是下次就沒了,所以用一個會話儲存它,讓一個程式能繼續訪問該站點

4.8 處理不信任的SSL證書

什麼是SSL證書?

  • SSL證書是數字證書的一種,類似於駕駛證、護照和營業執照的電子副本。因為配置在伺服器上,也稱為SSL伺服器證書。SSL 證書就是遵守 SSL協議,由受信任的數字證書頒發機構CA,在驗證伺服器身份後頒發,具有伺服器身份驗證和資料傳輸加密功能

5. requests 模組原始碼分析