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的基本使用介绍的更多相关文章

  1. Python urllib和urllib2模块学习(二)

    一.urllib其它函数 前面介绍了 urllib 模块,以及它常用的 urlopen() 和 urlretrieve()函数的使用介绍.当然 urllib 还有一些其它很有用的辅助方法,比如对 ur ...

  2. 爬虫框架urllib 之(三) --- urllib模块

    Mac本 需导入ssl import ssl ssl._create_default_https_context = ssl._create_unverified_context  urllib.re ...

  3. 第六节:web爬虫之urllib(二)

    二.urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, metho ...

  4. python网络编程(六)---web客户端访问

    1.获取web页面 urllib2 支持任何协议的工作---不仅仅是http,还包括FTP,Gopher. import urllib2 req=urllib2.Request('http://www ...

  5. Python 3基础教程31-urllib模块

    本文介绍Python里的urllib模块,这个urllib主要处理web服务的,如果需要做接口测试,或者写Python的网络爬虫,这个urllib就是最底层的库.需要用到里面的请求方法等. 1. 先看 ...

  6. Python采集VIP收费QQ音乐,一起来听周董最新的《说好不哭》,省3块不香吗?

    环境: windows python3.6.5 模块: requests selenium json re urllib 环境与模块介绍完毕后,就可以来实行我们的操作了. 第1步: 通过一个解析网站: ...

  7. 小白学 Python 爬虫(18):Requests 进阶操作

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  8. python爬虫之urllib库介绍

    一.urllib库 urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urllib. ...

  9. python 爬虫 urllib模块介绍

    一.urllib库 概念:urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urll ...

随机推荐

  1. [Beta]the Agiles Scrum Meeting 7

    会议时间:2020.5.21 20:00 1.每个人的工作 今天已完成的工作 成员 已完成的工作 issue yjy 暂无 tq 新增功能:添加.选择.展示多个评测机,对新增功能进行测试 评测部分增加 ...

  2. kafka错误之 Topic xxx not present in metadata after 60000 ms

    Topic xxx not present in metadata after 60000 ms 一.背景 二.场景还原 1.jar包引入 2.jar代码 3.运行结果 三.问题解决 四.参考文档 一 ...

  3. 使用registry搭建docker私服仓库

    使用registry搭建docker私服仓库 一.拉取 registry镜像 二.根据镜像启动一个容器 1.创建一个数据卷 2.启动容器 三.随机访问一个私服的接口,看是否可以返回数据 四.推送一个镜 ...

  4. [BZOJ3307] 雨天的尾巴-----------------线段树进阶

    虽然是个板子,但用到了差分思想. Description N个点,形成一个树状结构.有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成所有发放后,每个点存放最 ...

  5. 小白自制Linux开发板 九. 修改开机Logo

    许久不见啊,今天我们继续来修改我们的系统. 通过前面的几篇文章我们已经能轻松驾驭我们的开发板了,但是现在都是追求个性化的时代,我们在开发板上打上了自己的Logo,那我们是否可以改变开机启动的Logo呢 ...

  6. linux下软链接文件的拷贝

    最近在编译libnl库准备拷贝到其他机器中使用的时候出现无法拷贝问题,原因是sd卡是fat32文件系统格式,这种文件系统不支持linux下的ln软链接文件, void@void-ThinkPad-E4 ...

  7. 按之字形顺序打印二叉树 牛客网 剑指Offer

    按之字形顺序打印二叉树 牛客网 剑指Offer 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推 ...

  8. C++ 变量声明 定义 作用域 链接性总结

    变量定义 变量的定义用于为变量分配存储空间,还可以为变量指定初始值.在一个程序中,变量有且仅有一个定义. 变量声明 用于向程序表明变量的类型和名字.程序中变量可以声明多次,但只能定义一次. 变量的类型 ...

  9. Java开发介绍之JDK JRE JVM 和 环境变量配置

    一.JDK>JRE>JVM JDK(Java Development Kit):Java开发工具包 JDK中包含JRE,在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin和 ...

  10. [python]django rest framework写POST和GET接口

    版本声明 python3.6.5 Django-2.0.6 djangorestframework-3.8.2 mysqlclient-1.3.12 1.写一个登录接口,不多说,直接上代码 login ...