urllib库学习笔记(个人总结)

python爬虫学习笔记

学习时间:大二第二学期(2020年上半年)
上课总结笔记
作者:YRH
写的有些粗糙
如需转载,请备注出处

一. Urllib库学习

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)

其中常用的参数有:

  • url:应该是一个含有一个有效的统一资源定位地址的字符串
  • data:数据必须是指定要发送到服务器的其他数据对象,如果不需要这些数据,则为None就是get,
    有就是poss去访问。他支持的是字节型的。所以传进去的要转换成字节型,利用bytes()来转
    换成字节,因为这个需要用str来转换所以要将需要转换的字节型转换成字符串类型,用
    urllib.parse.urlencode(dicr)
  • header,应该是一个字典,将User-Agent进行转换模拟一个浏览器进行访问
  • urlencode():可以将字节键值按URL编码转换,被web接受
  • method:有两个参数,一个是get一个是post
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())

你可能感兴趣的:(python爬虫,python,大数据,http)