Python2/3中urllib库的一些常见用法


Posted in Python onDecember 19, 2017

什么是Urllib库

Urllib是Python提供的一个用于操作URL的模块,我们爬取网页的时候,经常需要用到这个库。

升级合并后,模块中的包的位置变化的地方较多。

urllib库对照速查表

Python2.X Python3.X
urllib urllib.request, urllib.error, urllib.parse
urllib2 urllib.request, urllib.error
urllib2.urlopen urllib.request.urlopen
urllib.urlencode urllib.parse.urlencode
urllib.quote urllib.request.quote
urllib2.Request urllib.request.Request
urlparse urllib.parse
urllib.urlretrieve urllib.request.urlretrieve
urllib2.URLError urllib.error.URLError
cookielib.CookieJar http.CookieJar

urllib库是用于操作URL,爬取页面的python第三方库,同样的库还有requests、httplib2。

在Python2.X中,分urllib和urllib2,但在Python3.X中,都统一合并到urllib中。通过上表可以看到其中常见的变动,依据该变动可快速写出相应版本的python程序。

相对来说,Python3.X对中文的支持比Python2.X友好,所以该博客接下来通过Python3.X来介绍urllib库的一些常见用法。

发送请求

import urllib.request
r = urllib.request.urlopen(http://www.python.org/)

首先导入urllib.request模块,使用urlopen()对参数中的URL发送请求,返回一个http.client.HTTPResponse对象。

urlopen()中,使用timeout字段,可设定相应的秒数时间之后停止等待响应。除此之外,还可使用r.info() r.getcode()r.geturl()获取相应的当前环境信息、状态码、当前网页URL。

读取响应内容

import urllib.request
url = "http://www.python.org/"
with urllib.request.urlopen(url) as r:
 r.read()

使用r.read()读取响应内容到内存,该内容为网页的源代码(可用相应的浏览器“查看网页源代码”功能看到),并可对返回的字符串进行相应解码decode()

传递URL参数

import urllib.request
import urllib.parse
params = urllib.parse.urlencode({'q': 'urllib', 'check_keywords': 'yes', 'area': 'default'})
url = "https://docs.python.org/3/search.html?{}".format(params)
r = urllib.request.urlopen(url)

以字符串字典的形式,通过urlencode()编码,为URL的查询字符串传递数据,

编码后的params为字符串,字典每项键值对以'&'连接:'q=urllib&check_keywords=yes&area=default'

构建后的URL:https://docs.python.org/3/search.html?q=urllib&check_keywords=yes&area=default

当然,urlopen()支持直接构建的URL,简单的get请求可以不通过urlencode()编码,手动构建后直接请求。上述方法使代码模块化,更优雅。

传递中文参数

import urllib.request
searchword = urllib.request.quote(input("请输入要查询的关键字:"))
url = "https://cn.bing.com/images/async?q={}&first=0&mmasync=1".format(searchword)
r = urllib.request.urlopen(url)

该URL是利用bing图片接口,查询关键字q的图片。如果直接将中文传入URL中请求,会导致编码错误。我们需要使用quote() ,对该中文关键字进行URL编码,相应的可以使用unquote()进行解码。

定制请求头

import urllib.request
url = 'https://docs.python.org/3/library/urllib.request.html'
headers = {
 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',
 'Referer': 'https://docs.python.org/3/library/urllib.html'
}
req = urllib.request.Request(url, headers=headers)
r = urllib.request.urlopen(req)

有时爬取一些网页时,会出现403错误(Forbidden),即禁止访问。这是因为网站服务器对访问者的Headers属性进行身份验证,例如:通过urllib库发送的请求,默认以”Python-urllib/X.Y”作为User-Agent,其中X为Python的主版本号,Y为副版本号。所以,我们需要通过urllib.request.Request()构建Request对象,传入字典形式的Headers属性,模拟浏览器。

相应的Headers信息,可通过浏览器的开发者调试工具,”检查“功能的”Network“标签查看相应的网页得到,或使用抓包分析软件Fiddler、Wireshark。

除上述方法外,还可以使用urllib.request.build_opener()req.add_header()定制请求头,详见官方样例。

在Python2.X中,urllib模块和urllib2模块通常一起使用,因为urllib.urlencode()可以对URL参数进行编码,而urllib2.Request()可以构建Request对象,定制请求头,然后统一使用urllib2.urlopen()发送请求。

传递POST请求

import urllib.request
import urllib.parse
url = 'https://passport.cnblogs.com/user/signin?'
post = {
 'username': 'xxx',
 'password': 'xxxx'
}
postdata = urllib.parse.urlencode(post).encode('utf-8')
req = urllib.request.Request(url, postdata)
r = urllib.request.urlopen(req)

我们在进行注册、登录等操作时,会通过POST表单传递信息。

这时,我们需要分析页面结构,构建表单数据post,使用urlencode()进行编码处理,返回字符串,再指定'utf-8'的编码格式,这是因为POSTdata只能是bytes或着file object。最后通过Request()对象传递postdata,使用urlopen()发送请求。

下载远程数据到本地

import urllib.request
url = "https://www.python.org/static/img/python-logo.png"
urllib.request.urlretrieve(url, "python-logo.png")

爬取图片、视频等远程数据时,可使用urlretrieve()下载到本地。

第一个参数为要下载的url,第二个参数为下载后的存放路径。

该样例下载python官网logo到当前目录下,返回元组(filename, headers)。

设置代理IP

import urllib.request
url = "https://www.cnblogs.com/"
proxy_ip = "180.106.16.132:8118"
proxy = urllib.request.ProxyHandler({'http': proxy_ip})
opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler)
urllib.request.install_opener(opener)
r = urllib.request.urlopen(url)

