Python-网络请求urllib库和requests库

1. urllib.request模块

模块定义了身份验证、重定向、cookies等应用中打开Url(主要是HTTP)的函数和类。

1)urlopen方法

def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
            *, cafile=None, capath=None, cadefault=False, context=None):

#参数 url:可以是一个URL也可以是一个Request 对象
#参数 data:当data为None时发起get请求,否则发起post请求,此时data要进行encode
#cafile,capath,cadefault,证书相关参数

#实例1
from urllib.request import urlopen

url = "http://www.bing.com"
response = urlopen(url)
print(response.closed) #未关闭
with response:
    print(type(response))  #response 类型 
    print(response.status)  #输出请求状态
    print(response.geturl()) #输出访问的网页url
    print(response.info()) # 输出header
    print(response.read().decode('utf-8')) #输出返回的网页内容

print(response.closed) #关闭


urlopen 方法只能传递url和data这样的数据,不能构造HTTP的请求,例如User-Agent

from urllib.request import urlopen,Request

url = "http://www.bing.com"
req = Request(url)
header = {'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Mobile Safari/537.36'}
#伪装浏览器 添加User-Agent
req.add_header(header)
response = urlopen(req)
with response:
    print(response.info()) # 输出header
    print(response.read().decode('utf-8')) #输出返回的网页内容
    

注意:urlopen 打开的url,返回的如果是301,302,会在responseHeader中返回location进行重定向,urlopen会自动跳转到新地址

2)parse模块
该模块可以完成url的编解码。对冒号、斜杆、&、等号等符号编码解码。

一般来说url中的地址部分,不需要使用中文路径,但是参数部分,不管get还是post方法,提交的数据中可能有斜杠、等号、问好等符号,这样这些字符表示数据,不表示元字符,如果直接发给服务器端,就会导致接收方无法判断谁是元字符,谁是数据了。

为了安全,一般会将数据部分的字符进行url编码,按照字符集的encoding要求转换成字节序列,每一个字节对应的十六进制字符串前加上百分号即可。

编码:
dict = {'name':'zhangsan'}
u = parse.urlencode(dict)

解码:
x = parse.unquote(u)

3)simplejson 模块
对网络请求返回的json字符串进行解析

from urllib import urlopern,Request
from urllib import parse
import simplejson

url = 'http://httpbin.org/post'
data = pare.urlencode({'name':'张三,@=、&*','age':'6'})
agent = 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Mobile Safari/537.36'

req = Request(url,headers={'User-agent':agent})

with urlopen(req,data = data.encode()) as response:
    text = response.read()
    d = simplejson.loads(text)
    print(d)
    print(type(d))
    
2.requests 基础用法

requests库是我们常用的网络请求库,使用非常广泛。

1) 常用方法:
requests.request(method,url,** kwargs)
requests.post(url,data,** kwargs)
requests.get(url,params,** kwargs)

method:请求方法,get,post等
url:请求地址
params:参数,可选
**kwargs:12个控制访问的参数,如

  • header:字典,http请求头,用来模拟任何我们想模拟的浏览器来对url发起访问
  • data:字典、字节或文件对象,作为request的内容,与params不同的是,data提交的数据并不放在url链接中,而是放在URL链接对应位置的地方作为数据来存储,也可以接收字符串。
  • json:json格式数据,在web开发中常见,作为内容部分向服务器提交。
  • cookies:从http中解析cookie
  • auth:元组,用来支持http认证功能
  • files:字典, 是用来向服务器传输文件时使用的字段
  • timeout:用于设定超时时间, 单位为秒,当发起一个get请求时可以设置一个timeout时间, 如果在timeout时间内请求内容没有返回, 将产生一个timeout的异常。
  • proxies:字典, 用来设置访问代理服务器。
  • allow_redirects:布尔,表示是否允许对url进行重定向,默认为True。
  • stream:布尔,指是否对获取内容进行立即下载,默认为True。
  • verify:布尔,用于认证SSL证书,默认为true。
  • cert: 用于设置保存本地SSL证书路径

Requests 会自动解码来自服务器的内容。大多数 unicode 字符集都能被无缝地解码。

请求发出后,Requests 会基于 HTTP 头部对响应的编码作出有根据的推测。当你访问 r.text 之时,Requests 会使用其推测的文本编码。你可以找出 Requests 使用了什么编码,并且能够使用 r.encoding 属性来改变它。

响应返回response对象部分属性:

  • status_code:http请求的返回状态,200表示成功。
  • text:响应内容的字符串形式,返回的页面内容,
  • url:最终的url定位
  • request:对应的http请求对象,可以获得请求头等信息
  • encoding:从http header中猜测的相应内容编码方式
  • apparent_encoding:从内容分析出的响应内容编码方式
  • content:http响应内容的二进制形式

你可能感兴趣的:(Python-网络请求urllib库和requests库)