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响应内容的二进制形式