python文档官网地址:https://docs.python.org/3.6/library/urllib.html?highlight=urllib

urllib 是一个收集以下模块以处理URL的包:

  1. urllib.request 用于打开和阅读URL
  2. urllib.error 包含由...提出的例外 urllib.request
  3. urllib.parse 用于解析URL
  4. urllib.robotparser用于解析robots.txt文件

1、urllib.request

urllib.request 模块提供了最基本的构造 HTTP (或其他协议如 FTP)请求的方法,利用它可以模拟浏览器的一个请求发起过程。

利用不同的协议去获取 URL 信息。它的某些接口能够处理基础认证 ( Basic Authenticaton) 、redirections (HTTP 重定向)、 Cookies (浏览器 Cookies)等情况。而这些接口是由 handlers 和 openers 对象提供的。

urllib.request模块定义了以下功能:

(1)urllib.request.urlopen

urllib.request.urlopen(url,data = None,[ timeout,] *,cafile = None,capath = None,cadefault = False,context = None )

l  url,可以是字符串或 Request对象。

l  data必须是指定要发送到服务器的其他数据的对象, 默认为 None, 当 data 不为 None 时, urlopen() 提交方式为 Post timeout:设置网站访问超时时间

l  timeout参数指定阻塞操作(如连接尝试)的超时(以秒为单位)(如果未指定,将使用全局默认超时设置)。

l  context:如果指定了context,则它必须是ssl.SSLContext描述各种SSL选项的实例。

l  cafile和capath:可选的cafile和capath参数为HTTPS请求指定一组可信CA证书。 cafile应指向包含一组 CA证书的单个文件,而capath应指向散列证书文件的目录。

l  cadefault:该cadefault参数被忽略。

响应举例:

  1. import urllib.request #等价与from urllib import request
  2.  
  3. response = urllib.request.urlopen("http://www.baidu.com")
  4. print("查看response响应的类型",type(response))
  5. page_contect = response.read()
  6. print(page_contect.decode('utf-8')) 

执行结果:

  1. 查看response响应的类型 <class 'http.client.HTTPResponse'>
  2.  

urlopen 返回一个类文件对象,并提供了如下方法:

read() , readline() , readlines() , fileno() , close() :这些方法的使用方式与文件对象完全一样; info():返回一个httplib.HTTPMessage对象,表示远程服务器返回的头信息;可以通过Quick Reference to Http Headers查看 Http Header 列表。 getcode():返回Http状态码。如果是http请求,200表示请求成功完成;404表示网址未找到; geturl():返回获取页面的真实 URL。在 urlopen(或 opener 对象)可能带一个重定向时,此方法很有帮助。获取的页面 URL 不一定跟真实请求的 URL 相同。

实例:

  1. import urllib.request
  2.  
  3. response = urllib.request.urlopen('https://python.org/')
  4. print("查看 response 的返回类型:",type(response))
  5. print("查看反应地址信息: ",response)
  6. print("查看头部信息1(http header):\n",response.info())
  7. print("查看头部信息2(http header):\n",response.getheaders())
  8. print("输出头部属性信息:",response.getheader("Server"))
  9. print("查看响应状态信息1(http status):\n",response.status)
  10. print("查看响应状态信息2(http status):\n",response.getcode())
  11. print("查看响应 url 地址:\n",response.geturl())
  12. page = response.read()
  13. print("输出网页源码:",page.decode('utf-8'))

结果自行验证哦

data参数的使用

  1. import urllib.parse
  2. import urllib.request
  3. import json
  4.  
  5. translation = input('输入要翻译的文字:')
  6. url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
  7. data = {}
  8. data['i'] = translation
  9. data['doctype'] = 'json'
  10. data = bytes(urllib.parse.urlencode(data),encoding='utf-8')
  11.  
  12. response = urllib.request.urlopen(url,data)
  13. response_new = response.read().decode('utf-8')
  14.  
  15. response_new_dict = json.loads(response_new) #将str转换为dict
  16.  
  17. print('翻译为:{}'.format(response_new_dict['translateResult'][][]['tgt']))
  18. print(response_new_dict['translateResult'][][]['tgt'])

这里就用到urllib.parse,通过bytes(urllib.parse.urlencode())可以将post数据进行转换放到urllib.request.urlopen的data参数中。这样就完成了一次post请求。
所以如果我们添加data参数的时候就是以post请求方式请求,如果没有data参数就是get请求方式

timeout参数的使用

在某些网络情况不好或者服务器端异常的情况会出现请求慢的情况,或者请求异常,所以这个时候我们需要给