有时频繁的爬取一个网页,会被网站服务器屏蔽IP。这时,可通过上述方法设置代理IP。

首先,通过网上代理IP的网站找一个可以用的IP,构建ProxyHandler()对象,将'http'和代理IP以字典形式作为参数传入,设置代理服务器信息。再构建opener对象,将proxy和HTTPHandler类传入。通过installl_opener()将opener设置成全局,当用urlopen()发送请求时,会使用之前设置的信息来发送相应的请求。

异常处理

import urllib.request
import urllib.error
url = "http://www.balabalabala.org"
try:
 r = urllib.request.urlopen(url)
except urllib.error.URLError as e:
 if hasattr(e, 'code'):
  print(e.code)
 if hasattr(e, 'reason'):
  print(e.reason)

可以使用URLError类,处理一些URL相关异常。导入urllib.error,捕获URLError异常后,因为只有发生HTTPError异常(URLError子类)时,才会有异常状态码e.code,所以需要判断异常是否有属性code。

Cookie的使用

import urllib.request
import http.cookiejar
url = "http://www.balabalabala.org/"
cjar = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))
urllib.request.install_opener(opener)
r = urllib.request.urlopen(url)

通过无状态协议HTTP访问网页时,Cookie维持会话间的状态。例如:有些网站需要登录操作,第一次可通过提交POST表单来登录,当爬取该网站下的其它站点时,可以使用Cookie来保持登录状态,而不用每次都通过提交表单来登录。

首先,构建CookieJar()对象cjar,再使用HTTPCookieProcessor()处理器,处理cjar,并通过build_opener()构建opener对象,设置成全局,通过urlopen()发送请求。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
Sep 06 Python
Python实现list反转实例汇总
Nov 11 Python
在Python的Django框架中实现Hacker News的一些功能
Apr 17 Python
初步剖析C语言编程中的结构体
Jan 16 Python
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
Nov 24 Python
Python 3.3实现计算两个日期间隔秒数/天数的方法示例
Jan 07 Python
Python3 文章标题关键字提取的例子
Aug 26 Python
pytorch实现focal loss的两种方式小结
Jan 02 Python
如何基于python实现画不同品种的樱花树
Jan 03 Python
pycharm激活码快速激活及使用步骤
Mar 12 Python
Spring @Enable模块驱动原理及使用实例
Jun 23 Python
python数据分析之单因素分析线性拟合及地理编码
Jun 25 Python
Python与人工神经网络:使用神经网络识别手写图像介绍
Dec 19 #Python
Python random模块用法解析及简单示例
Dec 18 #Python
Python方法的延迟加载的示例代码
Dec 18 #Python
Python字符串拼接六种方法介绍
Dec 18 #Python
Python Socket使用实例
Dec 18 #Python
浅谈python数据类型及类型转换
Dec 18 #Python
Python字典,函数,全局变量代码解析
Dec 18 #Python
You might like
php操作csv文件代码实例汇总
2014/09/22 PHP
thinkphp在低版本Nginx 下支持PATHINFO的方法分享
2016/05/27 PHP
php实时倒计时功能实现方法详解
2017/02/27 PHP
PHP 99乘法表的几种实现代码
2020/10/13 PHP
javascript实现倒计时并弹窗提示特效
2015/06/05 Javascript
jQuery实现简单下拉导航效果
2015/09/07 Javascript
JS常用正则表达式总结【经典】
2017/05/12 Javascript
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
详解Webpack+Babel+React开发环境的搭建的方法步骤
2018/01/09 Javascript
官方推荐react-navigation的具体使用详解
2018/05/08 Javascript
vue项目部署到Apache服务器中遇到的问题解决
2018/08/24 Javascript
vue template中slot-scope/scope的使用方法
2018/09/06 Javascript
vue-music 使用better-scroll遇到轮播图不能自动轮播问题
2018/12/03 Javascript
node.js使用fs读取文件出错的解决方案
2019/10/23 Javascript
微信小程序点击item使之滚动到屏幕中间位置
2020/03/25 Javascript
mapboxgl区划标签避让不遮盖实现的代码详解
2020/07/01 Javascript
解决Echarts 显示隐藏后宽度高度变小的问题
2020/07/19 Javascript
vue中解决拖拽改变存在iframe的div大小时卡顿问题
2020/07/22 Javascript
Python实现从订阅源下载图片的方法
2015/03/11 Python
Python操作列表之List.insert()方法的使用
2015/05/20 Python
python常用函数详解
2016/09/13 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
2018/07/27 Python
使用python实现unix2dos和dos2unix命令的例子
2019/08/13 Python
Win10 安装PyCharm2019.1.1(图文教程)
2019/09/29 Python
python中Django文件上传方法详解
2020/08/05 Python
CSS3 开发工具收集
2010/04/17 HTML / CSS
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
英国设计的甲板鞋和船鞋:Chatham
2018/12/06 全球购物
测量实习生自我鉴定
2013/09/19 职场文书
大学自我鉴定
2013/12/20 职场文书
好矿嫂事迹材料
2014/01/21 职场文书
教师开学感言
2014/02/14 职场文书
关于保护环境的标语
2014/06/09 职场文书
向国旗敬礼活动总结
2014/09/27 职场文书
2014年纳税评估工作总结
2014/12/23 职场文书
三年级作文之小小梦想
2019/12/06 职场文书