# python http请求urlib模块
urlib.urlopen(url) 只由url参数,不能设置header等信息
urllib有urlencode函数,可以把字典编码转成get参数(&方式连接), urllib2 没有
urllib.quote(s, safe='/') 是转义编码用的, 默认不编码/, 且把空格转成%20
urllib.quote_plus(s, safe='') 默认全部编码, 会调用quote(s, safe=' ') 不编码空格, 最后替换s中的空格为## urllib2 模块
urllib2.Request(url,data,headers) 构造一个Request对象
urllib2.urlopen(request对象或者url),如果传url只能是url,不能附带header和data。
由于urllib2 没有编码函数,所以经常和urllib一起导入,使用urlencode函数或者quote函数。
cookie支持方法
cookie=cookielib.CookieJar() # 声明CookieJar对象实例来保存cookie
handler=urllib2.HTTPCookieProcessor(cookie) # 利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器
opener=urllib2.build_opener(handler) # 通过handler构建opener
urllib2.install_opener(opener)
1
2
3
4
2
3
4
- 如果没有data字段就是get方式,否则是post请求
- 如果post是json格式, headr指定json,data需要json.dumps()
- 如果表单方式,需要data需要urllib.urlencode()
- request 对象有add_header(key,value)函数, 添加header 字段名key,值是value。
- urlopen(url, timeout=1) 可以有超时函数,单位秒
- read() 读取返回body数据
# 使用代理服务器, 打开请求过程的 debuglog
def use_proxy(proxy_addr, url, data, headers):
print proxy_addr
proxyHandler = urllib2.ProxyHandler({"http": proxy_addr})
# build_opener(*handlers) 绑定一些句柄
opener = urllib2.build_opener(proxyHandler, urllib2.HTTPHandler(debuglevel=1))
urllib2.install_opener(opener)
request = urllib2.Request(url, data=data, headers=headers)
response = urllib2.urlopen(request,timeout=5)
return response.read()
# linux 需要安装代理软件squid, 默认代理http_proxy 端口是3128
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 附带一个有道翻译接口例子
#encoding=utf8
import urllib, urllib2
# 请求地址url
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
request_headers = {
"Host":'fanyi.youdao.com',
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36",
}
# 发送给服务器的表单
form_data = {
"i": "woman",
"from": "AUTO",
"to": "AUTO",
"smartresult": "dict",
"doctype": "json",
"version": "2.1",
"keyfrom": "fanyi.web",
"action": "FY_BY_REALTIME",
"typoResult": "false"
}
# POST发送的data必须为bytes或bytes类型的可迭代对象,不能是字符串
form_data = urllib.urlencode(form_data)
# 构造请求对象Request
# req = urllib2.Request(url, data=form_data, headers=request_headers)
def use_proxy(proxy_addr, url, data, headers):
print proxy_addr
proxy = urllib2.ProxyHandler({"http": proxy_addr})
# build_opener(*handlers) 绑定一些句柄
han = urllib2.build_opener(proxy, urllib2.HTTPHandler(debuglevel=1))
urllib2.install_opener(han)
print url
request = urllib2.Request(url, data=data, headers=headers)
response = urllib2.urlopen(request,timeout=5)
return response.read()
# 发起请求
# response = urllib2.urlopen(req)
# data = response.read()
data = use_proxy("127.0.0.1:3128", url, form_data, request_headers)
print data
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# URLError 异常
# request 模块
- 第三方模块,需要pip install 安装
- 其实也是封装了urllib3的功能, 也改进了一部分