Python3学习urllib的使用方法示例
urllib是python的一个获取url(UniformResourceLocators,统一资源定址符)了,可以利用它来抓取远程的数据进行保存,本文整理了一些关于urllib使用中的一些关于header,代理,超时,认证,异常处理处理方法。
1.基本方法
urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)
- url: 需要打开的网址
- data:Post提交的数据
- timeout:设置网站的访问超时时间
直接用urllib.request模块的urlopen()获取页面,page的数据格式为bytes类型,需要decode()解码,转换成str类型。
fromurllibimportrequest response=request.urlopen(r'http://python.org/')#HTTPResponse类型 page=response.read() page=page.decode('utf-8')
urlopen返回对象提供方法:
- read(),readline(),readlines(),fileno(),close():对HTTPResponse类型数据进行操作
- info():返回HTTPMessage对象,表示远程服务器返回的头信息
- getcode():返回Http状态码。如果是http请求,200请求成功完成;404网址未找到
- geturl():返回请求的url
1、简单读取网页信息
importurllib.request response=urllib.request.urlopen('http://python.org/') html=response.read()
2、使用request
urllib.request.Request(url,data=None,headers={},method=None)
使用request()来包装请求,再通过urlopen()获取页面。
importurllib.request req=urllib.request.Request('http://python.org/') response=urllib.request.urlopen(req) the_page=response.read()
3、发送数据,以登录知乎为例
''''' Createdon2016年5月31日 @author:gionee ''' importgzip importre importurllib.request importurllib.parse importhttp.cookiejar defungzip(data): try: print("尝试解压缩...") data=gzip.decompress(data) print("解压完毕") except: print("未经压缩,无需解压") returndata defgetXSRF(data): cer=re.compile('name=\"_xsrf\"value=\"(.*)\"',flags=0) strlist=cer.findall(data) returnstrlist[0] defgetOpener(head): #cookies处理 cj=http.cookiejar.CookieJar() pro=urllib.request.HTTPCookieProcessor(cj) opener=urllib.request.build_opener(pro) header=[] forkey,valueinhead.items(): elem=(key,value) header.append(elem) opener.addheaders=header returnopener #header信息可以通过firebug获得 header={ 'Connection':'Keep-Alive', 'Accept':'text/html,application/xhtml+xml,*/*', 'Accept-Language':'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3', 'User-Agent':'Mozilla/5.0(WindowsNT6.1;WOW64;rv:46.0)Gecko/20100101Firefox/46.0', 'Accept-Encoding':'gzip,deflate', 'Host':'www.zhihu.com', 'DNT':'1' } url='http://www.zhihu.com/' opener=getOpener(header) op=opener.open(url) data=op.read() data=ungzip(data) _xsrf=getXSRF(data.decode()) url+="login/email" email="登录账号" password="登录密码" postDict={ '_xsrf':_xsrf, 'email':email, 'password':password, 'rememberme':'y' } postData=urllib.parse.urlencode(postDict).encode() op=opener.open(url,postData) data=op.read() data=ungzip(data) print(data.decode())
4、http错误
importurllib.request req=urllib.request.Request('http://www.lz881228.blog.163.com') try: urllib.request.urlopen(req) excepturllib.error.HTTPErrorase: print(e.code) print(e.read().decode("utf8"))
5、异常处理
fromurllib.requestimportRequest,urlopen fromurllib.errorimportURLError,HTTPError req=Request("http://www.abc.com/") try: response=urlopen(req) exceptHTTPErrorase: print('Theservercouldn'tfulfilltherequest.') print('Errorcode:',e.code) exceptURLErrorase: print('Wefailedtoreachaserver.') print('Reason:',e.reason) else: print("good!") print(response.read().decode("utf8"))
6、http认证
importurllib.request #createapasswordmanager password_mgr=urllib.request.HTTPPasswordMgrWithDefaultRealm() #Addtheusernameandpassword. #Ifweknewtherealm,wecoulduseitinsteadofNone. top_level_url="https://www.nhooo.com/" password_mgr.add_password(None,top_level_url,'rekfan','xxxxxx') handler=urllib.request.HTTPBasicAuthHandler(password_mgr) #create"opener"(OpenerDirectorinstance) opener=urllib.request.build_opener(handler) #usetheopenertofetchaURL a_url="https://www.nhooo.com/" x=opener.open(a_url) print(x.read()) #Installtheopener. #Nowallcallstourllib.request.urlopenuseouropener. urllib.request.install_opener(opener) a=urllib.request.urlopen(a_url).read().decode('utf8') print(a)
7、使用代理
importurllib.request proxy_support=urllib.request.ProxyHandler({'sock5':'localhost:1080'}) opener=urllib.request.build_opener(proxy_support) urllib.request.install_opener(opener) a=urllib.request.urlopen("http://www.baidu.com").read().decode("utf8") print(a)
8、超时
importsocket importurllib.request #timeoutinseconds timeout=2 socket.setdefaulttimeout(timeout) #thiscalltourllib.request.urlopennowusesthedefaulttimeout #wehavesetinthesocketmodule req=urllib.request.Request('https://www.nhooo.com/') a=urllib.request.urlopen(req).read() print(a)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。