python爬蟲工程師 成長之路三 URLlib庫和URLError處理

URLlib庫概述

URLlib是python提供的一個用於操作URL的模塊,常用於爬取網頁,python3.x中將python2.x中的URLlib和URLlib2合併成爲新的URLlib。

使用URLlib爬取網頁

  • 導入URLlib.request

    import urllib.request
    
  • 使用urllib.request.urlopen打開需要爬取的網站並用web接收一下

    web=urllib.request.urlopen('http://www.baidu.com')
    
  • 讀取網頁內容

    data=web.read() #讀取網頁的全部內容
    dataline=web.readline() #讀取網頁的一行內容
    
  • 查看網頁內容
    在這裏插入圖片描述

  • 將網頁存到本地
    urlllib.request.urlretrieve(url,filename)

    • url:網頁的網址
    • filename:存放文件的地址與名稱
    urllib.request.urlretrieve('http://www.baidu.com','./baidu.	html')
    

    在這裏插入圖片描述
    打開文件
    在這裏插入圖片描述
    全過程

    import urllib.request
    web=urllib.request.urlopen('http://www.baidu.com')
    data=web.read() #讀取網頁的全部內容
    dataline=web.readline() #讀取網頁的一行內容
    print(dataline)
    print('-------------------')
    print(data)
    urllib.request.urlretrieve('http://www.baidu.com','./baidu.html')
    

    在這裏插入圖片描述

urllib常用方法

  • urllib.request.urlcleanup()
    清除urlretrieve()執行時產生的緩存
    urllib.request.urlcleanup()
    
  • 網頁.info()
    返回當前環境有關的信息
    因爲之前將爬取的網頁賦值給了web,所以直接使用web.info()即可
    在這裏插入圖片描述
  • 網頁.getcode()
    返回當前爬取網頁的狀態碼,200爲正確,其他均爲不正確
    在這裏插入圖片描述
  • 網頁.geturl()
    返回當前爬取的URL地址
    在這裏插入圖片描述
  • urllib.request.quote()
    因爲URL標準中不允許漢字、:、&等字符的出現,所以如果我們需要輸入這些字符時需要編碼
    在這裏插入圖片描述 - urllib.request.unquote()
    對編碼後的網址解碼查看原網址
    在這裏插入圖片描述

瀏覽器僞裝

在爬取某些網頁時會出現403錯誤,是因爲這些網頁設置了反爬蟲措施。此時,我們可以設置Headers屬性僞裝成瀏覽器去訪問這些網站。

獲取瀏覽器Headers屬性

打開百度網頁→右鍵檢查→上方network→點擊左邊all→點擊百度一下,使網頁發生動作→找到左下方最上邊的www.baidu.com→點擊後找到後邊最下方的User-Agent,並將後面的值複製出來
在這裏插入圖片描述

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36

使用build_opener()修改報頭

此處以爬取my前一篇博客爲例

  • 直接使用之前的方法爬取

    urllib.request.urlretrieve('https://blog.csdn.net/Late_whale/article/details/104559134','./baidu.html')
    

    在這裏插入圖片描述
    查看結果,發現該方法會被重定向到csdn首頁
    在這裏插入圖片描述

  • 導入URLlib.request

    import urllib.request
    
  • 定義一個url用於存儲網址url

    url='https://blog.csdn.net/Late_whale/article/details/104559134'
    
  • 定義headers用於存儲之前的Headers

    headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36")
    
  • 定義一個urllib.request.build_opener()對象

    opener=urllib.request.build_opener()
    opener.address=[headers]
    
  • 開始爬取數據

    data=opener.open(url).read()
    
  • 將數據存進html文件

    file=open('./test.html','web')
    file.write(data)
    file.close()
    
  • 爬取完畢後查看結果
    在這裏插入圖片描述
    爬取成功
    在這裏插入圖片描述

使用add_header()添加報頭

  • urllib.request.Request(url).add_header(‘User-Agent’,value)
  • url:需要爬取的網址url
  • value:瀏覽器的headers屬性值
