python urllib包
python内置了urllib包来处理http请求,主要是一下几个模块:
名称 | 功能 |
---|---|
urllib.error | 处理异常模块 |
urllib.parse | 解析url模块 |
urllib.request | 请求url模块 |
urllib.response | 响应模块 |
urllib.robotparser | 解析 robots.txt文件 |
主要方法
- urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
打开url或者对象
get请求
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import urllib
# import urllib2 # python3中没有 urllib2 用urllib.request替代
# get请求
resu = urllib.request.urlopen('https://hao.360.cn', data=None, timeout=10)
data = resu.read().decode()
#打开文件
fo = open('test.txt','a+',encoding = 'utf-8') # 打开文件 这里网络数据流的编码需要和写入的文件编码一致
fo.write(data) # 写入文件
fo.close() # 关闭文件
如果get的请求携带参数需要通过url方式传值
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import urllib
import json
def getExpressInfo(num):
"""
通过快递单号获取快递详情方法
:param num: Numbers 快递单号
:return: mixed 快递详细
"""
# get请求
url = 'http://www.kuaidi100.com/autonumber/autoComNum?text=' + num # get请求通过url传值
basicInfo = urllib.request.urlopen(url, data=None, timeout=10) # python3应该可以通过检测data是否携带参数来判断是get请求还是post请求
data = json.loads(basicInfo.read().decode()) #解析返回对象获取
comInfo = data['auto'][0]['comCode'] # 获取快递公司信息
# 通过公司名称和快递单号请求快速100的API
url2 = 'http://api.kuaidi100.com/api?id=be2205c7c55b54eb&com=' + comInfo + '&nu=' + num
result = urllib.request.urlopen(url2, data=None, timeout=10)
expressInfo = result.read().decode()
print(expressInfo)
#返回快递信息
return(expressInfo)
num = '280688688407' # 快递单号
#调用快递信息方法
getExpressInfo(num)
post请求
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import urllib
import json
url = 'http://www.daily.com/ABC/ABC/ABC'
values = {
"abc":"XXXXX",
"efg":"XXXXX"
}
headers = {'Content-Type': 'application/json'} # 设置请求头 告诉服务器请求携带的是json格式的数据
request = urllib.request.Request(url=url, headers=headers, data=json.dumps(values).encode(encoding='UTF8')) # 需要通过encode设置编码 要不会报错
response = urllib.request.urlopen(request) # 发送请求
logInfo = response.read().decode() # 读取对象 将返回的二进制数据转成string类型
print(logInfo)
备注:以上的是针对python3.5版本的,python2.7所使用的模块有很大的区别
(模块的源码没详细看,写的不对的地方,高手莫喷,多多指导!)