python爬蟲學習第四章

<!DOCTYPE html>


fourth




css

Urllib庫與URLError異常處理


什麼是Urllib庫


Urllib是Python提供的一個用於操做URL的模塊。html


快速使用Urllib爬取網頁


首先導入模塊

import urllib.request

導入後,爬取

file = urllib.request.urlopen("http://www.baidu.com";)

讀取,三種方式
git

  1. file.read()讀取文件的所有內容,與readlines不一樣的是,read會把讀取到的內容賦給一個字符串變量
  2. file.readlines()讀取文件的所有內容,與read不一樣的是,readlines會把讀取到的內容賦給一個列表變量,若要讀取所有內容,推薦使用這種方式
  3. File.readline()讀取文件的一行文件。

    如何將爬取到的網頁保存到本地以網頁形式
  4. 首先,爬取一個網頁並將爬取到的內容賦值給一個變量。
  5. 以寫入的方式打開一個本地文件,命名爲*.html等網絡格式。
  6. 將1中變量寫入文件
  7. 關閉該文件。

    fhandle=open(r"C:\Users\My\Desktop\git學習\1.html",'wb')

    fhandle.write(file.read())

    fhandle.close()


    urlretreve()函數


    直接將對應信息寫入文件。格式:urllib.request.urlretrieve(url,filename=本地文件地址)github


    urllib.request.urlretrieve("http://www.51cto.com/";,filename=r"C:\Users\My\Desktop\git學習\2.html")

    urlretrieve執行的過程當中,會產生緩存,清除緩存

    urllib.request.urlcleanup()

    獲取與當前環境相關的信息使用info。
    file.info()

    獲取當前爬取網頁的狀態碼,使用getcode(),若返回200爲正確,返回其餘的不正確。

    file.getcode()

    獲取爬取網頁的URL,使用geturl()
    file.geturl()

    通常來講,URL標準中只會容許一部分ASCII字符好比數字、字母、部分符號等,而其餘的一些字符,好比漢字等,是不符合URL標準的。因此若是咱們在URL中使用一些其餘不符合標準的字符就會出現問題,此時須要進行URL編碼方可解決。好比在URL中輸入中文或者「:」或者「&」等不符合標準的字符時,須要編碼。

    若是要進行編碼,使用urllib.request.quete()進行,好比,咱們對「http://www.sina.com.cn"進行編碼

    urllib.reqeust.quote("http://www.sina.com.cn";)

    輸出'http%3A//www.sina.com.cn'


    解碼

    urllib.request.unquote("http%3A//www.sina.com.cn")

    輸出'http://www.sina.com.cn'

    web


    瀏覽器的模擬---Headers屬性


    有時候,咱們沒法爬取一些網頁,出現403錯誤,這是由於這些網頁爲了防止別人惡意採集信息進行的反爬蟲的設置。

    若是想爬取,咱們能夠設置Headers信息,模擬成瀏覽器去訪問這些網站。設置Headers,首先須要的是找出User-Agent。

    User-Agent

    有兩種方法讓爬蟲模擬成瀏覽器範文網頁
    canvas

  8. 使用buildopener()修改報頭

    import urllib.request

    url="網頁地址"

    headers=("User-Agent","瀏覽器裏找到的User-Agent")

    opener=urllib.request.build_opener()

    opener.addheaders=[headers]

    data=opener.open(url).read()

    fhandler=open("存放網頁的地址","wb")

    fhandler.write(data)

    fhandler.close()

  9. 使用addheader()添加報頭

    import urllib.request

    url="網頁地址"

    req=urllib.request.Request(url)

    req.add_header('User-Agent',"瀏覽器找到的User-Agent")

    data=urllib.request.urlopen(req).read()


    超時設置


    有的時候,訪問一個網頁,若是該網頁長時間未響應,那麼系統判斷該網頁超時,即沒法打開該網頁。

    import urllib.request
    file=urllib.request.urlopen("網頁地址",timeout=時間值)
    瀏覽器


    HTTP協議請求實戰


    HTTP協議請求主要分爲6種類型。
    緩存

  10. GET請求:GET請求會經過URL網址傳遞信息,能夠直接在URL中寫上要傳遞的信息,也能夠有表單進行傳遞。若是使用表單進行傳遞,這表單中的信息會自動轉爲URL地址中的數據,經過URL地址傳遞。
  11. POST請求:能夠向服務器提交數據,是一種比較主流也比較安全的數據傳遞方式,好比在登陸時,常常使用POST請求發送數據。
  12. PUT請求:請求服務器存儲一個資源,一般要指定存儲的位置。
  13. DELETE請求:請求服務器刪除一個資源
  14. HEAD請求:請求獲取對應的HTTP報頭信息。
  15. OPTIONS請求:能夠得到當前URL所支持的請求類型。

    除此以外還有TRACE請求和CONNECT請求等,TRACE請求主要用於測試或診斷。

    詳細講解GET與POST
  • GET請求實例分析

    import urllib.request

    keywd="hello"

    url="http://www.baidu.com/s?wd="+keywd

    req=urllib.request.Request(url)

    data=urllib.request.urlopen(req).read()

    fhandle=open("文件存儲地址","wb")

    fhandle=write(data)

    fhandle.close()


    當檢索中文會報錯。

    UnicodeEncodeError

    import urllib.request

    url="http://www.baidu.com/s?wd=";

    key="韋瑋老師"

    key_code=urllib.request.quote(key)

    url_all=url+key_code

    req=urllib.request.Request(url_all)

    data=urllib.request.urlopen(req).read()

    fh=open("文件地址","wb")

    fh.write(data)

    fh.close()


    使用GET請求,思路以下:
    1. 構建對應的URL地址,該URL地址包含GET請求的字段名和字段內容等信息,而且URL地址知足GET請求的格式,即「http://網址?字段名1=字段內容1&字段名2=字段內容2」。
    2. 對應的URL爲參數,構建Request對象。
    3. 經過urlopen()打開構建的Request對象。
    4. 按需求進行後續的處理操做。好比讀取網頁內容,或寫入文件。
  • POST請求實例分析

    使用Post請求,思路以下:
    1. 設置好URL網址。
    2. 構建表單數據,並使用urllib.parse.urlencode對數據進行編碼處理
    3. 建立Request對象,參數包括URL地址和要傳遞的數據。
    4. 使用add_header()添加頭信息,模擬瀏覽器進行爬取。
    5. 使用urllib.request.urlopen()打開對應的Request對象,完成信息的傳遞。
    6. 後續處理,好比讀取,寫入文件等。

      import urllib.request

      import urllib.parse

      url="網頁地址"

      postdata=urllib.parse.urlencode({

      'name':'aaa',

      'pass':'bbb'}).encode('utf-8')#將數據使用urlencode編碼處理後,使用encode()設置爲utf-8編碼

      req=urllib.request.Request(url,postdata)

      req.add_header('User-Agent','User-Agent數據')

      data=urllib.request.urlopen(req).read()

      fd=open("存儲地址",'wb')

      fd.write(data)

      fd.close()


      代理服務器的設置


      #代理服務器網站http://yum.iqianyue.com/proxy

      def use_proxy(proxy_addr,url):

      import urllib.request

      proxy=urllib.request.ProxyHandler({'http':proxy_addr})

      opener=urllib.request.build_opener(proxy,urllib.request.HTTPHandler)

      urllib.request.install_opener(opener)

      data=urllib.request.urlopen(url).read().decode('utf-8')

      return data

      proxy_addr="代理服務器地址加端口"

      data=use_proxy(proxy_addr,"網頁地址")

      print(len(data))

      安全


      DebugLog實戰


      異常處理神器----URLError實戰


      import urllib.request

      import urllib.error

      try:

      urllib.request.urlopen("網頁地址")

      except urllib.error.URLError as e:

      print(e.code)

      print(e.reason)

      輸出錯誤:

      403

      Forbidden


      產生URLError的緣由有以下幾種可能:ruby

  1. 連接不上服務器
  2. 遠程URL不存在
  3. 無網絡
  4. 觸發了HTTPError
    403觸發了是URLError的子類HTTPError,因此能夠改爲
    import urllib.request

    import urllib.error

    try:

    urllib.request.urlopen("網頁地址")

    except urllib.error.HTTPError as e:

    print(e.code)

    print(e.reason)

    狀態碼含義:
    200 OK

    一切正常

    301 Moved Permanently

    重定向到新的URL,永久性

    302 Found

    重定向到臨時的URL,非永久性

    304 Not Modified

    請求的資源爲更新

    400 Bad Request

    非法請求

    401 Unauthorized

    請求未經受權

    403 Forbidden

    禁止訪問

    404 Not Found

    沒有找到對應頁面

    500 Internal Server Error

    服務器內部出現錯誤

    501 Not Implemented

    服務器不支持實現請求所須要的功能

    HTTPError沒法處理URLError的前三個錯誤。處理會報錯。
    import urllib.request

    import urllib.error

    try:

    urllib.request.urlopen("http://blog.baidusss.net";) except urllib.error.HTTPError as e: print(e.code) print(e.reason) except urllib.error.URLError as e: print(e.reason)
相關文章
相關標籤/搜索