学习时间:大二第二学期(2020年上半年)
上课总结笔记
作者:YRH
写的有些粗糙
如需转载,请备注出处
Urllib库是一个python内置的http请求库,不需要安装,只需要导入和url或者其他参数的传入即可。
Urllib也是学爬虫的第一个基础库。
主要模块有:
urllib.request:用来打开和读取URL,是一个请求模块
urllib.error:包含了urllib.request产生的异常,是一个异常处理模块
urllib.parse:用来解析和处理URL,是一个解析模块
urllib.robotparse:用来解析页面的robots.txt
1.打开和读取URL
urllib.request.urlopen(url,data=None,timeout)
url:打开的网站,可以是url地址,也可以是urllib.request.Reques对象
data:用于指明发往服务器请求中额外的参数信息,data默认是None此时已GET方式发送请求,当用户给出data参数的时候,改为POST方式发送请求;
timeout:设置网站的访问超时时间
2.get请求方式
get请求方式不需要传入data参数,只需进行url传入
例如:
import urllib.request
reponse = urllib.request.urlopen("http://www.baidu.com")
print(reponse.read().decode('utf-8'))
这里的.read()是读取请求结果的页面,decode(‘utf-8’)是进行返回结果的解码
3.post请求方式
post请求就是需要传入data参数了,因为data参数需要bytes类型的,所以需要使用bytes()函数进行编码,而bytes函数的第一个参数需要时str类型,所以使用urllib.parse.urlencode将字典转化为字符串。
例如:
import urllib.request
import urllib.parse
# 需要传入的data内容
data = {
"name": "python"
}
# 将data进行转码
data = bytes(urllib.parse.urlencode(data),encoding='utf-8')
reponse = urllib.request.urlopen("http://www.baidu.com",data = data)
print(reponse.read())
这里的bytes()是将字典转换成bytes类型,而这个函数他的参数需要的是字符串类型,所以运用urllib.parse.urlencode(data)将字典转换成字符串类型
4.urlopen()方法中常用的方法
read():对HTTPResponse类型数据进行读取操作:u.read()
type():查看返回类型:type(u.read)
getcode():返回Http状态码,同时status属性:u.getcode(),返回200表示成功
geturl():返回请求的url:u.geturl()
info():表示远程服务器返回的头部信息,以字典形式:u.info()
getheaders():表示远程服务器返回的头部信息:u.getheaders()
getheader(‘Server’):表示远程服务器返回的头部信息中Server字段的值:u.getheader(‘Server’)
5.Requests简介
urlopen()方法可以实现最基本的请求的发起,但如果要加入Headers等信息,就可以利用Request类来构造请求。
基本格式为:
urllib.request.Request(url, data=None, headers=
{
},origin_req_host=None,unverifiable=False, method=None)
其中常用的参数有:
import urllib.request
import urllib.parse
url = 'http://httpbin.org/post'
# 模拟一个User-Agent
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64)......'
}
data = {
'name': 'cathy'
}
data = bytes(urllib.parse.urlencode(data), encoding='utf-8')
req = urllib.request.Request(url=url, data=data, headers=headers, method='POST')
response = urllib.request.urlopen(req)
print(response.read().decode('utf-8'))
6.urllib异常处理
urllib.error:用来处理异常(要处理异常需要引入这个快)
URLError:产生原因包括本地网络未连接、服务器不存在或链接不到指定服务器
HTTPError是URLError的子类,HTTP状态码表示HTTP协议所返回的响应的状态
例如:
import urllib.error
import urllib.request
try:
response = urllib.request.urlopen("http://www.baidu.com", timeout=0.01)
print(response.read().decode("utf-8"))
except urllib.error.URLError as e: #获取捕捉的异常给e
print(e.reason) #输出异常
7.打印url信息
urllib.parse:用来解析URL
url.parse:定义了url的标准接口,实现url的各种操作;
parse模块的使用:url的解析,合并,编码,解码
urlparse():url解析
这里他将会返回:
scheme:表示协议
netloc:域名
path:路径
params:参数
query:查询条件,一般都是get请求的url
fragment:锚点,用于直接定位页面下拉位置,挑战到页面的指定位置
打我们使用这个类时他都会返回6个内容,如果其中一个是空的,他也照样返回
import urllib.request
response=urllib.request.urlopen('http://www.baidu.com')
print(type(response))
import urllib.request
response = urllib.request.urlopen('http://www.baidu.com')
print(response.status) # 状态码 判断请求是否成功
print(response.getheaders()) # 响应头 得到的一个元组组成的列表
print(response.getheader('Server')) #得到特定的响应头
print(response.read().decode('utf-8')) #获取响应体的内容,字节流的数据,需要转成utf-8格式
8.url的合并
urlunparse()用来组装
我们可以将url解析也能将他合并
from urllib.parse import urlunparse
data=['http','www.baidu.com','index.html','','a=6','']
print(urlunparse(data))
在这里必须给六个值,如果没有也得给个空值
他这里返回的就是一个完整的URL代码
当我们在访问一个网站是,read()返回的不是中文的我们可以使用decode("utf-8)方法
如:
(.decode("utf-8))
如:u.read().decode(“utf-8”)
小例子做个结尾
import urllib.request
import urllib.parse
url = "https://movie.douban.com/top250"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
}
req = urllib.request.Request(url=url,headers=headers)
response = urllib.request.urlopen(req)
print(response.read())