urllib库
urllib库是Python中一个最基本的网络请求库。它可以模拟浏览器行为,向指定服务器发送一个请求,并且可以保存服务器返回的数据。
一.urlopen函数
urlopen函数的参数:
def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
*, cafile=None, capath=None, cadefault=False, context=None):
获得请求:
from urllib import request
resp = request.urlopen('http://www.baidu.com')
print(resp.read())
返回值:
read(size): 调用read()会一次性读取文件的全部内容。
readline(): 从字面意思可以看出,该方法每次读出一行内容,所以,读取时占用内存小,比较适合大文件,该方法返回一个字符串对象。
realines(): 调用readlines()可一次读取所有内容并按行返回list。
getcode():返回Http状态码,如果是http请求,200表示请求成功完成;404表示网址未找到。
geturl():返回请求的url地址。
二.urlretrieve函数
这个函数可以方便的将网页上一个文件保存到本地。
urlretrieve(url, filename=None, reporthook=None, data=None)
urlretrieve函数的参数:
url:下载链接地址
filename:指定了保存本地路径(如果参数未指定,urllib会生成一个临时文件保存数据。)
reporthook:是一个回调函数,当连接上服务器、以及相应的数据块传输完毕时会触发该回调,我们可以利用这个回调函数来显示当前的下载进度。
data:指post导服务器的数据,该方法返回一个包含两个元素的(filename, headers) 元组,filename 表示保存到本地的路径,header表示服务器的响应头。
下载百度页面:
from urllib import request
request.urlretrieve('http://www.baidu.com/','baidu.html')
三.urlencode函数
urlencode函数可将字符串以URL编码,用于编码处理。
用浏览器发送请求的时候,如果url中包含中文或其他特殊字符,那么浏览器会给我们进行编码,如果使用代码发送请求,就必须手动进行编码,这时候就需要使用urlencode函数来实现。
接受参数形式为:
[(key1, value1), (key2, value2),...] 和 {'key1': 'value1', 'key2': 'value2',...}
返回的是形如key2=value2&key1=value1字符串。
from urllib import parse
params = ({'name':'张三','age':18,'sex':'男'})
result = parse.urlencode(params);
print(result)
运行结果:
四.parse_qs函数
可以将经过编码的后url参数进行解码。
from urllib import parse
result = "name=%E5%BC%A0%E4%B8%89"
qs = parse.parse_qs(result)
print(qs)
运行结果:
五.urlparse和urlsplit函数
urlparse函数和urlsplit函数可以对url中各个组成部分进行分割。
urlparse函数的参数:
result.scheme : 网络协议
result.netloc: 服务器位置(也有可能是用户信息)
result.path: 网页文件在服务器中的位置
result.params: 可选参数
result.query: &连接键值对
result.fragment:在散列符号 # 之后
urlparse函数和urlsplit函数非常相像,用法基本一致,但是他们有略微的不同,urlsplit函数在分割的时候,path和params属性是在一起的:
from urllib import parse
url='https://www.baidu.com/s;hello?wd=Python&rsv_spt=1'
result = parse.urlsplit(url)
print(result)
运行结果:
urlparse函数在分割的时候,path和params属性是分开的:
from urllib import parse
url='https://www.baidu.com/s;hello?wd=Python&rsv_spt=1'
result = parse.urlparse(url)
print(result)
运行结果:
六.request.Requset类
request.Requset类可以在请求的时候增加一些请求头,可以将url先构造成一个Request对象,传进urlopen。
from urllib import request,parse
url ='http://sports.sohu.com/'
headers ={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
'Referer':'http://news.sohu.com/'
}
req = request.Request(url,headers=headers)
resp = request.urlopen(req)
print(resp.read().decode('utf-8'))
运行结果:
七.ProxyHandler处理器(代理)
urllib中通过ProxyHandler设置代理服务器。
在请求目的网站之前,先请求代理服务器,再使用代理服务器去请求目的网站。
from urllib import request
#查询本机ip
url = 'http://httpbin.org/ip'
#使用ProxyHandler,传入代理ip及其端口
handler = request.ProxyHandler({"http":"202.120.38.131:80"})
opener = request.build_opener(handler)
response = opener.open(url)
print(response.read())
运行结果:
八.cookie
cookie的格式:
Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE
各参数的意义:
NAME: cookie的名字
VALUE: cookie的值
Expires: cookie的过期时间
Path: cookie作用的路径
Domain: cookie作用的域名
SECURE: 是否只在http协议下起作用
cookie的应用:
使用cookie登录百度账号首页
# 获取一个有登录信息的Cookie模拟登陆
from urllib import request
# 1. 构建一个已经登录过的用户的headers信息
headers = {
"Host": "passport.baidu.com",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
"Accept-Language": "zh-CN,zh;q=0.9",
"Referer": "http://i.baidu.com/",
# 便于终端阅读,表示不支持压缩文件
# Accept-Encoding: gzip, deflate, sdch,
# 这个Cookie是保存了密码无需重复登录的用户的Cookie,这个Cookie里记录了用户名,密码
"Cookie": "BIDUPSID=076CD0280FA5172FF585705A1375DCEE; PSTM=1540297445; HOSUPPORT=1; UBI=fi_PncwhpxZ%7ETaKAQfuToQwDWK78AiPegZzipVzrijnq4eWYDadLkbPBYHYnUSr5p-ScDHkG6qcLhF2n2to; USERNAMETYPE=3; SAVEUSERID=eaf1ed31bd228a3d0a69a285fbdd45; HISTORY=3f29f9a905dd43e394dc47b315dfe1bcd71c4e; BAIDUID=8942D0CFF38660AB72848C276E914ACC:FG=1; STOKEN=935f65898409f2bd8760404b4752eabc53cac1d845c8535cebdbe0d41240d74a; BDUSS=ZlU3NTMHBFakNhdlpLTjlhVGRNQm1TbkVEQzV4am80V2dtdW5NUS0yRVM2a1pkSVFBQUFBJCQAAAAAAAAAAAEAAAAC4qlNt728qtChub25vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJdH10SXR9dN1; PTOKEN=04a03bb8f52b74fa9118a8b12d021f4c; H_PS_PSSID=1433_21104_29237_28519_29099_28834_29220; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; delPer=0; PSINO=5; Hm_lvt_90056b3f84f90da57dc0f40150f005d5=1562656661; Hm_lpvt_90056b3f84f90da57dc0f40150f005d5=1562656661"
}
# 2. 通过headers里的报头信息(主要是Cookie信息),构建Request对象
req = request.Request("https://passport.baidu.com/center?_t=1562656659", headers=headers)
# 3. 直接访问百度账号主页,服务器会根据headers报头信息(主要是Cookie信息),判断这是一个已经登录的用户,并返回相应的页面
response = request.urlopen(req)
# 4. 打印响应内容
print(response.read().decode('utf-8'))
运行结果: