源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2021-07-11 23:49 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Python2/3中urllib库的一些常见用法
[b]什么是Urllib库[/b] Urllib是Python提供的一个用于操作URL的模块,我们爬取网页的时候,经常需要用到这个库。 升级合并后,模块中的包的位置变化的地方较多。 [b]urllib库对照速查表 [/b]

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第三方库,同样的库还有[url=http://docs.python-requests.org/zh_CN/latest/user/quickstart.html]requests[/url]、[url=https://github.com/httplib2/httplib2]httplib2[/url]。 在Python2.X中,分urllib和urllib2,但在Python3.X中,都统一合并到urllib中。通过上表可以看到其中常见的变动,依据该变动可快速写出相应版本的python程序。 相对来说,Python3.X对中文的支持比Python2.X友好,所以该博客接下来通过Python3.X来介绍urllib库的一些常见用法。 [b]发送请求[/b]
import urllib.request
r = urllib.request.urlopen([url=http://www.python.org/]http://www.python.org/[/url])
首先导入[code]urllib.request[/code]模块,使用[code]urlopen()[/code]对参数中的URL发送请求,返回一个[code]http.client.HTTPResponse[/code]对象。 在[code]urlopen()[/code]中,使用timeout字段,可设定相应的秒数时间之后停止等待响应。除此之外,还可使用[code]r.info() [/code]、[code]r.getcode()[/code] 、[code]r.geturl()[/code]获取相应的当前环境信息、状态码、当前网页URL。 [b]读取响应内容[/b]
import urllib.request
url = "http://www.python.org/"
with urllib.request.urlopen(url) as r:
 r.read()
使用[code]r.read()[/code]读取响应内容到内存,该内容为网页的源代码(可用相应的浏览器“查看网页源代码”功能看到),并可对返回的字符串进行相应解码[code]decode() [/code]。 [b]传递URL参数 [/b]
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)
以字符串字典的形式,通过[code]urlencode()[/code]编码,为URL的查询字符串传递数据, 编码后的params为字符串,字典每项键值对以'&'连接:[code]'q=urllib&check_keywords=yes&area=default'[/code] 构建后的URL:https://docs.python.org/3/search.html?q=urllib&check_keywords=yes&area=default 当然,[code]urlopen()[/code]支持直接构建的URL,简单的get请求可以不通过[code]urlencode()[/code]编码,手动构建后直接请求。上述方法使代码模块化,更优雅。 [b]传递中文参数[/b]
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中请求,会导致编码错误。我们需要使用[code]quote()[/code] ,对该中文关键字进行URL编码,相应的可以使用[code]unquote()[/code]进行解码。 [b]定制请求头[/b]
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为副版本号。所以,我们需要通过[code]urllib.request.Request()[/code]构建Request对象,传入字典形式的Headers属性,模拟浏览器。 相应的Headers信息,可通过浏览器的开发者调试工具,”检查“功能的”Network“标签查看相应的网页得到,或使用抓包分析软件Fiddler、Wireshark。 除上述方法外,还可以使用[code]urllib.request.build_opener()[/code]或[code]req.add_header()[/code]定制请求头,详见官方样例。 在Python2.X中,urllib模块和urllib2模块通常一起使用,因为[code]urllib.urlencode()[/code]可以对URL参数进行编码,而[code]urllib2.Request()[/code]可以构建Request对象,定制请求头,然后统一使用[code]urllib2.urlopen()[/code]发送请求。 [b]传递POST请求 [/b]
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,使用[code]urlencode()[/code]进行编码处理,返回字符串,再指定'utf-8'的编码格式,这是因为POSTdata只能是bytes或着file object。最后通过[code]Request()[/code]对象传递postdata,使用[code]urlopen()[/code]发送请求。 [b]下载远程数据到本地 [/b]
import urllib.request
url = "https://www.python.org/static/img/python-logo.png"
urllib.request.urlretrieve(url, "python-logo.png")
爬取图片、视频等远程数据时,可使用[code]urlretrieve()[/code]下载到本地。 第一个参数为要下载的url,第二个参数为下载后的存放路径。 该样例下载python官网logo到当前目录下,返回元组(filename, headers)。 [b]设置代理IP [/b]
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,构建[code]ProxyHandler()[/code]对象,将'http'和代理IP以字典形式作为参数传入,设置代理服务器信息。再构建opener对象,将proxy和HTTPHandler类传入。通过[code]installl_opener()[/code]将opener设置成全局,当用[code]urlopen()[/code]发送请求时,会使用之前设置的信息来发送相应的请求。 [b]异常处理 [/b]
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相关异常。导入[code]urllib.error[/code],捕获URLError异常后,因为只有发生HTTPError异常(URLError子类)时,才会有异常状态码e.code,所以需要判断异常是否有属性code。 [b]Cookie的使用[/b]
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来保持登录状态,而不用每次都通过提交表单来登录。 首先,构建[code]CookieJar()[/code]对象cjar,再使用[code]HTTPCookieProcessor()[/code]处理器,处理cjar,并通过[code]build_opener()[/code]构建opener对象,设置成全局,通过[code]urlopen()[/code]发送请求。 [b]总结[/b] 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程素材网的支持。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部