爬蟲基礎筆記—urllib庫的使用

一、urllib庫

  urllib是一個用來處理網絡請求的python數據庫,它包含四個模塊
  urllib.requests 請求模塊,用於發起網絡請求
  urllib.parse 解析模塊,用於解析URL
  urllib.error 異常處理模塊,用於處理request引起的異常
  urllib.robotparse 用於解析robots.txt文件

1.urllib.requests 模塊

  request模塊主要負責構造和發起網絡請求,並在其中添加Headers,Proxy等。
利用它可以模擬瀏覽器的請求發起過程。
  a.發起網絡請求
  b.添加Headers
  c.操作cookie
  d.使用代理

1.1urlopen方法

  urlopen是一個簡單發送網絡請求的方法。它接收一個字符串格式的url,它會向傳入的url發送網絡請求,然後返回結果。

from urllib import request
response = request.urlopen(url='http://httpbin.org/get')

  urlopen 默認會發送get請求,當傳入data數據時,則會發生POST請求。data參數是字節類型、這類文件對象或可迭代對象。

response = request.urlopen(url='http://httpbin.org/post'),
                            data=b'uesrname=jay&password=123456'

  還可以設置超時,如果請求超過設置時間,則拋出異常。timeout沒有指定則用系統默認設置,
timeout只對,http,https以及ftp連接起作用。以秒爲單位,比如可以設置timeout=0.1 超時時間爲0.1秒。

response = request.urlopen(url='http://www.baidu.com', timeout=0.1)

2.Request對象

  利用openurl可以發起最基本的請求,但這幾個簡單的參數不足以構建一個完整的請求,可以利用更強大的Request對象來構建更加完整的請求。

req == resquest.Request('http://www.baidu.com')
response = request.urlopen(req)
2.1請求頭添加

  通過urllib發送的請求會有一個默認的Headers: “User-Agent”:“Python-urllib/3.6”,指明請求是由urllib發送的。所以遇到一些驗證User-Agent的網站時,需要我們自定義Headers把自己僞裝起來。

headers = {
    'user-Agent':'Mozilla/5.0(Window NT 10.0; Win64;) AppleWebkit/537.36(KHTML, like Gecko)'
}
print(heaeders)
url = 'http://www.baidu.com'
req =  request.Request('http://www.baidu.com', headers)
2.2操作cookie

  在開發得過程中,對cookie得處理非常重要,urllib得cookie處理如下:

from urllib import request
from http import cookiejar

# 創建一個cookie 對象
cookie = cookiejar.CookieJar()
# 創建一個cookie處理器
coolie = request.HTTPCookieProcessor(cookie)
# 以它爲參數,創建Openner對象
opener = request.build_opener(cookies)
# 使用這個openner來發請求
res = opener.opeen('http://www.baidu.com')
print(coolie.cookiejar)

2.3設置代理

  運行爬蟲的時候,經常出現被封的情況,這時候我們就需要用ip代理來處理,
urllib的IP處理如下:

from urllib import request

url = 'http://httpbiin.org/ip'
# 代理地址
proxy = {'http':'180.76.111.69:3128'}
# 代理處理器
proxies = request.baidu_opener(proxies)

res = oprner.open(url)
print(res.read().decode())

3.Response對象

  urllib庫中的類或或者方法,在發送網絡請求後,都會返回一個urllib.response的對象。它包含了請求回來的數據結果。它包含了一些屬性和方法,供我們處理返回的結果。
a.read() 獲取響應的數據,只能用一次

print(response.read())

b.readline 讀取一行

while True:
    data = response.readlin()
    if data:
        print(data)

c.info() 獲取響應頭信息

print(response.info())

d.geturl() 獲取訪問的url

print(response.geturl())

e,getcode() 返回狀態碼

print(response.getcode())

4.parse 模塊

  parse模塊是一個工具模塊,提供了需要對url處理的方法,用於解析url。

a.parse.quote()

  url中只能包含ascii字符,在實際操作過程中,get請求通過url傳遞的參數中會有大量的特殊字符,例如漢字,那麼就需要進行url編碼。
例如https://baike.baidu.com/item/URL編碼/3703727?fr=aladdin
我們需要將編碼進行url編碼

from urllib import parse

url = 'http://httpbin.org/get?aaa={}'
safe_url = url.format(parse.quote('人生苦短,我用Python'))
print(safe_url)

運行結果   ✳也可以用parse.unquote()反編碼回來

http://httpbin.org/get?aaa=%E4%BA%BA%E7%94%9F%E8%8B%A6%E7%9F%AD%EF%BC%8C%E6%88%91%E7%94%A8Python
b.parse.urlencode()

  在發送請求的時候,往往會需要傳遞很多的參數,如果用字符串方法去拼接會比較麻煩,parse.urlencode()方法就是用來拼接url參數的。

params = {'wd':'測試','code':1,'height':'100'}
res = parse.urlencode(params)
print(res)

'''
運行結果
wd=%E6%B5%8B%E8%AF%95&code=1&height=100
'''

  也可以通過parse.parse_qs()方法將它轉回字典

print(parse.parse_qs('wd=%E6%B5%8B%E8%AF%95&code=1&height=100'))
'''
運行結果
{'wd': ['測試'], 'code': ['1'], 'height': ['100']}
'''

5.urllib.error模塊

  error模塊主要負責處理異常,如果請求出現錯誤,我們可以用error模塊進行處理
主要包含URLError和HTTPError。
  a.URLError:是error異常模塊的基類,由request模塊產生的異常都可以用這個類來處理
  b.HTTPError:是URLError的子類,主要包含三個屬性:
    (1) code:請求的狀態碼
    (2) reason:錯誤原因
    (3) headers:響應的報頭

6.urllib.robotparse模塊

  robotparse模塊主要負責處理爬蟲協議文件,robots.txt.的解析。
  Robots協議(也稱爲爬蟲協議、機器人協議等)的全稱是“網絡爬蟲排除標準”(Robots Exclusion Protocol),網站通過Robots協議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取。
  robots.txt文件是一個文本文件,使用任何一個常見的文本編輯器,比如Windows系統自帶的Notepad,就可以創建和編輯它 [1] 。robots.txt是一個協議,而不是一個命令。robots.txt是搜索引擎中訪問網站的時候要查看的第一個文件。robots.txt文件告訴蜘蛛程序在服務器上什麼文件是可以被查看的。

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