Python爬虫从入门到进阶之urllib库的使用
Posted zimengfang的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python爬虫从入门到进阶之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, 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爬虫从入门到进阶之urllib库的使用的主要内容,如果未能解决你的问题,请参考以下文章
python爬虫从入门到放弃之 Requests库的基本使用
python爬虫从入门到放弃之 Requests库的基本使用