import urllib.request
url='https://blog.csdn.net/Late_whale/article/details/104559134'
req=urllib.request.Request(url) #創建Request對象
req.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36")# 添加報頭信息格式:對象名.add_header()
data=urllib.request.urlopen(req).read()#打開網址
file=open('./test_add.html','wb')
file.write(data)
file.close()

在這裏插入圖片描述
在這裏插入圖片描述

超時設置

在我們訪問一個網頁時,如果該網頁長時間未響應,則系統會判斷超時。我們可以根據自己的需求來設置超時的時間值。

設置超時時間值爲10秒鐘

urllib.request.urlopen('http://www.baidu.com',timeout=10)

http協議請求

http協議用於進行客戶端和服務器端之間的消息傳遞,http協議請求主要分爲6類

  • get請求:get請求通過URL網址傳遞信息,可以直接在URL中寫上要傳遞的信息,也可以由表單傳遞,如果用表單傳遞信息,表單中的信息會自動轉化爲URL地址中的數據,通過URL地址傳遞
  • post請求:可以向服務器提交數據,是一種常用也比較安全的數據傳遞方式,登錄時常使用該方式
  • put請求:請求服務器存儲一個資源,通常要直到存儲的位置
  • delete請求:請求服務器刪除一個資源
  • head請求:請求獲取http報頭信息
  • options請求:獲取當前URL支持的請求類型
  • 另外trace請求和contact請求用得不多就不講解了

代理服務器設置

用同一個ip地址去爬取同一個網頁上時間久了會被屏蔽,我們可以用代理服務器來解決這個問題,這樣我們自己爬取是用的就不是自己的IP了

urllib.request.ProxyHandler({‘http’:proxy_add})用於設置代理服務器信息

  • proxy_add:代理服務器ip地址:端口

urllib.request.build_opener(proxy,urllib.request.HTTPHandler)
創建一個自定義opener對象

  • proxy:代理服務器信息
  • urllib.request.HTTPHandler:urllib.request.HTTPHandler類

data=urllib.request.urlopen(url).read().decode(‘utf-8’)
打開url對應的網址並指定編碼爲utf-8

使用正確的代理ip,爬取成功

def proxy(proxy_add,url):
    import urllib.request
    proxy=urllib.request.ProxyHandler({'http':proxy_add})
    opener=urllib.request.build_opener(proxy,urllib.request.HTTPHandler)
    data=urllib.request.urlopen(url).read().decode('utf-8')
    return data
proxy_add='194.75.157.1:7777'
data1=proxy(proxy_add,'http://www.baidu.com')
print(data1)

在這裏插入圖片描述

DebugLog

開啓DebugLog,即可打印程序運行日誌

  • 將urllib.request.HTTPHandler(debuglevel=1)和urllib.request.HTTPSHandler(debuglevel=1)裏debuglevel設置爲1

    hh=urllib.request.HTTPHandler(debuglevel=1)
    hsh=urllib.request.HTTPSHandler(debuglevel=1)
    
  • urllib.request.build_opener(hh,hsh)
    用前面設置好的變量做參數定義opener對象

    opener=urllib.request.build_opener(hh,hsh)
    
  • urllib.request.install_opener(opener)創建全局默認opener對象,在調用urlopen時也會使用我們自定義的opener對象

    urllib.request.install_opener(opener)
    
  • 訪問網頁

    data=urllib.request.urlopen('http://www.baidu.com')
    
import urllib.request
hh=urllib.request.HTTPHandler(debuglevel=1)
hsh=urllib.request.HTTPSHandler(debuglevel=1)

opener=urllib.request.build_opener(hh,hsh)
urllib.request.install_opener(opener)
data=urllib.request.urlopen('http://www.baidu.com')

在這裏插入圖片描述

URLRrror

通常情況下,產生URLError的情況如下:

  • 連接不上服務器
  • URL不存在
  • 無網絡
  • 觸發了HTTPRrror(返回狀態碼)

我們可以導入urllib.error使用try……catch語句對異常進行處理

服務器返回的狀態碼及其意義

狀態碼 意義
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://www.aaa.com')
except urllib.error.HTTPError as e:
    print(e.code)
except urllib.error.URLError as e:
    print(e.reason)

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章