Python2/3中urllib库的一些常见用法
作者:sherlockChen 发布时间:2023-11-05 00:24:04
什么是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)。
设置 *
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,构建ProxyHandler()
对象,将'http'和 * 以字典形式作为参数传入,设置代理服务器信息。再构建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()
发送请求。
来源:http://www.cnblogs.com/sherlockChen/p/8062717.html
猜你喜欢
- 关于mysql数据库在Linux下的应用一直以来都是我认为比较棘手的,这次通过搭建Linux学习环境顺便研究和学习Mysql数据库在Linu
- 1. 相对与比较老的环境,建议使用第二个 set dbconnection=Server.CREATEOBJECT("ADODB.
- 1.什么是labelpandas处理数据时,我们会经常看到dataframe结构使用loc, iloc, ix等方法。那么这些方法到底有啥区
- 我们现在使用的验证手段都是以验证码为主,让用户根据图片输入验证字符,这种方法的安全度尚可,但会给用户带来一些不便和困扰,比如这个雅虎的验证码
- 1.为什么需要创建虚拟环境?虚拟环境是隔离应用确切依赖项的好办法。此类隔离避免了全局 Python 环境中的冲突,有助于进行测试和协作。随着
- 关于“登录”和“注册”的问题已经被很多设计师和交互设计上写过无数遍了,今天我在登录纳米盘网站时受到打击了所以写下此文。事情是这样的:当初租用
- 作为抛砖引玉,用python3实现百度云语音解析,首先需要模拟Post请求把音频压缩文件丢给百度解析。但是遇到一个问题客户端怎麽丢数据都是返
- 代码: <?php $page=$_GET['page']; include($page.'php')
- 本文实例讲述了Python 函数用法。分享给大家供大家参考,具体如下:demo.py(函数定义):# say_hello() # 不能在定义
- 接口测试中,上传文件的测试场景非常常见。例如:上传头像(图片)、上传文件、上传视频等。下面以一个上传图片的例子为大家讲解如何通过 pytho
- 一、线程队列queue队列:使用方法同进程的Queue一样如果必须在多个线程之间安全地交换信息时,队列在线程编程中尤其有用。重要:q.put
- 最近用Python写了个 * ,需要部署到Linux环境的服务器上,由于之前本地开发时使用virtualenv,使用这个虚拟环境有个好处是项目
- 前言在Python的世界里,将一个对象以json格式进行序列化或反序列化一直是一个问题。Python标准库里面提供了json序列化的工具,我
- 这是一个很和谐很实用的网站管理程序,和我以前介绍的服务器管理程序不同的是,这个程序只有一个功能,就是实现远程Web方式删除文件(实际上是重命
- SQL Server 2005数据库中增加了XML类型,在创建表的时候可以指定某一列为XML类型,示例如下:CREATE TABL
- 最简单的:<textarea name="A" cols="45" rows="2&
- 下面这段代码,你知道有哪些错误吗:var g_bar = "bar";function foo(container, c
- 1.连接本机数据库 A. 本机若有静态IP,oracle安装好后,就能连接本机oracle数据库。 B. 安装oracle时,本机没有静态I
- 一.图像掩膜直方图如果要统计图像的某一部分直方图,就需要使用掩码(蒙板)来进行计算。假设将要统计的部分设置为白色,其余部分设置为黑色,然后使
- 本文实例讲述了python简单猜数游戏。分享给大家供大家参考。具体实现方法如下:#!/usr/bin/env pythonimport ra