Python 网络请求模块 urllib 、requests

Python 给人的印象是抓取网页很是方便,提供这种生产力的,主要依靠的就是 urllib、requests这两个模块。html

urlib 介绍

urllib.request 提供了一个 urlopen 函数,来实现获取页面。支持不一样的协议、基本验证、cookie、代理等特性。 urllib 有两个版本 urllib 以及 urllib2。 urllib2 可以接受 Request 对象,urllib 则只能接受 url。 urllib 提供了 urlencode 函数来对GET请求的参数进行转码,urllib2 没有对应函数。 urllib 抛出了 一个 URLError 和一个 HTTPError 来处理客户端和服务端的异常状况。python

Requests 介绍

Requests 是一个简单易用的,用Python编写的HTTP库。这个库让咱们可以用简单的参数就完成HTTP请求,而没必要像 urllib 同样本身指定参数。同时可以自动将响应转码为Unicode,并且具备丰富的错误处理功能。api

  • International Domains and URLs
  • Keep-Alive & Connection Pooling
  • Sessions with Cookie Persistence
  • Browser-style SSL Verification
  • Basic/Digest Authentication
  • Elegant Key/Value Cookies
  • Automatic Decompression
  • Unicode Response Bodies
  • Multipart File Uploads
  • Connection Timeouts
  • .netrc support
  • List item
  • Python 2.6—3.4
  • Thread-safe

如下为一些示例代码,本文环境为 Python 3.6.0服务器

无需参数直接请求单个页面

import urllib
from urllib.request import request
from urllib.urlopen import urlopen
# import urllib2
import requests

# 使用 urllib 方式获取
response = urllib.request.urlopen('http://www.baidu.com')
# read() 读取的是服务器的原始返回数据 decode() 后会进行转码
print(response.read().decode())

# 使用 requests 方式获取
# request 模块相比
resp = requests.get('http://www.baidu.com')
print(resp)
print(resp.text)

HTTP 是基于请求和响应的工做模式,urllib.request 提供了一个 Request 对象来表明请求,所以上面的代码也能够这么写cookie

req = urllib.request.Request('http://www.baidu.com')
with urllib.request.urlopen(req) as response:
print(response.read())

Request对象能够增长header信息网络

req = urllib.request.Request('http://www.baidu.com')
req.add_header('User-Agent', 'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25')
with urllib.request.urlopen(req) as response:
print(response.read())

或者直接将 header 传入 Request 构建函数。函数

带参数的 GET 请求

带有参数的请求和上面的例子本质同样,能够事先拼出URL请求字符串,而后再进行请求。 本例使用了 腾讯 的股票API,能够传入不一样的股票代码以及日期,查询对应股票在对应时间的价格、交易信息。学习

# 使用带参数的接口访问
tencent_api = "http://qt.gtimg.cn/q=sh601939"

response = urllib.request.urlopen(tencent_api)
# read() 读取的是服务器的原始返回数据 decode() 后会进行转码
print(response.read())

resp = requests.get(tencent_api)
print(resp)
print(resp.text)

发送 POST 请求

urllib 没有单独区分 GET 和 POST 请求的函数,只是经过 Request 对象是否有 data 参数传入来判断。url

import urllib.parse
import urllib.request
url = 'http://www.someserver.com/cgi-bin/register.cgi'
values = {'name' : 'Michael Foord',
          'location' : 'Northampton',
          'language' : 'Python' }
data = urllib.parse.urlencode(values)
data = data.encode('ascii') # data should be bytes req = urllib.request.Request(url, data)
with urllib.request.urlopen(req) as response:
   the_page = response.read()

参考资料: 一、python3 urllib.request 网络请求操做 二、Python3学习笔记(urllib模块的使用) 三、Python模拟登陆的几种方法 四、What are the differences between the urllib, urllib2, and requests module? 五、python3 urllib和requests模块spa

相关文章
相关标签/搜索