Python2/3中urllib库的一些常见用法
什么是Urllib库 Urllib是Python提供的一个用于操作URL的模块,我们爬取网页的时候,经常需要用到这个库。 升级合并后,模块中的包的位置变化的地方较多。 urllib库对照速查表
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/) 首先导入 在 读取响应内容 import urllib.request url = "http://www.python.org/" with urllib.request.urlopen(url) as r: r.read() 使用 传递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) 以字符串字典的形式,通过 编码后的params为字符串,字典每项键值对以'&'连接: 构建后的URL:https://docs.python.org/3/search.html?q=urllib&check_keywords=yes&area=default 当然, 传递中文参数 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中请求,会导致编码错误。我们需要使用 定制请求头 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为副版本号。所以,我们需要通过 相应的Headers信息,可通过浏览器的开发者调试工具,”检查“功能的”Network“标签查看相应的网页得到,或使用抓包分析软件Fiddler、Wireshark。 除上述方法外,还可以使用 在Python2.X中,urllib模块和urllib2模块通常一起使用,因为 传递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,使用 下载远程数据到本地 import urllib.request url = "https://www.python.org/static/img/python-logo.png" urllib.request.urlretrieve(url,"python-logo.png") 爬取图片、视频等远程数据时,可使用 第一个参数为要下载的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,构建 异常处理 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相关异常。导入 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来保持登录状态,而不用每次都通过提交表单来登录。 首先,构建 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程小技巧的支持。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |