urllib的初次使用及补充(上)

本文详细介绍了Python的urllib库,包括GET和POST请求的实现,以及超时处理。通过实例展示了如何使用urllib.request和urllib.parse进行网络请求,解释了URL、网页、HTML等概念,并对比了真实浏览器与模拟请求的差异。
摘要由CSDN通过智能技术生成
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,简单明了,关于错误处理的问题,以后再深入了解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值