urllib库

    技术2022-07-14  63

    声明:本文知识点解释部分大部分来自21天搞定Python分布式爬虫教学视频

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

    文章目录

    1. urlopen函数2. urlretrieve函数3. urlencode函数4. parse_qs函数5. urlparse函数和urlsplit函数


    1. urlopen函数

    在Python3的urllib库中,所有和网络请求相关的方法,都被集成到了urllib.request模块下面了。

    基本用法:

    from urllib import request # 从urllib导入request库 resp = request.urlopen('http://www.baidu.com') print(resp.read()) # 读取百度网页的源代码,并打印

    下面对urlopen进行详细说明:

    参数url:请求的url参数data:如果设置了这个值,将变为post请求返回值:返回值是一个http.client.HTTPResponse对象,这个对象是一个类文件句柄对象

    http.client.HTTPResponse对象有read(< size >)、readline()、readlines()、getcode()等方法

    read(< size >):返回源代码的前size个字母readline():返回源代码的一行readlines():返回一个列表,列表的元素均为源代码的一行getcode():返回状态码

    2. urlretrieve函数

    该函数可以将某个url下载到本地。 基本用法:

    from urllib import request request.urlretrieve('http://www.baidu.com/', 'baidu.html')

    该语句表示:将www.baidu.com的源码下载到本地的一个文件夹中,并命名为baidu.html。

    此外,还可以用该函数从网站上下载一个图片,比如:

    from urllib import request request.urlretrieve('https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1593714637497&di=3909581542fd82fdb24e5e3edebd975b&imgtype=0&src=http://a0.att.hudong.com/56/12/01300000164151121576126282411.jpg', 'image1.jpg')

    3. urlencode函数

    在浏览器上进行搜索时,如果url中包含了中文或者其他特殊字符,那么浏览器会自动的对这些内容进行编码,并且如果将这段URL复制到文本文件或者是IDE中,相应的部分也会被自动编码。但是,如果用代码发出请求,那么必须对这些内容手动进行编码,否则会报错。此时可以利用urlencode函数实现。urlencode函数可以将字典数据转换为URL编码的数据。

    没有手动编码的代码:

    from urllib import request url = 'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=刘德华' resp = request.urlopen(url) print(resp.read())

    报错:UnicodeEncodeError: 'ascii' codec can't encode characters in position 51-53: ordinal not in range(128)

    经过手动编码的代码:

    from urllib import request from urllib import parse # urlencode需要导入parse库 url = 'https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&' params = {'wd': '刘德华'} # 需要编码的部分,放入一个字典中 qs = parse.urlencode(params) # 进行编码,返回一个字符串 url = url + qs # 加到url后面 resp = request.urlopen(url) print(resp.read())

    此时可以正常运行

    4. parse_qs函数

    parse_qs与urlencode互为逆过程,即解码。比如:

    from urllib import request from urllib import parse # parse_qs也需要导入parse库 params = {'name': '百度', 'age': '18', 'motto': 'hello world'} qs = parse.urlencode(params) print(qs) result = parse.parse_qs(qs) print(result)

    5. urlparse函数和urlsplit函数

    在爬虫前缀知识这篇文章中说到,url的由若干个部分组成。而这两个函数可以将这若干个部分分离出来。比如:

    from urllib import parse # 协议: http # 服务器: www.baidu.com # 路径: /s # 查询串: wd=python&username=abc # 锚点: 1 url = 'http://www.baidu.com/s?wd=python&username=abc#1' result1 = parse.urlparse(url) result2 = parse.urlsplit(url) print(result1) print(result2)

    结果如下: 可以看到,二者的区别在于:urlparse返回的结果中有params,而urlsplit没有

    Processed: 0.020, SQL: 10