urllib是python的内置的http请求库

urllib.requests 请求模块
urllib.error 异常处理模块
urllib.parse url解析模块
urllib.robotparser robots.txt解析模块

urllib常见函数

urllib.requests.urlopen(url,data,timeout)
image.png
image.png
创建一个表示远程url的类文件对象,然后像本地文件一样操作这个类文件对象来获取远程数据。

urlopen返回对象提供方法

read()readline(),readlines(),fileneo(),close(),对HTTPResponse类型数据进行操作

把网站html源码进行读取
image.png
image.png
info()返回HTTPMessage对象,表示远程服务器返回的头的信息
image.png
image.png
getcode():返回http状态码
geturl():返回请求的url。

urllib.parse.urlencode(dict)

将dict或包含两字元素的元组列表装换成url参数。
例如{“name”=’’qingmo’’,”age”=’’22’’}转换成”name=qingmo||age=22”
https://baijiahao.baidu.com/s?id=1622594556284170797&wfr=spider%26for%3Dpc
将urlid=1622594556284170797&wfr=spider%26for%3Dpc拼接成dict = {‘id’:’1622594556284170797’,’wfr’:’spider&for=pc’}
image.png
image.png

urllib.reuqest.ProxyHandler(dict)可以将字典里面的ip当做代理去设置。

image.png

urllib.parse.urlparse(urlstring,scheme=’’,allow_fragments=true)

url解析函数的重点是将url字符串拆分为其组件,或者将url组件组合为一个url字符串。
image.png
image.png

urllib.request.urlretrieve(url,filename=None,reporthook=None,data=None)

urlretrieve()方法直接将远程数据下载到本地。
参数url为请求地址
参数filename指定保存本地路径,(如果参数未指定,urllib会生成一个临时文件保存数据)
参数reporthook是一个回调函数,当连接上服务器,以及相应的数据块传输完毕是会触发该回调,我们可以利用这个回调函数来显示当前的下载进度。
参数data是指post到服务器的数据,该方法返回一个包含两个元素(filename,headers)的元组,filename表示保存的本地路径,header表示服务器的响应头。
image.png
image.png

  1. import urllib.request
  2. url="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.zcool.cn%2Fcommunity%2F010d325b40df23a80121b9943080ad.jpg%401280w_1l_2o_100sh.jpg&refer=http%3A%2F%2Fimg.zcool.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1636620879&t=de74f3e0c1926698163b036a30bfc07b"
  3. filename = 'd:\\杀生丸.jpg'
  4. def call(a,b,c):
  5. '''
  6. :param a: 表示已下载的数据块
  7. :param b: 表示数据块的数量
  8. :param c: 表示总文件的大小
  9. :return:
  10. '''
  11. d = 100 * a * b / c
  12. if d>100:
  13. d=100
  14. else:
  15. print("已经下载了:%.2f%%" %d)
  16. res = urllib.request.urlretrieve(url,filename,call)#call为回调函数

urllib.request.Request(url,data=none,header=none,origin_host=none,unverifiable=false,method=none)

url :为访问地址
data:此参数为可选字段,其中传递的参数需要转为bytes,如果是字典我们需要通过urllib.parse.urlencode转换即可
headers:http相应的传递的信息,构造方法,headers参数传递,通过调用request对象的add_header()方法来添加请求头。

  1. import urllib.request
  2. url = 'https://www.baidu.com/'
  3. headers= {
  4. 'http':'127.0.0.1:1007',
  5. 'https':'127.0.0.1:1007'
  6. }
  7. data = {
  8. 'name':'qingmo',
  9. 'age':'18'
  10. }
  11. res=urllib.request.Request(url,data=data,headers=headers)

urllib.request.HTTPCookieProcessor()

网站中通过cookie进行判断权限是很常见的。那么我们可以通过urllib.request.HTTPCookieProcessor(cookie)来操作cookie。使用cookie和使用代理ip一样也需要自己创建一个自己的opener。在http包中,提供了cookiejar模块,用于提供对cookie的支持。http。cookiejar功能强大,我们可以利用本模块的cookiejar类的对象来捕捉cookie并在后续链接请求时重新发送,比如可以实现模拟登录功能。该模块主要的对象有cookiejar,Filecookiejar,Mozillacookiejar,LWPCcookiefar
image.png
image.png

  1. import http.cookiejar
  2. import urllib.request
  3. url = 'https://www.baidu.com/'
  4. cookie = http.cookiejar.CookieJar()
  5. #创造一个处理器传入cookie
  6. header = urllib.request.HTTPCookieProcessor(cookie)
  7. #创造一个发送器
  8. opener = urllib.request.build_opener(header)
  9. 调用http
  10. r=opener.open(url)
  11. for item in cookie:
  12. print("cookie name ="+item.name+"cookie value ="+item.value)

异常处理

如果访问时间没有在这个时间范围内就会报错
image.png
image.png

报错的位置,报了一个通信异常
image.png

处理这个异常,导入通信的包

image.png
然后找到异常的包进行处理
image.png

image.png
image.png

  1. import urllib.request
  2. import socket,urllib.error
  3. url = 'https://www.baidu.com'
  4. try:
  5. r = urllib.request.urlopen(url, timeout=0.0000001)
  6. except urllib.error.URLError as e:
  7. # 如果这个异常的原因是属于socket.timeout
  8. if isinstance(e.reason,socket.timeout):
  9. print('timeout!!!!!')