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'))
urllib的基本使用介绍的更多相关文章
- Python urllib和urllib2模块学习(二)
一.urllib其它函数 前面介绍了 urllib 模块,以及它常用的 urlopen() 和 urlretrieve()函数的使用介绍.当然 urllib 还有一些其它很有用的辅助方法,比如对 ur ...
- 爬虫框架urllib 之(三) --- urllib模块
Mac本 需导入ssl import ssl ssl._create_default_https_context = ssl._create_unverified_context urllib.re ...
- 第六节:web爬虫之urllib(二)
二.urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, metho ...
- python网络编程(六)---web客户端访问
1.获取web页面 urllib2 支持任何协议的工作---不仅仅是http,还包括FTP,Gopher. import urllib2 req=urllib2.Request('http://www ...
- Python 3基础教程31-urllib模块
本文介绍Python里的urllib模块,这个urllib主要处理web服务的,如果需要做接口测试,或者写Python的网络爬虫,这个urllib就是最底层的库.需要用到里面的请求方法等. 1. 先看 ...
- Python采集VIP收费QQ音乐,一起来听周董最新的《说好不哭》,省3块不香吗?
环境: windows python3.6.5 模块: requests selenium json re urllib 环境与模块介绍完毕后,就可以来实行我们的操作了. 第1步: 通过一个解析网站: ...
- 小白学 Python 爬虫(18):Requests 进阶操作
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- python爬虫之urllib库介绍
一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib. ...
- python 爬虫 urllib模块介绍
一.urllib库 概念:urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urll ...
随机推荐
- 2021.9.26考试总结[NOIP模拟62]
T1 set 从\(0\)到\(n\)前缀余数有\(n+1\)个,但只有\(n\)种取值,找到一样的两个输出区间即可. \(code:\) T1 #include<bits/stdc++.h&g ...
- MyBatis源码分析(六):Spring整合分析
一.Mybatis-Spring源码结构 二.Myabtis交给Spring管理的组件 1. dataSource 数据源 配置一个数据源,只要是实现了javax.sql.DataSource接口就可 ...
- Envoy实现.NET架构的网关(二)基于控制平面的动态配置
什么是控制平面 上一篇我们讲了文件系统的动态配置,这次我们来看看通过Control Panel来配置Envoy.控制平面就是一个提供Envoy配置信息的单独服务,我们可以通过这个服务来修改Envoy的 ...
- linux 内核源代码情景分析——越界访问
页式存储管理机制通过页面目录和页面表将每个线性地址转换成物理地址,当遇到下面几种情况就会使CPU产生一次缺页中断,从而执行预定的页面异常处理程序: ① 相应的页面目录或页表项为空,也就是该线性地址与物 ...
- CLion 2021.2 debug报错 process exited with status -1 (attach failed (Not allowed to attach to process.
Clion 升级 2021.2 版本后 debug 报错: process exited with status -1 (attach failed (Not allowed to attach to ...
- SpringBoot配置文件自动映射到属性和实体类(8)
一.配置文件加载 1.Controller中配置并指向文件 @Controller @PropertySource(value = { "application.properties&quo ...
- testNG 注解使用说明
1.TestNG常用注解 @BeforeSuite 标记的方法:在某个测试套件(suite)开始之前运行 @BeforeTest 在某个测试(test)开始之前运行 @BeforeClass 在某个测 ...
- robot_framewok自动化测试--(8)SeleniumLibrary 库(selenium、元素定位、关键字和分层设计)
SeleniumLibrary 库 一.selenium 1.1.Selenium 介绍 Selenium 自动化测试工具,它主要是用于 Web 应用程序的自动化测试,但并不只局限于此,同时支持所有基 ...
- 解决虚拟机安装linux系统无法全屏问题 & vmtools安装
修改设置 1) 如下图右单击虚拟机名,选择[settings-],调出虚拟机设置界面. 2) 在设置界面选择[hardware]->[CD/DVD2(IDE)]->[Connection] ...
- 聊聊sql优化的15个小技巧
前言 sql优化是一个大家都比较关注的热门话题,无论你在面试,还是工作中,都很有可能会遇到. 如果某天你负责的某个线上接口,出现了性能问题,需要做优化.那么你首先想到的很有可能是优化sql语句,因为它 ...