欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-11 21:54:24
python爬虫学习笔记学习时间:大二第二学期(2020年上半年)上课总结笔记作者:YRH写的有些粗糙如需转载,亲备注出处一. Urllib库学习Urllib库是一个python内置的http请求库,不需要安装,只需要导入和url或者其他参数的传入即可。Urllib也是学爬虫的第一个基础库。主要模块有:urllib.request:用来打开和读取URL,是一个请求模块urllib.error:包含了urllib.request产生的异常,是一个异常处理模块urllib.parse:用...

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())

本文地址:https://blog.csdn.net/weixin_45066966/article/details/107883112