当前位置: 首页 > 科技观察

一篇文章带你玩转Python中的urllib库(操作URL)

时间:2023-03-12 11:05:29 科技观察

大家好,我是围棋进阶。1、操作URLurllib提供了一系列操作URL的函数。对相关内容进行分类。2.get()urllib的请求模块可以很方便的抓取URL内容,即向指定页面发送GET请求,然后返回HTTP响应:例如对于豆瓣URLhttps://api.growingio.com/v2/22c937bbd8ebd703f2d8e9445f7dfd03/web/pv?stm=1593747087078进行抓取,并返回响应:fromurllibimportrequestwithrequest.urlopen('https://api.growingio.com/v2/22c937bbd8ebd703f2d8e9445f7dfd03/web/pv?stm=1593747087078')asf:data=f.read()print('Status:',f.status,f.reason)fork,vinf.getheaders():print('%s:%s'%(k,v))print('data:',data.decode('utf-8'))可以看到HTTP响应的header和JSON数据:如果要模拟浏览器发送GET请求,需要使用Request对象,通过添加将HTTP标头添加到Request对象,您可以将请求伪装成浏览器。例如模拟iPhone6请求豆瓣首页:fromurllibimportrequestreq=request.Request('http://www.douban.com/')req.add_header('User-Agent','Mozilla/6.0(iPhone;CPUiPhoneOS8_0likeMacOSX)AppleWebKit/536.26(KHTML,likeGecko)Version/8.0Mobile/10A5376eSafari/8536.25')withrequest.urlopen(req)asf:print('Status:',f.status,f.reason)fork,vinf.getheaders():print('%s:%s'%(k,v))print('Data:',f.read().decode('utf-8'))豆瓣会返回适合iPhone的手机网页:3.Post()如果想以POST方式发送请求,只需要以字节形式传入参数数据即可。模拟一个微博登录,先读取登录邮箱和密码,然后按照weibo.cn登录页面的格式传入username=xxx&password=xxx的格式:fromurllibimportrequest,parseprint('Logintoweibo.cn...')#emailemail=input('Email:')#passwordpasswd=input('Password:')#相关参数login_data=parse.urlencode([('username',email),('password',passwd),('entry','mweibo'),('client_id',''),('savestate','1'),('ec',''),('pagerefer','https://passport.weibo.cn/signin/welcome?entry=mweibo&r=http%3A%2F%2Fm.weibo.cn%2F')])#URL请求req=request.Request('https://passport.weibo.cn/sso/login')req.add_header('Origin','https://passport.weibo.cn')#构造User-Agentreq.add_header('User-Agent','Mozilla/6.0(iPhone;CPUiPhoneOS8_0likeMacOSX)AppleWebKit/536.26(KHTML,likeGecko)Version/8.0Mobile/10A5376eSafari/8536.25')req.add_header('Referer','https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=http%3A%2F%2Fm.weibo.cn%2F')withrequest.urlopen(req,data=login_data.encode('utf-8'))asf:print('Status:',f.status,f.reason)fork,vinf。getheaders():print('%s:%s'%(k,v))print('Data:',f.read().decode('utf-8'))如果登录成功,得到的响应如下:如果登录失败,得到的响应如下:4.如果Handler需要更复杂的控制,比如通过Proxy访问网站,则需要通过ProxyHandler进行处理。示例代码如下:importurllib.request#构造了两个代理Handler,一个有代理IP,一个没有代理IPhttpproxy_handler=urllib.request.ProxyHandler({"https":"27.191.234.69:9999"})nullproxy_handler=urllib.request.ProxyHandler({})#定义一个代理开关proxySwitch=True#通过urllib.request.build_opener()方法使用这些代理Handler对象来创建一个自定义的opener对象#根据代理开关是否开启,使用不同的代理模式ifproxySwitch:opener=urllib.request.build_opener(httpproxy_handler)else:opener=urllib.request.build_opener(nullproxy_handler)request=urllib.request.Request("http://www.baidu.com/")#1.如果这样写,在使用自定义代理之前只使用opener.open()方法发送请求,而urlopen()不使用自定义代理response=opener.open(request)#2。这样写的话,opener会被全局应用,之后所有的请求,无论是opener.open()还是urlopen(),都会使用自定义代理。#urllib.request.install_opener(opener)#response=urllib.request.urlopen(request)#获取服务器响应内容html=response.read().decode("utf-8")#打印结果print(html)ifagent成功返回URL信息。如果网址错误或代理地址错误,则返回如下界面。5.总结使用Python语言可以帮助大家更好的学习Python。urllib提供的功能是使用程序执行各种HTTP请求。如果要模拟浏览器来完成特定的功能,就需要将请求伪装成浏览器。伪装的方法是先监听浏览器发送的请求,然后根据浏览器的请求头进行伪装。User-Agent标头用于识别浏览器。