请求设置一个超时时间,而不是让程序一直在等待结果。例子如下:

  1. import urllib.request
  2.  
  3. response = urllib.request.urlopen('http://httpbin.org/get', timeout=)
  4. print(response.read())

运行之后我们看到可以正常的返回结果,接着我们将timeout时间设置为0.1

以下程序为对异常的抓取:

  1. import socket
  2. import urllib.request
  3. import urllib.error
  4.  
  5. try:
  6. response = urllib.request.urlopen('http://httpbin.org/get', timeout=0.1)
  7. except urllib.error.URLError as e:
  8. if isinstance(e.reason, socket.timeout):
  9. print('TIME OUT')

(2)urllib.request.Request(防止被浏览器过滤)

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

使用request()来包装请求,再通过urlopen()获取页面。单纯使用 urlopen 并不能足以构建一个完整的请求,例如: 对拉勾网的请求如果不加上 headers 等信息,就无法正常解析访问网页内容。

  1. import urllib.request
  2.  
  3. url = "https://www.lagou.com/zhaopin/Python/?labelWords=label"
  4.  
  5. headers = {
  6. 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36',
  7. 'Referer': 'https://www.lagou.com/zhaopin/Python/?labelWords=label',
  8. 'Connection': 'keep-alive'
  9. }
  10.  
  11. req = request.Request(url, headers=headers)
  12. page = request.urlopen(req).read()
  13. page = page.decode('utf-8')
  14. print(page)

headers 的参数设置:

User-Agent :这个头部可以携带如下几条信息:浏览器名和版本号、操作系统名和版本号、默认语言。这个数据可以从 网页开发工具上的请求反应信息中获取(浏览器上一般按 F12 打开开发工具)。作用是用于伪装浏览器。

Referer:可以用来防止盗链,有一些网站图片显示来源 https://*.com ,就是检查 Referer 来鉴定的。

Connection:表示连接状态,记录 Session 的状态。

origin_req_host:请求方的 host 名称或者 IP 地址。

unverifiable:指请求无法验证,默认为 False。用户并没有足够的权限来选择接收这个请求结果,例如请求一个 HTML 文档中的图片,但没有自动抓取图像的权限,这时 unverifiable 为 True。

method:指定请求使用的方法,例如 GET、POST、PUT 等。

设置Headers(有两种设置方法)
有很多网站为了防止程序爬虫爬网站造成网站瘫痪,会需要携带一些headers头部信息才能访问,最长见的有user-agent参数

  1. import urllib.parse
  2. import urllib.request
  3. import json
  4.  
  5. translation = input('输入要翻译的文字:')
  6. url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
  7.  
  8. 第一种添加请求头部的方式
  9. headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36'}
  10. data = {}
  11. data['i'] = translation
  12. data['doctype'] = 'json'
  13. data = bytes(urllib.parse.urlencode(data),encoding='utf-8')
  14.  
  15. req = urllib.request.Request(url=url, data=data, headers=headers, method='POST')
  16.  
  17. #第二种添加请求头部的方式
  18. #req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36')
  19.  
  20. response = urllib.request.urlopen(req)
  21.  
  22. # response = urllib.request.urlopen(url,data,timeout=,headers=headers,methon='POST') #报错由于urlopen中无headers方法,所有我们采用Request()
  23.  
  24. response_new = response.read().decode('utf-8')
  25.  
  26. response_new_dict = json.loads(response_new) #将str转换为dict
  27.  
  28. print('翻译为:{}'.format(response_new_dict['translateResult'][][]['tgt']))
  29. print(response_new_dict['translateResult'][][]['tgt']) 

代理(使用代理IP,可用多个):

  1. import urllib.request
  2.  
  3. url='http://www.whatismyip.com.tw'
  4.  
  5. iplist=['']#+
  6.  
  7. #proxy_support = urllib.request.ProxyHandler({'http':'196.168.0.100:808'})
  8.  
  9. proxy_support = urllib.request.ProxyHandler({'http':random.choice(iplist)}) #代理第一步
  10.  
  11. opener=urllib.request.build_opener(proxy_support) #代理第二步
  12.  
  13. opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36')]
  14.  
  15. urllib.request.install_opener(opener) #代理第三步
  16.  
  17. response=urllib.request.urlopen(url)
  18. html=response.read().decode('utf-8')
  19. print(html)

