urllib的基本使用介绍
1. urllib中urlopen的基本使用介绍
1 ### urllib中urlopen的基本使用介绍 2 3 ## urlopen的基本用法(GET请求) 4 import urllib.request as r 5 # 访问一个url,返回一个对象 6 response = r.urlopen("https://www.python.org") 7 # 查看返回的网页页面内容 8 print(response.read().decode("utf-8")) 9 # 查看response类型 10 print(type(response)) 11 # 查看response对象有什么方法和属性 12 print(dir(response)) 13 # 获取response对象的相关用法帮助 14 help(response) 15 # 页面返回状态 16 print(response.status) 17 # 页面的headers元素内容 18 print(response.getheaders()) 19 # 获取页面headers的Server属性值 20 print(response.getheader('Server')) 21 22 23 ## data参数(POST请求),urlencode可以把字典格式数据转化成字符串 24 import urllib.request as r 25 import urllib.parse as p 26 # 通过字符转换获取可直接post提交的数据data 27 data = bytes(p.urlencode({'word':'hello'}),encoding = 'utf-8') 28 data2 = p.urlencode({'word':'hello'}) 29 print(data,data2) 30 # 通过post提交data数据 31 response2 = r.urlopen('http://httpbin.org/post',data=data) 32 response3 = r.urlopen('http://httpbin.org/post',data=bytes(data2,encoding = 'utf-8')) 33 print(response3.read()) 34 35 36 # timeout参数 37 import urllib.request as r 38 import urllib.error as er 39 import socket 40 41 # 尝试执行 42 try: 43 response4 = r.urlopen('http://httpbin.org/get',timeout=0.1) 44 print(response4.read()) 45 # 出现错误进行抓取而不中断程序 46 except er.URLError as e: 47 # 错误原因 48 print(e.reason) 49 print(socket.timeout) 50 # 判断类型是否相同 51 if isinstance(e.reason, socket.timeout): 52 print(isinstance(e.reason, socket.timeout)) 53 print('TIME OUT') 54 55 56 # 其他参数:cafile指定CA证书,capath指定CA证书路径,context参数,必须是ssl.SSLContext类型,用来指定SSL设置
2. urllib中Request的基本使用介绍
1 ### urllib中Request的基本使用介绍 2 3 4 ## Request对象进行传参爬取页面 5 import urllib.request 6 7 # 生成一个request对象 8 request = urllib.request.Request('https://python.org') 9 # 将request对象进行传参 10 response = urllib.request.urlopen(request) 11 print(type(request)) 12 print(response.read().decode('utf-8')) 13 14 15 ## Request对象的参数: 16 ## url,用于请求URL,必传参数 17 ## data,必须传bytes类型的数据 18 ## headers,请求头,是一个字典,也可以通过请求实例的add_header()方法进行添加 19 ## origin_req_host指的是请求方的host名称或者IP地址 20 ## unverifiable布尔类型,表示这个请求是无法验证的,默认是False 21 ## method是一个字符串,指定请求方法,如get,post 22 from urllib import request, parse 23 24 url = 'http://httpbin.org/post' 25 headers = { 26 'User-Agent':'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)', 27 'Host':'httpbin.org', 28 } 29 dict = { 30 'name':'dmr' 31 } 32 # 转换数据类型为bytes 33 data = bytes(parse.urlencode(dict), encoding='utf-8') 34 # 生成Request请求对象 35 req = request.Request(url=url,data=data,headers=headers) 36 response = request.urlopen(req) 37 print(response.read().decode('utf-8')) 38 39 40 ### 高级用法 41 42 ## web弹窗认证 43 from urllib.request import HTTPPasswordMgrWithDefaultRealm, HTTPBasicAuthHandler, build_opener 44 from urllib.error import URLError 45 46 username = 'username' 47 password = 'password' 48 url = 'http://127.0.0.1:6666' 49 # 生成HTTPPasswordMgrWithDefaultRealm对象 50 p = HTTPPasswordMgrWithDefaultRealm() 51 # 为对象添加认证参数信息 52 p.add_password(None,url=url,username=username,password=password) 53 # 生成认证对象 54 auth_handler = HTTPBasicAuthHandler(p) 55 # 生成opener对象 56 opener = build_opener(auth_handler) 57 58 try: 59 result = opener.open(url) 60 html = result.read().decode('utf-8') 61 print(html) 62 except URLError as e: 63 print(e.reason) 64 65 66 ## 代理 67 from urllib.error import URLError 68 from urllib.request import ProxyHandler, build_opener 69 70 proxy = { 71 'http':'http://127.0.0.1:4564', 72 'https':'http://127.0.0.1:4564' 73 } 74 proxy_handler = ProxyHandler(proxy) 75 opener = build_opener(proxy_handler) 76 try: 77 result = opener.open('https://www.baidu.com') 78 print(result.read().decode('utf-8')) 79 except URLError as e: 80 print(e.reason) 81 82 83 ## Cookies,提取网页的Cookies;可通过http.cookiejar.Mozilla(LWP)CookieJar(filename)和.save()将cookies保存到文件 84 import http.cookiejar, urllib.request 85 86 cookie = http.cookiejar.CookieJar() 87 handler = urllib.request.HTTPCookieProcessor(cookie) 88 opener = urllib.request.build_opener(handler) 89 response = opener.open('http://www.baidu.com') 90 for item in cookie: 91 print(item.name+'='+item.value)
3. 处理异常
1 ### 处理异常 2 3 ## URLError 4 from urllib import request, error 5 6 try: 7 response = request.urlopen('http:www.dmr666.org') 8 except error.URLError as e: 9 print(e.reason) 10 11 12 ## HTTPError, URLError的子类 13 from urllib import request, error 14 15 try: 16 response = request.urlopen('http://www.dmr66.org') 17 except error.HTTPError as e: 18 print(e.reason, e.code, e.headers, seq='\n') 19 else: 20 pass
4. 解析链接&robots
1 ### 解析链接 2 3 ## urlparse() 4 ## scheme协议,://前面部分 5 ## netloc域名,第一个/符号前面 6 ## path路径,域名后面;前面部分 7 ## params参数,;号后面问号?前面 8 ## query查询条件,?号后面,用于get类型的url 9 ## flagment描点,#后面,用于定位页面内部的下拉位置 10 from urllib.parse import urlparse 11 12 result = urlparse('http://www.baidu.com/index.html;user?id=$#comment') 13 print(type(result), result) 14 15 16 ## urlunparse(),传入可迭代对象,长度必须是6 17 from urllib.parse import urlunparse 18 19 data = ['http','www.baidu.com','index.html','user','b=6','comment'] 20 print(urlunparse(data)) 21 22 23 ## urlsplit(),params会合并在path中 24 from urllib.parse import urlsplit 25 26 result = urlsplit('http://www.baidu.com/index.html;user?id=$#comment') 27 print(result) 28 29 ## urlunsplit(),传入可迭代对象,长度必须是5 30 from urllib.parse import urlunsplit 31 32 data = ['http','www.baidu.com','index.html','a=6','comment'] 33 print(data) 34 35 36 ## urljoin(),url拼接,只保留scheme,netloc,path 37 ## scheme,netloc,path三部分内容新链接中不存在,则补充,新链接中存在,则用新链接的 38 from urllib.parse import urljoin 39 40 print(urljoin('http://www.baidu.com','index.html')) 41 print(urljoin('http://www.baidu.com','https://www.baidu.com/index.html')) 42 print(urljoin('http://www.baidu.com/dmr.html','https://www.baidu.com/index.html')) 43 print(urljoin('http://www.baidu.com/dmr.html','https://www.baidu.com/index.html?q=2')) 44 print(urljoin('http://www.baidu.com/dmr.html','q=2#comment')) 45 print(urljoin('www.baidu.com/dmr.html','q=2#comment')) 46 print(urljoin('www.baidu.com#coment','q=2')) 47 48 49 ## urlencode(),字典序列化,把字典序列化成get请求参数,常用于get请求url的拼接 50 from urllib.parse import urlencode 51 52 query = { 53 'name':'dmr', 54 'age':'25', 55 } 56 base_url = 'http://www.badu.com' 57 q = urlencode(query) 58 url = base_url + q 59 print(url) 60 61 62 ## parse_qs(),反序列化,将参数转换成字典格式 63 from urllib.parse import parse_qs 64 65 query='name=dmr&age=25' 66 dict = parse_qs(query) 67 print(type(dict),dict) 68 69 70 ## parse_qsl(),反序列化,将参数转换成元组组成的列表 71 from urllib.parse import parse_qsl 72 73 query = 'name=dmr&age=25' 74 list = parse_qsl(query) 75 print(list) 76 77 78 ## quote(),将内容转换成url编码格式,url中有中文内容时,常出现乱码 79 from urllib.parse import quote 80 81 keyword = '杜某人' 82 url = 'https://www.baidu.com/?wd=' + keyword 83 print(url) 84 print(quote(url)) 85 86 ## unquote(),解码 87 from urllib.parse import unquote 88 89 url = 'https%3A//www.baidu.com/%3Fwd%3D%E6%9D%9C%E6%9F%90%E4%BA%BA' 90 print(unquote(url)) 91 92 93 94 ### Robots协议,即爬虫协议,用来告诉爬虫哪些页面可以爬取,哪些页面不可以爬取 95 # 当搜索爬虫访问一个站点时,它先检查这个站点根目录下是否存在robots文件,如果存在,则按照其中定义的范围来爬取,否则,皆可爬取 96 # 其中,robots文件基本包含如下3项内容 97 # User-agent:* # 爬虫名称,*为所有 98 # Disallow:/ # 禁止爬取的网站目录 99 # Allow:/public/ # 仅允许爬取的网站目录,一般不与Disallow共用 100 ## robotparser(),解析robots文件模块 101 ## set_url(),用来设置设置robots.txt文件链接 102 ## read(),读取robots.txt文件并进行分析 103 ## parse(),用来解析robots.txt文件 104 ## can_fetch(User-agent,URL),判断url页面是否可以爬取 105 ## mtime(),返回上次抓取和分析robots.txt的时间 106 ## modified(),将当前时间设置为上次抓取和分析robots.txt的时间 107 108 from urllib.robotparser import RobotFileParser 109 110 rp = RobotFileParser() 111 rp.set_url('http://www.baidu.com/robots.txt') 112 rp.read() 113 print(rp.can_fetch('*','http://www.baidu.com/p/ldkfjlk')) 114 print(rp.can_fetch('*','http://www.baidu.com/s?wd=Python'))
静静的学习一阵子儿...