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)
View Code

 

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'))

 

posted @ 2020-03-09 15:24  糕事情  阅读(344)  评论(0编辑  收藏  举报