前言

更多内容,请访问我的 个人博客。


Python 访问网络资源有很多方法,urllib, urllib2, urllib3, httplib, httplib2, requests ,现介绍如下两种方法:
- 内置的 urllib 模块 - 优点:自带模块,无需额外下载第三方库 - 缺点:操作繁琐,缺少高级功能 - 第三方库 requests - 优点:处理URL资源特别方便 - 缺点:需要下载安装第三方库


内置的 urllib 模块

发起GET请求

主要使用urlopen()方法来发起请求,如下:

from urllib import requestresp = 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 requestresp = 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 requesturl = '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 requesturl = '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 requesturl = '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 requesturl = 'http://python.org/'
request.urlretrieve(url, 'python.html')

urlretrieve() 方法传入的第二个参数为文件保存的位置,以及文件名。

注意:urlretrieve() 方法是python2直接移植过来的方法,以后有可能在某个版本中弃用。

第三方库 requests

安装

由于 requests是第三方库,所以要先安装,如下:

pip install requests

发起GET请求

直接用 get 方法,如下:

import requestsr = requests.get('http://www.baidu.com/')
print(r.status_code)    #状态
print(r.text)   #内容

对于带参数的URL,传入一个dict作为params参数,如下:

import requestsr = 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参数,如下:

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 = 0while i < 3:try:html = requests.get(url, timeout=5).textreturn htmlexcept 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)


更多编程教学请关注公众号:潘高陪你学编程


python使用osgeo库_Python使用内置urllib模块或第三方库requests访问网络资源相关推荐

  1. python中json模块_Python使用内置json模块解析json格式数据的方法

    本文实例讲述了Python使用内置json模块解析json格式数据的方法.分享给大家供大家参考,具体如下: Python中解析json字符串非常简单,直接用内置的json模块就可以,不需要安装额外的模 ...

  2. python func函数用法_Python常见内置高效率函数用法示例

    本文实例讲述了Python常见内置高效率函数用法.分享给大家供大家参考,具体如下: 1.  filter(function,sequence) 将sequence中的每个元素,依次传进function ...

  3. python type创建类_Python基于内置函数type创建新类型

    英文文档: class type(object) class type(name, bases, dict) With one argument, return the type of an obje ...

  4. python生成50个随机数_Python内置random模块生成随机数的方法

    本文我们详细地介绍下两个模块关于生成随机序列的其他使用方法. 随机数参与的应用场景大家一定不会陌生,比如密码加盐时会在原密码上关联一串随机数,蒙特卡洛算法会通过随机数采样等等.Python内置的ran ...

  5. python中的random模块_Python内置random模块生成随机数的方法

    本文我们详细地介绍下两个模块关于生成随机序列的其他使用方法. 随机数参与的应用场景大家一定不会陌生,比如密码加盐时会在原密码上关联一串随机数,蒙特卡洛算法会通过随机数采样等等.Python内置的ran ...

  6. python __call__一般用在哪些地方_Python __call__内置函数的作用和用法

    开学了进入了实验室,需要协助大师兄做事,主要是OpenStack中的代码解析,但是涉及很多python高级用法,一时间有点麻烦,在做项目的同时慢慢更新博客.这次先写一下__call__的用法,因为经常 ...

  7. python堆模块_python内置堆模块

    heapq python内置heapq模块,通过import heapq导入. heapq模块是用于堆实现优先队列.我们知道队列是先进先出(FIFO), heapq中的优先队列指的是不论谁先进,最小的 ...

  8. python内置函数入门_Python入门-内置函数一

    什么是内置函数?就是python给你提供的拿来直接用的函数,比如print,input等等,截止到python版本3.6.2 python一共提供了68个内置函数,他们就是python直接提供给我们的 ...

  9. python产生随机数random.random_Python内置random模块生成随机数的方法

    本文我们详细地介绍下两个模块关于生成随机序列的其他使用方法. 随机数参与的应用场景大家一定不会陌生,比如密码加盐时会在原密码上关联一串随机数,蒙特卡洛算法会通过随机数采样等等.Python内置的ran ...

最新文章

  1. YOLO-v5训练自己的数据+TensorRT推理部署(1)
  2. java 线程通讯_java多线程(五)线程通讯
  3. vue从其它页面返回_vue---详细页点返回列表页,停留在原先位置
  4. idea 快速搭建spring boot 多模块项目(底部附源码)
  5. GPS系统误差的主要来源
  6. 启明云端分享 | sigmastar SSD201开发板网口直连PC升级
  7. 征稿 | 软件学报专刊征文:知识赋能的信息系统
  8. 【深入浅出etcd系列】1. 架构概览
  9. Java/JSP中调用SQL Server存储过程完整示例收藏
  10. 《linux c编程指南》学习手记2
  11. 详解单例模式线程安全
  12. 换热站实际应用程序:西门子200smart PLC与威纶通触摸屏换热站程序、西门子1200plc与昆仑通态触摸屏换热站程序
  13. android手机qq账号管理在哪里,qq安全中心手机版之功能详解
  14. python柱状图加百分比_python matplotlib 为柱状图添加百分比
  15. kvm创建快照、查看快照、恢复快照、删除快照
  16. 自动弹出的html,360浏览器自动弹出网页怎么解决?
  17. 现身说法:37岁老码农找工作!
  18. 计算机机房大气压强的标准,标准大气压
  19. OSChina 周三乱弹 —— 东京不热,北海道有点热
  20. 产品设计实战(上):Axure9绘制高保真原型

热门文章

  1. bolt在java,java neo4j bolt
  2. java线程锁机制_多线程之锁机制
  3. 你的 IDEA 酷不酷?
  4. 上传到docker hub_docker 创建image上传到 docker hub并下载
  5. sevlet实现下载文件功能
  6. Jenkins构建之常用的触发器和Git Hook自动构建
  7. MYSQL专题-MySQL三大日志binlog、redo log和undo log
  8. Java写手机专题分析接口_jeesite学习文档API-内容管理模块
  9. mysql数据库分表备份脚本_MySQL分库分表备份脚本
  10. mysql 查看最近的语句_查看MySQL最近执行的语句