Python爬蟲學習:使用urllib(request)

1. 前言

在Python2中,有urllib和urllib2兩個庫來實現請求的發送。而在python3中,已經不存在urllib2這個庫了,統一爲urllib。
urllib是Python內置的HTTP請求庫,也就是說不需要額外安裝即可使用,它一共包含四個模塊:

request:它是最基本的HTTP請求模塊,可以用來模擬發送請求。就像在瀏覽器輸入網址,然後回車一樣,只需要給庫方法傳入URL以及額外的參數,就可以實現這個過程

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

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

robotparser:主要用來識別網站的robots.txt文件,然後判斷哪些網站可以爬,哪些網站不可以爬

2. 發送請求

我們使用urllib的request模塊,可以方便地實現請求的發送並得到響應

  1. urlopen()
urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
            *, cafile=None, capath=None, cadefault=False)
import urllib.request
url = 'http://www.baidu.com'
response = urllib.request.urlopen(url)
print(response.read().decode('utf-8'))
print(type(response)) # <class 'http.client.HTTPResponse'>

它返回的是一個HTTPResponse類型的對象,主要包含read()、getheader(name)、getheaders()等方法,以及version、reason、closed等屬性

得到這個對象之後,我們可以把它賦值爲response變量,然後就可以調用這些方法和屬性,從而得到一系列信息了

import urllib.request
url = 'http://www.baidu.com'
response = urllib.request.urlopen(url)
print(response.status)#200
print(response.getheaders())
print(response.getheader('Connection'))#close

data參數:這個參數是可選的,如果傳遞了這個參數,則它的請求方式就不再是GET方式,而是POST方式,這個data參數的值必須符合這個application/x-www-form-urlencoded的格式,可以使用urllib.parse.urlencode()將字符串轉換爲這個格式

import urllib.request
import urllib.parse
import json
# 瀏覽器請求的網址
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
content=input("請輸入需要翻譯的內容:")
data={}
data['i']=content
data['from']='AUTO'
data['to']='AUTO'
data['smartresult']='dict'
data['client']='fanyideskweb'
data['doctype']='json'
# 使用urllib.parse.urlencode()轉換字符串
data = urllib.parse.urlencode(data).encode('utf-8')
response = urllib.request.urlopen(url,data)
html = response.read().decode('utf-8')
target = json.loads(html)
print("翻譯結果:%s"% (target['translateResult'][0][0]['tgt']))

timeout參數:用於設置超時時間,單位爲秒,意思就是如果請求超出了設置的這個時間,還沒有得到響應,就會拋出異常,如果不指定該參數,就會使用全局默認時間

import urllib.request
url = 'http://www.baidu.com'
try:
    response = urllib.request.urlopen(url,timeout=1)
    print(response.read().decode('utf-8'))
except:
    print("Time out")

這裏我們設置超時時間來控制一個網頁如果長時間未響應,就跳過它的抓取

  1. Request
    利用urlopen()方法可以實現最基本請求的發起,但這幾個簡單的參數不再是URL,而是一個Request類型的對象
class urllib.request.Request(url, data=None, headers={},
                 origin_req_host=None, unverifiable=False,
                 method=None)
#url:用於請求URL,這是必傳參數,其他都是可選參數
#data:表示是否爲POST方式
#headers:是一個字典,請求頭,可以對其修改,來僞裝瀏覽器
#origin_req_host:指請求方的host名稱或者IP地址
#unverifiable:表示這個請求時無法驗證的,默認是FALSE,意思就是沒有足夠權限來選擇接受這個請求的結果
#method:表示請求的方法

可參考

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