Urllib模块
1、模块说明:
Urllib库是Python中的一个功能强大、用于操作的URL,并在做爬虫的时候经常要用到的库。在Python2.X中,分Urllib库和Urllib库,Python3.X之后合并到Urllib库中,使用方法稍有不同,在此,本书中代码会以Python的新版,即Python3.X进行讲解,具体使用的是Python3.5.2。同时在本章中,我还会讲解如何处理异常等知识。
2、快速使用Urllib爬去网页:
导入对应的模块,读取网页内容
# 导入模块urllib import urllib.request file = urllib.request.urlopen("http://www.baidu.com") # 打开网页 data = file.read() # 读取所有页面所有内容 dataline = file.readline() # 读取第一行 datalines = file.readlines() # 读取所有内容,列表形式存储,不推荐用此 # 存储文件 fhandle = open("baidu.html","wb") # 爬到的页面存储到本地 fhandle.write(data) fhandle.close() # 直接把网页存储到本地,适用于存储图片 urllib.request.urlretrieve(url="https://www.cnblogs.com/",filename="cnblogs.html") urllib.request.urlcleanup() # urlretrieve执行后会产生一些缓存,清除 # 其他使用 print(file.info()) # 爬取页面的相关信息 print(file.getcode()) # 打印网页的状态码 print(file.geturl()) # 当前url # 200 # http://www.baidu.com
网页的编码和解码(中文字符要进行编码):
# 编码、解码 import urllib.request url_quote = urllib.request.quote("http://www.sina.com.cn") print(url_quote) # http%3A//www.sina.com.cn url_unquote = urllib.request.unquote(url_quote) print(url_unquote) # http://www.sina.com.cn
3、添加Headers属性:
# 添加报头 import urllib.request url = 'http://blog.csdn.net/weiwei_pig/article/details/51178226' req = urllib.request.Request(url) req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36') data = urllib.request.urlopen(req).read()
4、设置超时时间:
# 超时时间 import urllib.request import logging for i in range(1,100): try: file = urllib.request.urlopen("http://www.baidu.com",timeout=1) data = file.read() print(len(data)) except Exception as e: logging.error(e)
5、Post提交数据:
# post 提交 import urllib.request import urllib.parse url = "http://www.iqianyue.com/mypost" postdata = urllib.parse.urlencode({ "name":"ceo@iqianyue.com", "pass":"aA123456" }).encode("utf-8") # 转化成byte类型 req = urllib.request.Request(url,postdata) req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36') data = urllib.request.urlopen(req) print(data.getcode()) # 200
6、代理服务器的设置:
有时候同一个IP去爬取同一个网站上的页面,久了之后就会被网站屏蔽,这时就需要代理服务器了,可以从http://www.xicidaili.com/网站上去找代理服务器地址:
代码示例:
# 匿名代理 def urs_proxy(proxy_addr,url): import urllib.request proxy = urllib.request.ProxyHandler({'http':proxy_addr}) opener = urllib.request.build_opener(proxy,urllib.request.HTTPHandler) urllib.request.install_opener(opener) data = urllib.request.urlopen(url).read().decode('utf-8') return data proxy_addr = "182.92.242.11:80" data = urs_proxy(proxy_addr,"https://www.cnblogs.com/") print(len(data)) # 39244
7、异常处理URLError
# 异常处理 import urllib.request import urllib.error try: urllib.request.urlopen("http://www.githup.com") except urllib.error.HTTPError as e: print(e.code) print(e.reason) print(e) # 403 # Forbidden # HTTP Error 403: Forbidden
8、处理url
import urlparse #python2 base_url = "http://192.168.1.66:8088" split = urlparse.urlsplit(base_url) print(split) # SplitResult(scheme='http', netloc='192.168.1.66:8088', path='', query='', fragment='')