1、urllib库
urllib库是python中一个最基本的网络请求库。可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据。
(1)urlopen函数
在 python3 的 urllib 库中,所有和网络请求相关的方法,都被集到 urllib.request 模块下面了.
urlopen 的函数基本的使用:
urlopen(url, data=None, timeout, proxies=None,context=None)
① url:请求的url。
② date:请求的 date,如果设置了这个值,那么将变成 post 请求。
③ 返回值:返回值是一个 http.cilent.HTTPResponse 对象,这个对象是一个类文件柄对象。有read(size)(按字节读取)、readline(读取第一行)、readlines(读取多行)以及 getcode(获取响应码)等方法。
④timeout:指定超时时间
readlines():适用于需要一次性读取整个文件内容,并且希望将每一行分别处理的场景。例如,处理文本文件时,如果文件不大,可以直接使用 readlines() 方法读取所有行,然后逐行处理。
readline():适用于需要逐行读取大文件的场景。由于每次只读取一行,因此占用内存较少,适合处理大文件。
使用举例
from urllib import request
resp = request.urlopen('http://www.baidu.com')
print(resp.read()) #读取相应数据
运行结果:
实际上,使用浏览器访问百度,右键查看源代码,理论上应该是一样的。(但是实际上你会发现,跟我们刚才打印出来的数据不是一模一样的,由于请求包其他参数不同等原因,与实际还是有略微去区别的)。也就是说,上面的三行代码就已经帮我们把百度的首页的全部代码爬取下来了。
(2)urlretrieve函数:
这个函数可以方便的将网页上的一个文件保存到本地。
request.urlretrieve("网址","下载路径及网站名称(如果没有路径就是表示当前路径)")
以下代码可以非常方便的将百度的首页下载到本地:
from urllib import request
request.urlretrieve("http://www.baidu.com/","baidu.html")
下载图片
from urllib import request
request.urlretrieve("https://img2.baidu.com/it/u=1337068678,3064275007&fm=253&fmt=auto&app=120&f=JPEG?w=500&h=750","1.jpg")
(3)urlencode函数:
用浏览器发送请求的时候,如果url中包含了中文或者其他特殊字符,那么浏览器会自动的给我们进行编码。而如果使用代码发送请求,那么就必须手动的进行编码,这时候就应该使用urlencode函数来实现。urlencode 可以把字典数据转换为URL编码的数据。
示例代码如下:
from urllib import parse
data={'name':'爬虫基础','greet':'hello world','age':100}
qs=parse.urlencode(data)
print(qs)
实际应用:
①当进行百度搜索时,如果使用中文请求会报错,此时就需要对url进行编码:
from urllib import parse
from urllib import request
url='https://www.baidu.com/s?wd=迪丽热巴'
reap=request.urlopen(url)
print(resp.read())
②对中文字符进行编码
from urllib import parse
from urllib import request
url='https://www.baidu.com/s?wd=迪丽热巴'
patams={"wd":"迪丽热巴"}
qs=parse.urlencode(patams)
print(qs)
③编码后可以正常访问
from urllib import parse
from urllib import request
url='https://www.baidu.com/s'
patams={"wd":"迪丽热巴"}
qs=parse.urlencode(patams)
url = url + '?'+ qs
reap=request.urlopen(url)
print(reap.read())
(4)parse-qs函数:
可以将经过编码后的url参数进行解码
from urllib import parse
from urllib import request
url='https://www.baidu.com/s?wd=迪丽热巴'
patams={"wd":"迪丽热巴"}
qs=parse.urlencode(patams)
print(qs)
print(parse.parse_qs(qs))
(5)urlparse和urlsplit:
有时候拿到一个url想要对这个url中的各个组成部分进行分割,那么这时候就可以使用urlparse 或者是urlsplit来进行分割。
urlparse:用于完整解析URL的各个部分,包括协议、域名、端口、路径、参数、查询和锚点
urlsplit:不包含参数(params)字段
区别:
- 参数处理:
urlparse
能够解析URL中的参数(params),而urlsplit
则不包括参数字段。如果URL中包含参数,使用urlparse
更为合适。 - 返回对象类型:
urlparse
返回一个ParseResult
对象,而urlsplit
返回一个SplitResult
对象。尽管两者在功能上有所重叠,但返回的对象类型不同,这在进行类型检查时需要注意。
适用场景:
- urlparse:当你需要完整解析URL的所有部分,包括参数时,使用
urlparse
。 - urlsplit:如果你不需要解析参数部分,或者更倾向于使用不包含参数的URL解析结果,可以使用
urlsplit
。
urlparse使用:
from urllib import parse
url = "https://www.example.com/path;type=docx?query=value#fragment"
print(parse.urlparse(url))
urlsplit的使用
from urllib import parse
url = "https://www.example.com/path;type=docx?query=value#fragment"
print(parse.urlsplit(url))
获取单个属性:
from urllib import parse
url = "https://www.example.com/path;type=docx?query=value#fragment"
a= parse.urlsplit(url)
print("Scheme:", a.scheme)