睡眠(引入time模块,模仿真实用户):

  1. import urllib.parse
  2. import urllib.request
  3. import json
  4. import time
  5.  
  6. while True:
  7. translation = input('输入要翻译的文字:')
  8. if translation =='q!':#+
  9. break#+
  10. url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
  11. # headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36'}
  12. data = {}
  13. data['i'] = translation
  14. data['doctype'] = 'json'
  15. data = bytes(urllib.parse.urlencode(data),encoding='utf-8')
  16.  
  17. req = urllib.request.Request(url=url, data=data, method='POST')
  18.  
  19. req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36')
  20.  
  21. response = urllib.request.urlopen(req)
  22.  
  23. # response = urllib.request.urlopen(url,data,timeout=,headers=headers,methon='POST')
  24. response_new = response.read().decode('utf-8')
  25. response_new_dict = json.loads(response_new) #将str转换为dict
  26.  
  27. print('翻译为:{}'.format(response_new_dict['translateResult'][][]['tgt']))
  28. print(response_new_dict['translateResult'][][]['tgt'])
  29. time.sleep()#

(3)urllib.request.install_opener(opener

安装一个 OpenerDirector实例作为全球默认的opener 。如果你想让 urlopen 使用这个opener,那么安装一个opener是必要的;否则可以简单地调用OpenerDirector.open()而不是urlopen()。这样代码不会检查一个真实的 OpenerDirector 并且任何类的适当的接口都可以运作。

(4)urllib.request.build_opener([ handler,... ] )

返回一个OpenerDirector实例,它按照给定的顺序链接处理程序。handlers可以是或者是BaseHandler子类的实例BaseHandler(在这种情况下,必须可以在没有任何参数的情况下调用构造函数)。以下类的实例将在前面的处理程序:ProxyHandler(如果检测到代理设置), ,UnknownHandler,HTTPHandler, HTTPDefaultErrorHandler,HTTPRedirectHandler, FTPHandler,。FileHandlerHTTPErrorProcessor

如果Python安装具有SSL支持(即,如果ssl可以导入模块),HTTPSHandler也将添加。

一个BaseHandler子类,还可以改变其handler_order 属性,修改其在处理程序列表中的位置。

(5)urllib.request.pathname2url(path

将路径名路径从路径的本地语法转换为URL路径组件中使用的表单。这不会产生完整的URL。返回值已使用该quote()函数引用。

(6)urllib.request.url2pathname(path

将路径组件路径从百分比编码的URL 转换为路径的本地语法。这不接受完整的URL。此函数用于 unquote()解码路径。

(7)urllib.request.getproxies()

此帮助程序函数返回代理服务器URL映射的方案字典。它<scheme>_proxy首先针对所有操作系统扫描环境中的变量名称(不区分大小写),当它找不到它时,从Mac OS X的Mac OSX系统配置和Windows的Windows系统注册表中查找代理信息。如果小写和大写环境变量都存在(并且不同意),则首选小写。

注意 如果REQUEST_METHOD设置了环境变量(通常表示您的脚本在CGI环境中运行),则将忽略环境变量HTTP_PROXY(大写_PROXY)。这是因为客户端可以使用“Proxy:”HTTP标头注入该变量。如果需要在CGI环境中使用HTTP代理,请ProxyHandler显式使用 ,或确保变量名称为小写(或至少为_proxy后缀)。

2、urllib.error

urllib.error模块定义了引发的异常的异常类urllib.request。基本异常类是URLError。

3、urllib.parse

URL解析功能侧重于将URL字符串拆分为其组件,或者将URL组件组合为URL字符串。

(1)urllib.parse.urlparse

urllib.parse.urlparse(urlstring, scheme=”, allow_fragments=True)

函数用于将一个URL解析成六个部分,返回一个元组,URL的格式为:scheme://netloc/path;parameters?query#fragment;包含六个部分,元组中每一个元素都是一个字符串,可以为空,这六个部分均不能再被分割成更小的部分;

以下为返回的元组元素:

属性

指数

价值,如果不存在

scheme

0

URL方案说明符

方案参数

netloc

1

网络位置部分

空字符串

path

2

分层路径

空字符串

query

3

查询组件

空字符串

fragment

4

片段标识符

空字符串

username

 

用户名

None

password

 

密码

None

hostname

 

主机名(小写)

None

port

 

端口号为整数(如果存在)

None

示例如下:

  1. import urllib.parse
  2.  
  3. print(urllib.parse.urlparse('http://www.baidu.com'))

输出结果:

ParseResult(scheme='http', netloc='www.baidu.com', path='', params='', query='', fragment='')

(2)urllib.parse.parse_qs

urllib.parse.parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding=’utf-8’, errors=’replace’)

这个函数主要用于分析URL中query组件的参数,返回一个key-value对应的字典格式;

示例如下:

  1. import urllib.parse
  2.  
  3. print(urllib.parse.parse_qs("FuncNo=9009001&username=1"))

输出结果:

{'FuncNo': ['9009001'], 'username': ['1']}

(3)urllib.parse.parse_qsl

urllib.parse.parse_qsl(qs, keep_blank_values=False, strict_parsing=False, encoding=’utf-8’, errors=’replace’)

这个函数和urllib.parse.parse_qs()作用一样,唯一的区别就是这个函数返回值是list形式;

示例如下:

  1. import urllib.parse
  2.  
  3. print(urllib.parse.parse_qsl("FuncNo=9009001&username=1"))

输出结果

[('FuncNo', '9009001'), ('username', '1')]

(4)urllib.parse.urlunparse(parts)

这个函数可以将urlparse()分解出来的元组组装成URL;

示例如下:

  1. import urllib.parse
  2.  
  3. parsed=urllib.parse.urlparse("https://www.zhihu.com/question/50056807/answer/223566912")
  4. print(parsed)
  5.  
  6. t=parsed[:]
  7. print(urllib.parse.urlunparse(t))

输出结果:

ParseResult(scheme='https', netloc='www.zhihu.com', path='/question/50056807/answer/223566912', params='', query='', fragment='')

https://www.zhihu.com/question/50056807/answer/223566912

(5) urllib.parse.urlsplit

urllib.parse.urlsplit(urlstring, scheme=”, allow_fragments=True)

这个函数和urlparse()功能类似,唯一的区别是这个函数不会将url中的param分离出来;就是说相比urlparse()少一个param元素,返回的元组元素参照urlparse()的元组表,少了一个param元素;

示例如下:

  1. import urllib.parse
  2.  
  3. print(urllib.parse.urlsplit("https://www.zhihu.com/question/50056807/answer/223566912"))

输出结果:

SplitResult(scheme='https', netloc='www.zhihu.com', path='/question/50056807/answer/223566912', query='', fragment='')

(6)urllib.parse.urlunsplit(parts)

与urlunparse()相似,切与urlsplit()相对应;

示例如下:

  1. import urllib.parse
  2.  
  3. parsed=urllib.parse.urlsplit("https://www.zhihu.com/question/50056807/answer/223566912")
  4. t=parsed[:]
  5. print(urllib.parse.urlunsplit(t))

输出结果:

https://www.zhihu.com/question/50056807/answer/223566912

(7)urllib.parse.urljoin(base, url, allow_fragments=True)

这个函数用于讲一个基本的URL和其他的URL组装成成一个完成的URL;

示例如下:

  1. import urllib.parse
  2.  
  3. print(urllib.parse.urljoin("https://www.baidu.com/Python.html","Java.html")) 

输出结果:

https://www.baidu.com/Java.html

注意:如果URL是一个抽象的URL(例如以“//”或“scheme://”开头),这个URL的主机名或请求标识会自动返回;

示例如下:

  1. import urllib.parse
  2.  
  3. print(urllib.parse.urljoin("https://www.baidu.com/Python.html","//www.zhihu.com/Java.html"))

输出结果:

https://www.zhihu.com/Java.html

(8)urllib.parse.urldefrag(url)

如果URL中包含fragment标识,就会返回一个不带fragment标识的URL,fragment标识会被当成一个分离的字符串返回;如果URL中不包含fragment标识,就会返回一个URL和一个空字符串;

示例如下:

  1. import urllib.parse
  2.  
  3. print(urllib.parse.urldefrag("http://user123:pwd@NetLoc:80/path;param?query=arg#frag"))
  4.  
  5. print(urllib.parse.urldefrag("http://user123:pwd@NetLoc:80/path;param?query=arg"))

输出结果:

DefragResult(url='http://user123:pwd@NetLoc:80/path;param?query=arg', fragment='frag')

DefragResult(url='http://user123:pwd@NetLoc:80/path;param?query=arg', fragment='')

4、urllib.robotparser

此模块提供单个类,RobotFileParser用于回答有关特定用户代理是否可以在发布该robots.txt文件的网站上获取URL的问题。

python模块之urllib的更多相关文章

  1. Python模块学习 --- urllib

    urllib模块提供的上层接口,使我们可以像读取本地文件一样读取www和ftp上的数据.每当使用这个模块的时候,老是会想起公司产品的客户端,同事用C++下载Web上的图片,那种“痛苦”的表情.我以前翻 ...

  2. Python爬虫之urllib模块2

    Python爬虫之urllib模块2 本文来自网友投稿 作者:PG-55,一个待毕业待就业的二流大学生. 看了一下上一节的反馈,有些同学认为这个没什么意义,也有的同学觉得太简单,关于Beautiful ...

  3. Python爬虫之urllib模块1

    Python爬虫之urllib模块1 本文来自网友投稿.作者PG,一个待毕业待就业二流大学生.玄魂工作室未对该文章内容做任何改变. 因为本人一直对推理悬疑比较感兴趣,所以这次爬取的网站也是平时看一些悬 ...

  4. Python模块之requests,urllib和re

    目录 一.爬虫的步骤 二.使用Jupyter 三.爬虫请求模块之urllib 四.爬虫请求模块之requests 五.爬虫分析之re模块 一.爬虫的步骤 1.发起请求,模拟浏览器发送一个http请求 ...

  5. python模块—urllib

    1. 网页操作 urllib.urlopen(url[,data[,proxies]]) 打开一个url,返回一个文件对象,然后可以进行类似文件对象操作 url:远程数据的路径,即网址 data:表示 ...

  6. python模块介绍二。

    全局变量 全局变量 python在一个.py文件内部自动添加了一些全局变量 print(vars()) #查看当前的全局变量 执行结果: {'__package__': None, '__loader ...

  7. python模块使用案例

    python模块使用案例 一.使用MySQLdb模块代码示例: # 导入 MySQLdb模块 import MySQLdb # 和服务器建立链接,host是服务器ip,我的MySQL数据库搭建在本机, ...

  8. python模块基础之json,requeste,xml,configparser,logging,subprocess,shutil。

    1.json模块 json     用于[字符串]和 [python基本数据类型] 间进行转换(可用于不同语言之前转换),json.loads,将字符串转成python的基本数据类型,json.dum ...

  9. python模块介绍- multi-mechanize 性能测试工具

    python模块介绍- multi-mechanize 性能测试工具 2013-09-13 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 3739 ...

随机推荐

  1. 使用Get进行Http通信

    --------------siwuxie095 有道翻译官网:http://fanyi.youdao.com/ 找到官网页面下方的 有道翻译API,选择 调用数据接口,申请一个 key (申请内容可 ...

  2. PHP算法

    一,实现快速排序 <?php function quickSort($arr) { $len=count($arr) ; if($len<=1) { return $arr; } $key ...

  3. 基于R语言的RRT算法效率统计

  4. 项目一:第十三天 1、菜单数据管理 2、权限数据管理 3、角色数据管理 4、用户数据管理 5、在realm中动态查询用户权限,角色 6、Shiro中整合ehcache缓存权限数据

    1 课程计划 菜单数据管理 权限数据管理 角色数据管理 用户数据管理 在realm中动态查询用户权限,角色 Shiro中整合ehcache缓存权限数据         2 菜单数据添加 2.1 使用c ...

  5. 业务逻辑:五、完成认证用户的动态授权功能 六、完成Shiro整合Ehcache缓存权限数据

    一. 完成认证用户的动态授权功能 提示:根据当前认证用户查询数据库,获取其对应的权限,为其授权 操作步骤: 在realm的授权方法中通过使用principals对象获取到当前登录用户 创建一个授权信息 ...

  6. 前端学习笔记2017.6.12 DIV布局网页

    DIV的功能就是把网页划分成逻辑块的. 看下豆瓣东西页面的布局,我们来分析下. 按照先从上到下的原则,把这个页面分成几个块: 首先是最顶端的这个条,这是一个DIV,我们给它起个名字,叫banner 然 ...

  7. VMware内部错误解决办法

    虚拟机内部错误,不要担心不是致命错误,往往是由于你的配置被禁用了或者VMware运行权限不够导致 检查你的VMware虚拟网卡是否被禁用 检查你的VMware的运行权限,直接管理员运行就够够的了

  8. Effective Objective-C [上]

    网上看到的 http://esoftmobile.com/2013/08/10/effective-objective-c/ 本文是针对<Effective Objective-C>一书的 ...

  9. Linux 终端命令行提示符的艺术--PS1进阶

    话不多说,先瞅瞅我的命令行提示符(有点大): 图中命令行解释:┌[阳历日期/农历日期 时间]├[当前目录下目录数+当前目录下文件数][当前绝对目录]└[用户名@主机名-第几个终端 ╰_╯] 相关配置文 ...

  10. TinkerPop中的遍历:图的遍历步骤(2/3)

    24 Group Step 有时,所运行的实际路径或当前运行位置不是计算的最终输出,而是遍历的一些其他表示.group()步骤(map / sideEffect)是根据对象的某些功能组织对象的一个方法 ...