import urllib.request #引入库文件
#获取一个get请求
response = urllib.request.urlopen("http://www.baidu.com")
print(response.read().decode('utf-8')) #对获取到的源码进行utf-8的解码
下面是好长一大段结果,建议直接跳过
由于代码太多,这里放不下了,各位可以自行尝试一下
#获取一个post请求
import urllib.request #引入urllib的request对象
#urllib.request:用于打开和阅读url
url:统一资源定位符,internet上的每一个网页都具有一个唯一的名称标识,通常称之为url,它是www的统一资源定位标志,简称网址
url是对互联网上的资源和访问方法的一种简洁表示,是互联网上标准资源的地址,url具有全球唯一性,正确的url是可以通过浏览器打开网页的。
网页:网站是指在因特网上根据一定的规则,使用 HTML 等制作的用于展示特定内容相关的网页集合。
网页是网站中的一“页”,通常是 HTML 格式的文件,它要通过浏览器来阅读。
网页是构成网站的基本元素,它通常由图片、链接、文字、声音、视频等元素组成。通常我们看到的网页,
常见以 .htm 或 .html 后缀结尾的文件,因此将其俗称为 HTML 文件
html:HTML 指的是超文本标记语言 ,它是用来描述网页的一种语言。HTML 不是一种编程语言,而是一种标记语言。程序员把网页用网页元素描述出来,由浏览器解析,然后就有了大家看到的精美的网页了
。。。。
扯得多了
回到正题
import urllib.parse #urllib.parse 引入urllib的parse对象,解析器,顾名思义,用它来对urllib里面的东西进行解析,这里面也有大讲究,等后面再深入系统的学习
data = bytes(urllib.parse.urlencode({"hello":"world"}),encoding = "utf-8") #把所有的信息转化为二进制的数据包,内容可以是一些键值对,还可以包含一些编码解码的数值
response = urllib.request.urlopen("http://httpbin.org/post",data = data)
print(response.read().decode("utf-8")) #依旧进行“utf-8”的解码
下面是运行结果
D:\program\python\python\python.exe D:/program/python/douban/test/testUrllib.py
{
"args": {},
"data": "",
"files": {},
"form": {
"hello": "world" #刚刚用urlencode封装的数据,以键值对的形式返回
},
"headers": {
"Accept-Encoding": "identity",
"Content-Length": "11",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "Python-urllib/3.8",
"X-Amzn-Trace-Id": "Root=1-62a12ca6-43d70cb10eb61bc979194719"
},
"json": null,
"origin": "49.78.135.113",
"url": "http://httpbin.org/post"
}
进程已结束,退出代码0
上面这个代码段是打印模拟浏览器发出的请求,实际用以浏览器发出的请求可以通过httpbin.org来看,
post请求一般用于用户登录的时候
我们再次尝试获取一次get请求
import urllib.request
response = urllib.request.urlopen("http://httpbin.org/get")
print(response.read().decode("utf-8"))
与post请求不同的是,get请求不用data封装,之后把urlopen后面的post换为get即可
这次我们得到的结果是
D:\program\python\python\python.exe D:/program/python/douban/test/testUrllib.py
{
"args": {},
"headers": {
"Accept-Encoding": "identity",
"Host": "httpbin.org",
"User-Agent": "Python-urllib/3.8", #其实这个结果就相当于直接告诉浏览器我是爬虫,自爆了属于是
"X-Amzn-Trace-Id": "Root=1-62a13636-6e75d4877e13d11d280b3695"
},
"origin": "49.78.135.113",
"url": "http://httpbin.org/get"
}
进程已结束,退出代码0
与httpbin.org这个网址上获取到的作一对比,也就是真实浏览器收到的
{
"args": {},
"headers": {
"Accept": "application/json",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
"Host": "httpbin.org",
"Referer": "http://httpbin.org/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36 Edg/102.0.1245.33",
"X-Amzn-Trace-Id": "Root=1-62a134d2-0610863d118528741db377ae" #真实的浏览器会告诉你它是可以接收什么样的信息的
},
"origin": "49.78.135.113",
"url": "http://httpbin.org/get"
}
可以看到,基本上没有什么太大的差别,除了一些细节上的差别
###超时处理
在实际访问网页的过程中,由于各种不可抗元素,例如,对方的网页不想让你访问,或者你访问的时间过短,就会产生一个错误:超时。例如
import urllib.request
response = urllib.request.urlopen("http://httpbin.org/get",timeout=0.01)
print(response.read().decode("utf-8"))
这样的代码运行就会产生错误,下面放出运行结果
D:\program\python\python\python.exe D:/program/python/douban/test/testUrllib.py
File "D:/program/python/douban/test/testUrllib.py", line 21
response = urllib.request.urlopen("http://httpbin.org/get",timeout=0.01)
^
IndentationError: unexpected indent
进程已结束,退出代码1
有错误就解决
import urllib.request
try:
response = urllib.request.urlopen("http://httpbin.org/get",timeout=0.01)
print(response.read().decode("utf-8"))
except urllib.error.URLError as e:
print("time out")
解决之后的效果
D:\program\python\python\python.exe D:/program/python/douban/test/testUrllib.py
time out
进程已结束,退出代码0
可以看到,不再报错,直接返回time out,简单明了,关于错误处理的问题,以后再深入了解