1. 程式人生 > >Python爬蟲從入門到進階(2)之urllib庫的使用

Python爬蟲從入門到進階(2)之urllib庫的使用

windows 6.0 賬號 高級 manager cname 4.5 clr python爬蟲

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

, cadefault=False, context=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庫的使用