Python使用urllib或requests访问网络资源
off999 2024-11-25 15:51 24 浏览 0 评论
Python 访问网络资源有很多方法,urllib, urllib2, urllib3, httplib, httplib2, requests ,现介绍如下两种方法:
- 内置的 urllib 模块优点:自带模块,无需额外下载第三方库缺点:操作繁琐,缺少高级功能
- 第三方库 requests优点:处理URL资源特别方便缺点:需要下载安装第三方库
内置的 urllib 模块
发起GET请求
主要使用urlopen()方法来发起请求,如下:
from urllib import request
resp = request.urlopen('http://www.baidu.com')
print(resp.read().decode())访问的结果会是一 个http.client.HTTPResponse 对象,使用此对象的 read() 方法,则可以获取访问网页获得的数据。但是要注意的是,获得的数据会是 bytes 的二进制格式,所以需要 decode() 一下,转换成字符串格式。
发起POST请求
urlopen() 默认的访问方式是GET,当在 urlopen() 方法中传入data参数时,则会发起POST请求。注意:传递的data数据需要为bytes格式。
设置timeout参数还可以设置超时时间,如果请求时间超出,那么就会抛出异常。如下:
from urllib import request
resp = request.urlopen('http://www.baidu.com', data=b'word=hello', timeout=10)
print(resp.read().decode())添加Headers
通过 urllib 发起的请求会有默认的一个Headers:”User-Agent”:”Python-urllib/3.6”,指明请求是由 urllib 发送的。
所以遇到一些验证User-Agent的网站时,我们需要自定义Headers,而这需要借助于urllib.request中的 Request 对象。
from urllib import request
url = 'http://httpbin.org/get'
headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'}
# 需要使用url和headers生成一个Request对象,然后将其传入urlopen方法中
req = request.Request(url, headers=headers)
resp = request.urlopen(req)
print(resp.read().decode())Request对象
如上所示, urlopen() 方法中不止可以传入字符串格式的url,也可以传入一个 Request 对象来扩展功能,Request 对象如下:
class urllib.request.Request(url, data=None, headers={},
origin_req_host=None,
unverifiable=False,
method=None)构造 Request 对象必须传入url参数,data数据和headers都是可选的。
最后, Request 方法可以使用method参数来自由选择请求的方法,如PUT,DELETE等等,默认为GET。
添加Cookie
为了在请求时能带上Cookie信息,我们需要重新构造一个opener。
使用request.build_opener方法来进行构造opener,将我们想要传递的cookie配置到opener中,然后使用这个opener的open方法来发起请求。如下:
from http import cookiejar
from urllib import request
url = 'https://www.baidu.com'
# 创建一个cookiejar对象
cookie = cookiejar.CookieJar()
# 使用HTTPCookieProcessor创建cookie处理器
cookies = request.HTTPCookieProcessor(cookie)
# 并以它为参数创建Opener对象
opener = request.build_opener(cookies)
# 使用这个opener来发起请求
resp = opener.open(url)
# 查看之前的cookie对象,则可以看到访问百度获得的cookie
for i in cookie:
print(i)或者也可以把这个生成的opener使用install_opener方法来设置为全局的。
则之后使用urlopen方法发起请求时,都会带上这个cookie。
# 将这个opener设置为全局的opener
request.install_opener(opener)
resp = request.urlopen(url)设置Proxy代理
使用爬虫来爬取数据的时候,常常需要使用代理来隐藏我们的真实IP。如下:
from urllib import request
url = 'http://www.baidu.com'
proxy = {'http':'222.222.222.222:80','https':'222.222.222.222:80'}
# 创建代理处理器
proxies = request.ProxyHandler(proxy)
# 创建opener对象
opener = request.build_opener(proxies)
resp = opener.open(url)
print(resp.read().decode())下载数据到本地
在我们进行网络请求时常常需要保存图片或音频等数据到本地,一种方法是使用python的文件操作,将read()获取的数据保存到文件中。
而urllib提供了一个urlretrieve()方法,可以简单地直接将请求获取的数据保存成文件。如下:
from urllib import request
url = 'http://python.org/'
request.urlretrieve(url, 'python.html')urlretrieve() 方法传入的第二个参数为文件保存的位置,以及文件名。
注意:urlretrieve() 方法是python2直接移植过来的方法,以后有可能在某个版本中弃用。
第三方库 requests
安装
由于 requests是第三方库,所以要先安装,如下:
pip install requests发起GET请求
直接用 get 方法,如下:
import requests
r = requests.get('http://www.baidu.com/')
print(r.status_code) #状态
print(r.text) #内容对于带参数的URL,传入一个dict作为params参数,如下:
import requests
r = requests.get('http://www.baidu.com/', params={'q': 'python', 'cat': '1001'})
print(r.url) #实际请求的URL
print(r.text)requests的方便之处还在于,对于特定类型的响应,例如JSON,可以直接获取,如下:
r = requests.get('https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20%3D%202151330&format=json')
r.json()
# {'query': {'count': 1, 'created': '2017-11-17T07:14:12Z', ...添加Headers
需要传入HTTP Header时,我们传入一个dict作为headers参数,如下:添加Headers
需要传入HTTP Header时,我们传入一个dict作为headers参数,如下:
r = requests.get('https://www.baidu.com/', headers={'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit'})获取响应头,如下:
r.headers
# {Content-Type': 'text/html; charset=utf-8', 'Transfer-Encoding': 'chunked', 'Content-Encoding': 'gzip', ...}
r.headers['Content-Type']
# 'text/html; charset=utf-8'发起POST请求
要发送POST请求,只需要把get()方法变成post(),然后传入data参数作为POST请求的数据,如下:
r = requests.post('https://accounts.baidu.com/login', data={'form_email': 'abc@example.com', 'form_password': '123456'})requests默认使用application/x-www-form-urlencoded对POST数据编码。如果要传递JSON数据,可以直接传入json参数,如下:
params = {'key': 'value'}
r = requests.post(url, json=params) #内部自动序列化为JSON上传文件
上传文件需要更复杂的编码格式,但是requests把它简化成files参数,如下:
upload_files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=upload_files)在读取文件时,注意务必使用 'rb' 即二进制模式读取,这样获取的 bytes 长度才是文件的长度。
把 post() 方法替换为 put() , delete() 等,就可以以PUT或DELETE方式请求资源。
添加Cookie
在请求中传入Cookie,只需准备一个dict传入cookies参数,如下:
cs = {'token': '12345', 'status': 'working'}
r = requests.get(url, cookies=cs)requests对Cookie做了特殊处理,使得我们不必解析Cookie就可以轻松获取指定的Cookie,如下:
r.cookies['token']
# 12345指定超时
要指定超时,传入以秒为单位的timeout参数。超时分为连接超时和读取超时,如下:
try:
# 3.1秒后连接超时,27秒后读取超时
r = requests.get(url, timeout=(3.1, 27))
except requests.exceptions.RequestException as e:
print(e)超时重连
def gethtml(url):
i = 0
while i < 3:
try:
html = requests.get(url, timeout=5).text
return html
except requests.exceptions.RequestException:
i += 1添加代理
同添加headers方法,代理参数也要是一个dict,如下:
heads = {
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit'
}
proxy = {
'http': 'http://120.25.253.234:812',
'https' 'https://163.125.222.244:8123'
}
r = requests.get('https://www.baidu.com/', headers=heads, proxies=proxy)相关推荐
- 如何取消win10开机密码(如何取消win10开机密码账户登录)
-
取消Windows10的开机密码可以通过以下方法进行操作:方法一:使用用户账户设置1.打开“开始”菜单,点击“设置”图标。2.在设置窗口中,点击“帐户”选项。3.在左侧菜单中,选择“登录选项”。4....
- 免费解压文件的软件(免费解压文件的软件电脑)
-
1、快压快压(kuaizip)是一款非常流氓的压缩和解压缩软件,一款免费、方便、快速的压缩和解压缩利器,拥有一流的压缩技术,是国内第一款具备自主压缩格式的软件。快压自身的压缩格式KZ具有超大的压缩比和...
- 无线usb网卡插上去没有反应(为什么usb无线网卡插上去没反应)
-
当出现电脑无法识别无线网卡的情况时,是简单的方法就是将无线USB网卡插到电脑后置USB接口上,以保证供电的充足。当然如果是偶然出现无法识别的情况,建议重启一下电脑试试。启用USB无线网卡驱动:右击“计...
- 怎么登录自己家的路由器(怎么登录自己家的路由器账号)
-
登陆家里的路由器方法:1、先查看ip,方法:win+r---输入:cmd---在再黑白界面输入:ipconfig,按回车。2、根据网关查看路由器地址。若网关是:192.168.2.1,那么路由器的ip...
- linux操作系统安装步骤(linux系统详细安装步骤)
-
1.选择“中文(简体)”,然后点击“安装Ubuntu”。2.点击“继续”。3.然后点击“现在安装”。4.选择地址的时区,然后点击“继续”。5.选择“汉语”,然后点击“继续”。6.输入用户的名字。7.设...
- 苹果手机怎么设置定时关机(苹果手机怎么设置定时关机重启)
-
苹果手机可以设置定时关机,但无法设置定时开机。具体操作步骤如下:进入苹果手机自带的时钟。点击屏幕有下角的计时器。点击画面中间的计时结束启用选项。选择画面最下方的“停止播放”。之后再点击画面右上角的设定...
- 无线网wifi密码忘记了怎么办
-
忘记wifi密码后,可以在路由器后台查看。1.在浏览器的地址栏中,输入路由器上的管理地址,进入后台界面;2.在后台界面里,找到“无线设置”选项,点击它;3.在新界面里,点击wifi密码右侧的小眼睛图标...
-
- win7系统无法正常开机怎么办
-
解决方法如下1,出现无法启动的原因,要注意是开机启动不了,还是在进度条那里缓冲,过不去.如果是开机启动不了,那就要看一下内存条、电源等有没有问题?如果是在进度条那里,那就看下方的三种方法。2,第一种方法:1,开机按F8键.2,选择最近一次的...
-
2025-11-16 07:51 off999
- 现在装win7还需要激活吗(现在安装win7旗舰版还需密钥吗)
-
要激活 Windows7如果是预装在计算机中的,买来之后便不用激活,这里预装指的是在厂商那里。正版的Windows7安装到计算机中,有三十天的试用期,若要永久使用,就要使...
- 2025显卡性能排行榜天梯图(2020年显卡性能天梯图)
-
MacBookPro的显卡水平处于笔记本独立显卡Nvidia920M和940M之间。属于低端显卡级,玩玩LOL啥的还可以,其他的大型游戏就算了,MAC不适合打游戏。MacBookPro搭载的8代...
- 网络对时服务器(对时服务器端口)
-
对等网是指在网络中所有计算机的地位都是平等的,既是服务器也是客户机,所有计算机中安装的都是相同的单机操作系统如Windows98/XP/Vista/7等,它可以设置共享资源,但受连接数限制,一般是只允...
- 如何强制删除u盘文件(强制删除u盘内容)
-
1、电脑上下载安装安全杀毒类软件。2、使用强力卸载。3、找到U盘上需要卸载的文件,右击强力卸载可以卸载顽固型文件。4、被暂用的文件也删除不了可以退出U盘重启电脑重新开机插入U盘进行删除。5、不能删除的...
- directx官方下载win7(directx download)
-
点开始-----运行,输入dxdiag,回车后打开“DirectX诊断工具”窗口,进入“显示”选项卡,看一下是否启用了加速,没有的话,单击下面的“DirectX功能”项中的“启用”按钮,这样便打开了D...
- u盘视频无法播放怎么办(u盘上视频没办法播放)
-
解决办法:1.检查U盘存储格式是否为FAT32,如果不是,请将其格式化为FAT32; 2.检查U盘中视频文件是否损坏,如果有损坏文件,请尝试重新复制一份; 3.检查U盘中存储...
-
- 笔记本电脑无法正常启动怎么修复
-
1.可以解决。2.Windows未能启动可能是由于系统文件损坏、硬件故障或病毒感染等原因引起的。解决方法可以尝试使用Windows安全模式启动、修复启动、还原系统、重装系统等方法。3.如果以上方法都无法解决问题,可以考虑联系专业的电脑...
-
2025-11-16 04:03 off999
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
慕ke 前端工程师2024「完整」
-
失业程序员复习python笔记——条件与循环
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
