Python3中Urllib的简述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43999482/article/details/101690210

Urllib的介绍Urllib的官网

在Python3中Urllib是一个自带的比较低级的爬虫库,一共有四个模块

  1. urllib.request:用于打开和读取URLs
  2. urllib.error:处理urllib.request抛出的异常错误信息
  3. urllib.parse: 解析URLs(是一个工具库)
  4. urllib.robotparser:解析robots.txt 文件,不常用

下面我们用有道做一个例子,爬取其源代码

import urllib.request#这里是导入Urllib模块中的request这个子模块
response = urllib.request.urlopen("http://www.youdao.com/")#用URLopen来到开这个网址,也就是URL
print(response.read().decode("utf-8"))#将返回的响应进行打印,并转码为utf-8

我们可以看出到这个网页的源代码,使用get方式请求(这里不读get与post方式请求做过多的介绍)
下面我给出一个post请求

import urllib.parse
import urllib.request
data = bytes(urllib.parse.urlencode({"hello":"world"}),encoding="utf-8")
#urlencode的参数是词典,它可以将key-value这样的键值对转换成我们想要的格式。指定编码为utf-8
response = urllib.request.urlopen("https://www.baidu.com/post",data = data)
print(response.read())

这样是以键值对的形式进行返回,这里由于代码过长,均不贴出,在URL后面可以指定方式

下面我们进行一个超时的设置

我们需要设置一个超时的时间,在规定时间没有得到相应,就会出现异常,下面我们一百度为例


import urllib.request
response = urllib.request.urlopen("https://www.baidu.com/get",timeout=1)
print(response.read())

这里我们设置的时间是1秒,这里我得到了响应,就没有错误
下面我们把时间进行缩短,让服务器来不及响应

import urllib.request
import socket
import urllib.error
try:
    response = urllib.request.urlopen("https://www.baidu.com/get",timeout=0.1)
    #这个是必须在0.1秒内得到响应,否则就认为是异常的,
except urllib.error.URLError as e:  #这一行是对异常进行捕获
    if isinstance(e.reason,socket.timeout):#判断异常时原因,运用了isinstance这个方法方法,如果是时间超时这一原因就输处timeout
        print("timeout")

E:\anaconda\python.exe F:/python_1/Python2.2.py
timeout
下面我们来说一下响应
  1. 相应的类型
import urllib.request
response = urllib.request.urlopen("https://www.baidu.com")
print(type(response))

E:\anaconda\python.exe F:/python_1/Python2.2.py
<class 'http.client.HTTPResponse'>

<class ‘http.client.HTTPResponse’>这是一个什么要的类型呢,我也很好奇,于是百度了一下[这是他的官网介绍]就是说是一个端口连接协议(https://docs.python.org/3/library/http.client.html)

状态码与响应头

这里我们申请了一下Python官网的状态码与响应头
开始我们要看他是否申请成功,之后的到他的头文件,要提醒一下,getheader只能传输一个头文件信息

import urllib.request
response = urllib.request.urlopen("http://www.python.org")
print(response.status)
print(response.getheaders())
print(response.getheader('Server'))


200
[('Server', 'nginx'), ('Content-Type', 'text/html; charset=utf-8'), ('X-Frame-Options', 'DENY'), ('Via', '1.1 vegur'), ('Via', '1.1 varnish'), ('Content-Length', '48986'), ('Accept-Ranges', 'bytes'), ('Date', 'Sun, 29 Sep 2019 07:24:28 GMT'), ('Via', '1.1 varnish'), ('Age', '1006'), ('Connection', 'close'), ('X-Served-By', 'cache-iad2124-IAD, cache-tyo19930-TYO'), ('X-Cache', 'HIT, HIT'), ('X-Cache-Hits', '1, 1516'), ('X-Timer', 'S1569741869.717681,VS0,VE0'), ('Vary', 'Cookie'), ('Strict-Transport-Security', 'max-age=63072000; includeSubDomains')]
nginx
cookie

cookie是保持登录信息,当我们在爬取信息是就不要再次登录
首先我们班cookie申明为cookiejar.Cookiejar()
接下来我们需要

import http.cookiejar,urllib.request
cookie = http.cookiejar.CookieJar()#cookie用于维持登录状态
handler = urllib.request.HTTPCookieProcessor(cookie)#声明一下对象,HTTPCookieProcessor也是一个对象
opener = urllib.request.build_opener(handler)#利用build_opener吧handler吧这个对象传过来
response = opener.open(("http://www.baidu.com"))#之后我们直接用opener来打开百度,他就会自动被赋值为百度的cookie
for item in cookie:
    print(item.name+"="+item.value)

E:\anaconda\python.exe F:/python_1/Python2.2.py
BAIDUID=ECFD9CF55DC3753F1A0F66EC95B4FEE8:FG=1
BIDUPSID=ECFD9CF55DC3753F1A0F66EC95B4FEE8
H_PS_PSSID=1420_21083_29522_29721_29568_29221
PSTM=1569743355
delPer=0
BDSVRTM=0
BD_HOME=0

因为保持登录信息,因此可以保存为文本文件

import http.cookiejar,urllib.request
filename = "cookie.txt"  # 存储路径
cookie = http.cookiejar.MozillaCookieJar(filename)
#若要把他保存为一个文本文件,需把他声明为CookieJar的子类对象,也可以改为cookie = http.cookiejar.LWPCookieJar(filename),当然存储于读取一致
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open("http://www.baidu.com")
cookie.save(ignore_discard=True,ignore_expires=True)#MozillaCookieJar带有save方法

读取

import http.cookiejar,urllib.request
cookie = http.cookiejar.LWPCookieJar()
cookie.load("cookie.txt",ignore_expires=True,ignore_discard=True)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open("http://www.baidu.com")
print(response.read().decode("utf-8"))

谢谢观看

猜你喜欢

转载自blog.csdn.net/weixin_43999482/article/details/101690210
今日推荐