urlib库是Python中一个最基本的网络请求库。可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据。
导入urlib库常用模块:
import urllib.request
import urllib.error
import urllib.parse
【常见函数】:
在Python3的urllib库中,所有和网络请求相关的方法,都被集到urllib.request模块下面了
1、urlopen函数
打开链接,获取网页内容元素
url="http://wthrcdn.etouch.cn/weather_mini?city={}".format(city)
#打开网址,读取数据 返回http对象 默认为get请求
r=urllib.request.urlopen(url)
print(r.read())
详解:
(1)url:请求的网络url;
(2)data:请求的data,如果设置了这个值,那么将变成post请求。默认为get请求。
(3)返回值:返回值是一个http.client.HTTPResponse对象,这个对象是一个类文件句柄对象。有read(size)、readline、readlines以及getcode等方法。
2、urlretrieve函数
该函数可以方便的将网页上的一个文件保存到本地。
from urllib import request
request.urlretrieve('http://www.baidu.com/','baidu.html')
3、urlencode函数
用浏览器发送请求的时候,如果url中包含了中文或者其他特殊字符,那么浏览器会自动的给我们进行编码。而如果使用代码发送请求,那么就必须手动进行编码,这时候就应该使用urlencode函数来实现(否则将无法识别)。
urlencode()可以把字典数据转换为URL编码的数据。,以字符串字典的形式,通过通过urlencode()编码,为url的查询字符串传递数据,编码后的params为字符串,字典每项键值对以“&"连接。
from urllib import parse
data = {'name':'爬虫基础','greet':'hello world','age':100}
qs = parse.urlencode(data)
print(qs)
4、parse_qs函数
实现将经过编码后的url参数进行解码
from urllib import parse
qs = "name=%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80&greet=hello+world&age=100"
print(parse.parse_qs(qs))
5、urlparse和urlsplit函数
有时候拿到一个url,想要对这个url中的各个组成部分进行分割,那么这时候就可以使用urlparse或者是urlsplit来进行分割。urlparse和urlsplit:
urlparse和urlsplit基本上是一模一样的。唯一不一样的地方是,urlparse里面多了一个params属性,而urlsplit没有这个params属性。
6、quote()函数
传递中文参数。在进行URL拼接时,直接输入中文会导致编码错误,因此需要使用quote()函数对该中文关键字进行URL编码,编码后再进行URL拼接,相应的,可以使用unquote()函数进行解码。
# 接收用户输入的关键字
keywords=urllib.request.quote(input("请输入需查找的歌曲关键字:"))
# 查找地址拼接
url="https://autumnfish.cn/search?keywords={0}".format(keywords)
#打开网址,读取数据
r=urllib.request.urlopen(url)
7、request.Request()
在请求的时候增加一些请求头
作用:有时爬取一些网页时,会出现403错误(禁止访问),这是应为网站服务器会对访问者的headers属性进行身份验证,例如,通过urllib库发送的请求,默认以"Python-urllib/X.Y"作为User-agent,所以,需要通过urllib.request.Request()构建Request对象,传入字典形式的headers属性,模拟浏览器。
相应的headers信息,可通过浏览器的开发者调试工具,即“检查”——“Network"标签查看到相应的网页得到。
from urllib import request, parse
# 设定头部信息
header = {
# 伪装成浏览器
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'
}
data = {
'first':'true'
}
url = 'https://www.baidu.com/'
# data需要使用urlencode进行转码
req = request.Request(url, headers=header, data=parse.urlencode(data).encode('utf-8'))
resp = request.urlopen(req)
print(resp.read().decode('utf-8'))
【完整网页爬取流程】:
(简单demo,其他功能根据项目需求进行修改)
第一步、发送请求
# 接收用户输入的关键字
keywords=urllib.request.quote(input("请输入需查找的歌曲关键字:"))
# 查找地址拼接
url="https://autumnfish.cn/search?keywords={0}".format(keywords)
#打开网址,读取数据
r=urllib.request.urlopen(url)
第二步、读取响应内容
使用read()读取响应内容到内存中,该内容为网页的源代码,并可对返回的字符串进行相应解码,即使用decode()函数。
# 返回byte形式
r.read()
【补充】:
①encode():进行编码,unicode编码的字符串----->二进制文件(byte)
②decode():进行解码,二进制文件(byte)------->unicode编码的字符串
【使用JSON库对内容进行解析】:
import json
# 将解码后的内容(bytes形式)转化为json格式,返回json对象
weather=json.loads(f.read().decode('utf-8'))
JSON数据格式:
===》 key:value
{}表示字典对象 ====>通过访问字典的形式访问 对象名[‘key’]
[]表示数组对象 ====>通过访问数组的形式访问 对象名[’索引’]