上一次我们讲了urllib.request模块的最简单用法,接下来我们要学习它另外的几个方法,使用Request和提交POST数据。
一:使用Request
urllib.request.
Request
(url, data=None, headers={}, method=None)
使用request()来包装请求,再通过urlopen()获取页面。
# -*- coding:utf-8 -*-
from urllib import request,parse
url="http://www.umei.cc/meinvtupian/xingganmeinv/"
headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
req = request.Request(url, headers=headers)
html= request.urlopen(req).read().decode("utf-8")
print(html)
添加headers头请求是为了让网站认为我们是浏览器发送请求而不是urllib请求
当然也可以将headers头请求写完全一点比如:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)'
'Referer': 'http://www.lagou.com/zhaopin/Python/?labelWords=label',
'Connection': 'keep-alive'
}
- User-Agent :这个头部可以携带如下几条信息:浏览器名和版本号、操作系统名和版本号、默认语言
- Referer:可以用来防止盗链,有一些网站图片显示来源http://***.com,就是检查Referer来鉴定的
- Connection:表示连接状态,记录Session的状态。
二:POST
urllib.request.
urlopen
(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
urlopen()的data参数默认为None,当data参数不为空的时候,urlopen()提交方式为Post。
提交post数据的时候需要将data数据进行urlencode()处理,转化为URL编码
这里需要使用道urllib.parse.urlencode()方法
# -*- coding:utf-8 -*-
from urllib import parse
data={
"from":"zh",
"to":"en",
"query":"拿破仑",
"transtype":"realtime",
"simple_means_flag":3
}
data = parse.urlencode(data).encode('utf-8')
处理后的url编码为:
from=zh&to=en&query=%E6%8B%BF%E7%A0%B4%E4%BB%91&transtype=realtime&simple_means_flag=3
Post的数据必须是bytes或者iterable of bytes,不能是str,因此需要进行encode()编码
这里展示一个小案例,发送表单数据给百度翻译,然后会得到一个json对象!
# -*- coding:utf-8 -*-
from urllib import request,parse
url="http://fanyi.baidu.com/v2transapi"
headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
data={
"from":"zh",
"to":"en",
"query":"拿破仑",
"transtype":"realtime",
"simple_means_flag":3
}
data = parse.urlencode(data).encode('utf-8')
req = request.Request(url, headers=headers, data=data)
html = request.urlopen(req).read().decode("utf-8")
print(html)
运行结果
放到http://www.json.cn中解析,得到以下结果
是不是看到翻译结果啦!拿破仑->Napoleon