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(urldata=None[timeout]*cafile=Nonecapath=Nonecadefault=Falsecontext=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(urldata=Noneheaders={}origin_req_host=Noneunverifiable=Falsemethod=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)

点击下载代码

 

猜你喜欢

转载自www.cnblogs.com/zimengfang/p/10153491.html