Python爬蟲從入門到進階(2)之urllib庫的使用
1.什麽是Urllib(官網地址:https://docs.python.org/3/library/urllib.html#module-urllib)
Urllib是python內置的HTTP請求庫
包括以下模塊:
urllib.request 請求模塊
urllib.error 異常處理模塊
urllib.parse url解析模塊
urllib.robotparser robots.txt解析模塊
2.urllib.request
(1)urllib.request.
urlopen
(url, data=None, [timeout, ]*, cafile=None, capath=None
1 參數簡介:
url:是字符串類型或者 Request 對象
data:必須是指定要發送到服務器的額外數據的對象,如果不需要這樣的數據,則為None。
timeout:可選,為阻塞操作指定以秒為單位的超時時間。不指定,將使用全局默認超時設置,實際上只適用於HTTP、HTTPS和FTP連接。
context:如果指定了 context,它必須是 ssl.SSLContext 的實例
cafile,capath:可選參數為HTTPS請求指定一組受信任的CA證書
2.返回值:對於HTTP和HTTPS url,該函數返回 http.client.HTTPResponse對象
9 # 1.urlopen中 url 參數的使用以及 Response 的使用 10 def get(): 11 request_url = ‘http://www.python.org/‘ 12 # 創建請求對象 13 request = Request(request_url) 14 response = urlopen(request, context=ssl._create_unverified_context()) 15 16 # 響應體:Response相關的使用 17 print(type(response)) # <class ‘http.client.HTTPResponse‘>18 print(response.status) # 200 19 print(response.getheaders()) 20 print(response.getheader(‘Server‘)) # nginx 21 22 # response.read()讀取網頁的全部內容 23 data = response.read() 24 # response.readline() 讀取網頁的一行內容 25 data_line = response.readline() 26 print(data) 27 print(data_line) 28 29 30 # 2.帶參數的 get 方法 31 def get_params(): 32 request_url = ‘http://httpbin.org/get?name={}‘ 33 # 拼接參數 34 # keyword = ‘nalanrongruo‘ 35 keyword = ‘納蘭容若‘ 36 final_url = request_url.format(quote(keyword)) 37 # quote(keyword) 將包含漢字的網址進行轉譯,要不然會報錯: UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in position 38 # 10-11: ordinal not in range(128) python是解釋性語言;解析器只支持ascii(0-127) 39 print(final_url) 40 request = Request(final_url) 41 response = urlopen(request) 42 43 data = response.read().decode(‘utf-8‘) 44 45 print(data) 46 47 48 # 3.get的字典參數 49 def get_dict_params(): 50 base_url = ‘http://httpbin.org/get?‘ 51 params = { 52 ‘wd‘: ‘納蘭容若‘, 53 ‘name‘: ‘納蘭容若‘, 54 ‘age‘: ‘21‘ 55 } 56 # 將字典或者元祖轉換成URL可識別 57 str_params = urlencode(params) 58 print(str_params) 59 request_url = base_url + str_params 60 61 # 如果你的url已經是計算機可以識別的狀態,那麽不轉換 62 end_url = quote(request_url, safe=string.printable) 63 print(end_url) 64 65 # 返回的響應對象 66 response = urlopen(end_url) 67 68 print(response.read().decode(‘utf-8‘)) 69
(2)urllib.request.
build_opener
([handler, ...])
1 參數:BaseHandler的實例或者子類:
ProxyHandler(如果檢測到代理設置)、UnknownHandler、HTTPHandler、HTTPDefaultErrorHandler、HTTPRedirectHandler、
FTPHandler、FileHandler、HTTPErrorProcessor。
(3)class urllib.request.
Request
(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
Request :這個類是URL請求的抽象。
url:是包含可用 URL 的字符串類型
data:必須是指定要發送到服務器的額外數據的對象,如果不需要這樣的數據,則為None。對於 HTTP POST 請求data 必須是標準application/x-www-form-urlencoded格式化
headers:是一個字典,並將被視為使用每個鍵和值作為參數調用add_header()。這通常用於“欺騙”用戶代理頭值,瀏覽器使用該頭值來標識自身——一些HTTP服務器只允許來自普通瀏覽器的請求,而不允許來自腳本。如果參數不為空,則應包含Content-Type頭。如果沒提供 header,且 data 不是 None,則應該添加默認的Content-Type: application/x-www-form-urlencoded
method:是一個字符串,該字符串指示將使用的HTTP請求方法。如果提供,它的值存儲在方法屬性中,並由get_method()使用。如果data為空,默認為“GET”,否則為“POST”。
子類可以通過在類本身中設置方法屬性來指示不同的默認方法。
1 # post請求 2 def post(): 3 request_url = ‘http://httpbin.org/post‘ 4 data = { 5 ‘wd‘: ‘納蘭容若‘, 6 ‘name‘: ‘納蘭容若‘, 7 ‘age‘: ‘21‘ 8 } 9 # 返回的響應對象 10 response = urlopen(request_url, data=data) 11 print(response.read().decode(‘utf-8‘)) 12 13 14 # 4.添加請求頭,模擬真實瀏覽器?發送請求 15 def request_header(): 16 request_url = ‘http://httpbin.org/get‘ 17 # 創建請求對象 18 # 1) 添加 header 19 # headers = { 20 # ‘User-Agent‘: ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) ‘ 21 # ‘Chrome/70.0.3538.102 Safari/537.36‘ 22 # } 23 # request = Request(request_url, headers=headers) 24 25 # 2).動態的添加header的信息 26 request = Request(request_url) 27 request.add_header(‘User-Agent‘, 28 ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) ‘ 29 ‘Chrome/70.0.3538.102 Safari/537.36‘) 30 31 response = urlopen(request) 32 print(response.read().decode(‘utf-8‘)) 33 34 35 # 5.隨機添加User-Agent,避免被屏蔽 36 def random_request_header(): 37 # 百度一下:https://blog.csdn.net/rookie_is_me/article/details/81634048 38 user_agent_list = [ 39 ‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1‘, 40 ‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0‘, 41 ‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50‘, 42 ‘Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168 Version/11.50‘, 43 ‘Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET ‘ 44 ‘CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; Tablet PC 2.0; .NET4.0E)‘] 45 46 # 每次請求的瀏覽器都是不一樣 47 random_user_agent = random.choice(user_agent_list) 48 print(random_user_agent) 49 request_url = ‘http://www.python.org/‘ 50 request = Request(request_url) 51 # 增加對應請求頭的信息 52 request.add_header("User-Agent", random_user_agent) 53 response = urlopen(request, context=ssl._create_unverified_context()) 54 55 print(response) 56 57 # 打印請求頭信息 58 print(request.get_header("User-agent"))
(4)各種高級用法handler
1 # 6.高級用法各種handler 2 def http_handler_opener(): 3 # 系統的方法_have_ssl CA證書安全 套階層 4 # 系統的urlopen這個方法沒有實現加ip的方法 5 url = "http://www.baidu.com/" 6 7 # 創建自己的處理器 8 handler = HTTPHandler() 9 # 創建自己的opener 10 opener = build_opener(handler) 11 # 用自己創建的opener來發送請求 12 response = opener.open(url) 13 14 data = response.read().decode("utf-8") 15 print(data) 16 17 18 def proxy_handler(): 19 url = "http://www.baidu.com/" 20 21 # 添加代理 22 # 免費ip 23 proxy = { 24 "http": "http://112.87.71.146:9999" 25 } 26 27 # 代理ip處理器 28 ip_handler = ProxyHandler(proxy) 29 # 創建自己的opener 30 opener = build_opener(ip_handler) 31 # 拿著代理ip發送網絡請求 32 response = opener.open(url, timeout=10) 33 data = response.read().decode("utf-8") 34 print(data) 35 36 37 def random_proxy_handler(): 38 proxy_list = [ 39 {"http": "http://119.101.116.204:9999"}, 40 {"http": "hhttp://119.101.119.33:9999"}, 41 {"http": "http://117.85.49.123:9999"}, 42 {"http": "http://112.85.167.223:9999"}, 43 {"http": "http://119.101.112.145:9999"} 44 ] 45 for proxy in proxy_list: 46 # print(proxy) 47 # 利用對應遍歷出來的ip地址創建處理器 48 ip_handler = ProxyHandler(proxy) 49 # 利用處理器創建opener 50 opener = build_opener(ip_handler) 51 try: 52 response = opener.open("http://www.baidu.com", timeout=10) 53 data = response.read() 54 print(data) 55 except Exception as e: 56 print(e) 57 58 59 def auth_user(): 60 # 1.定義賬號和密碼 61 user = "admin" 62 pwd = "123456" 63 nei_url = "http://www.baidu.com" 64 65 # 創建密碼管理器 66 pwd_manager = HTTPPasswordMgrWithDefaultRealm() 67 68 pwd_manager.add_password(None, nei_url, user, pwd) 69 70 # 創建認證處理器 71 auth_handler = HTTPBasicAuthHandler() 72 73 opener = build_opener(auth_handler) 74 75 response = opener.open(nei_url, timeout=10) 76 print(response.read())
3.urllib.error
是urllib.request引發的異常定義異常類。基本異常類是URLError
urllib.error.
URLError
urllib.error.
HTTPError
1 def error(): 2 url = "https://blog.csdn.net/weidan0302/article/details/110" 3 4 try: 5 urlopen(url, context=ssl._create_unverified_context()) 6 except urllib.error.HTTPError as error: 7 print(error.code) 8 9 except urllib.request.URLError as error: 10 print(error)
點擊下載代碼
Python爬蟲從入門到進階(2)之urllib庫的使用