urllib库

urllib库

urllib库是Python中一个最基本的网络请求库。可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据

urlopen函数

在Python3的urllib库中,所有和网络请求相关的方法,都被集到 urllib.request 模块下面了,先来看下urlopen的基本使用

注意:点击函数名按 ctrl+B 查看原函数

from urllib import request
resp = request.urlopen('http://www.baidu.com')
print(resp.read())

实际上,使用浏览器访问百度,右键查看源代码。会发现,和打印出来的数据一样。将百度首页的全部代码爬取下来了
urlopen详解:

  1. url:请求的url
  2. data:请求的data,如果设置了值,那么将变成post请求
  3. 返回值:返回一个http.client.HTTPResponse对象,这个对象是一个类文件句柄对象。有read(size)、readline、readlines以及getcode等方法
#http.client.HTTPResponse
print(resp)
#<http.client.HTTPResponse object at 0x7f6466e926a0>

#read(size) 返回读取的size字节
print(resp(100))
#b'<html>\n<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">\n</html>\n'

#readline() 读取第一行
print(resp.readline())
#b'<html>\n'

#readlines() #将返回数据以多行形式输出
print(resp.readlines())
#[b'<html>\n', b'<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">\n', b'</html>\n']

#getcode() 返回读取状态
print(resp.getcode())
#200

urlretrieve函数

这个函数可以方便地将网页上一个文件保存到本地。以下代码可以非常方便地将百度的首页下载到本地

urlretrieve(下载地址,保存位置)

from urllib import request
request.urlretrieve("http://www.jd.com",'jd.html')
#在当前文件夹下载jd页面的HTML信息

#下载网页的图片
request.urlretrieve("https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=%E7%8E%8B%E8%80%85%E8%8D%A3%E8%80%80&step_word=&hs=0&pn=1&spn=0&di=12580&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=0&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=undefined&cs=4053057958%2C345713954&os=2814340062%2C2070393791&simid=0%2C0&adpicid=0&lpn=0&ln=1641&fr=&fmq=1586483919885_R&fm=&ic=undefined&s=undefined&hd=undefined&latest=undefined&copyright=undefined&se=&sme=&tab=0&width=undefined&height=undefined&face=undefined&ist=&jit=&cg=&bdtype=11&oriquery=&objurl=http%3A%2F%2F03imgmini.eastday.com%2Fmobile%2F20200405%2F20200405174709_063e921c2a143d16c37bd2e1239c6301_3.jpeg&fromurl=ippr_z2C%24qAzdH3FAzdH3Ffr56pf_z%26e3Bjwfp1wy_z%26e3Bv54AzdH3FwAzdH3Fdaa9ac8090allnbaaaaaa_z%26e3Bip4s&gsm=2&rpstart=0&rpnum=0&islist=&querylist=&force=undefined",'anqila.jpg')

在这里插入图片描述
右键打开文件夹位置,打开就是jd页面

参数编码和解码函数

urlencode函数

用浏览器发送请求时,如果url中包含了中文或其他特殊字符,浏览器会自动编码。如果使用代码发送请求,需手动编码,通过urlencode实现。urlencode可将字典转换为url编码格式的数据,,示例代码如下:

from urllib import parse
data = {'name':'爬虫基础','greet':'hello world','age':10}
qs = parse.urlencode(data)
print(qs)
#返回值 
#name=%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80&greet=hello+world&age=10

模拟百度查询刘德华

from urllib import request
from urllib import parse
re=request.urlopen("http://www.baidu.com")
url = 'http://www.baidu.com/s?'
param = {"wd":"刘德华"}
url_param = parse.urlencode(param)
full_url = url + url_param
print(full_url)
qs = request.urlopen(full_url)
print(qs.readline())
#返回值
# http://www.baidu.com/s?wd=%E5%88%98%E5%BE%B7%E5%8D%8E
# b'<!DOCTYPE html>\n'

parse_qs函数

可将经过编码的url参数进行解码

#解码parse_qs
from urllib import parse
qs = 'name=%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80&greet=hello+world&age=10'
print(parse.parse_qs(qs))
#返回值
#{'name': ['爬虫基础'], 'greet': ['hello world'], 'age': ['10']}

urlparse和urlsplit

有时候拿到一个url,想要对这个url进行分割,可以使用urlparse或者urlsplit
区别是urlsplit函数没有params属性

from urllib import parse
url = 'http://www.baidu.com/s?username=zhiliao'
#对比urlsplit,urlparse函数时,开启关闭注释
result = parse.urlsplit(url)
#SplitResult(scheme='http', netloc='www.baidu.com', path='/s', query='username=zhiliao', fragment='')
result = parse.urlparse(url)
#ParseResult(scheme='http', netloc='www.baidu.com', path='/s', params='', query='username=zhiliao', fragment='')
print(result)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值