如下代码中是urllib库中常用的方法及对应的使用说明:
from urllib import request, error
from urllib.parse import urlparse, urlsplit, urljoin, urlencode, parse_qs, parse_qsl, quote, unquote
from urllib.robotparser import RobotFileParser
if __name__ == "__main__":
"""
timeout:设置超时时间,超过时间会报错
:return:
"""
# response = request.urlopen('https://baijiahao.baidu.com/s?id=1795283943822250715&wfr=spider&for=pc',
# timeout=1)
'''
也可以通过Request对象的方式去构建
def __init__(self, url, data=None, headers={},
origin_req_host=None, unverifiable=False,
method=None):
url 用于请求 URL,这是必传参数,其他都是可选参数。 url='https://baijiahao.baidu.com/s?id=1795283943822250715&wfr=spider&for=pc'
data
headers 是一个字典,它就是请求头,既可以通过 headers 参数直接构造,也可以通过调用请求实例的 add_header() 方法添加
headers = {
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
'Host': 'httpbin.org'
}
origin_req_host 请求方的主机或者IP地址
unverifiable 代表请求是否是可以被验证的 默认为false
method 是一个字符串,用来指示请求使用的方法,比如 GET、POST 和 PUT 等 method = POST
'''
try:
request1 = request.Request(url='https://baijiahao.baidu.com/s?id=1795283943822250715&wfr=spider&for=pc')
response = request.urlopen(request1)
# error 可以用来处理异常
except error.URLError as e:
print(e.reason)
# 读取文档并进行解码
print(response.read().decode('utf-8'))
# 获取头信息
print(response.getheaders())
# 获取访问的URl
print(response.geturl())
# 获取code状态码
print(response.getcode())
"""
urlparse进行数据解析,结果如下:拆解结果为以下六个部分
ParseResult(scheme='https', netloc='baijiahao.baidu.com', path='/s', params='', query='id=1795283943822250715&wfr=spider&for=pc', fragment='')
scheme 代表的是协议
netloc 代表的是域名
path 代表的是访问路径
params 代表的是参数
query 代表的是查询条件
fragment 代表的是
allow_fragments=False 参数是是否会忽略allow_fragments 默认是true
"""
parse = urlparse('https://baijiahao.baidu.com/s?id=1795283943822250715&wfr=spider&for=pc', allow_fragments=False)
print(parse)
"""
二者结果对比,urlsplit不会解析params
ParseResult(scheme='https', netloc='baijiahao.baidu.com', path='/s', params='', query='id=1795283943822250715&wfr=spider&for=pc', fragment='')
SplitResult(scheme='https', netloc='baijiahao.baidu.com', path='/s', query='id=1795283943822250715&wfr=spider&for=pc', fragment='')
"""
split = urlsplit('https://baijiahao.baidu.com/s?id=1795283943822250715&wfr=spider&for=pc', allow_fragments=False)
print(split)
"""
可以对url进行拼接
https://baijiahao.baidu.com/s?id=1795283943822250715&wfr=spider&for=pc
"""
joinurl = urljoin('https://baijiahao.baidu.com', '/s?id=1795283943822250715&wfr=spider&for=pc')
print(joinurl)
"""
urlencode 将字典或者由键值对组成的序列转换为URL编码的字符串,这个字符串可以用于GET请求的查询字符串或者POST请求的数据。
www.baidu.com?name=%E5%BC%A0%E4%B8%89&age=18
"""
params = {
'name': '张三',
'age': 18
}
baseurl = 'www.baidu.com?'
url = baseurl + urlencode(params)
print(url)
"""
parse_qs 将URL编码的字符串转换为字典
{'name': ['张三'], 'age': ['18']}
"""
urlqs = 'name=%E5%BC%A0%E4%B8%89&age=18'
print(parse_qs(urlqs))
"""
parse_qsl 将URL编码的字符串转换为元组
[('name', '张三'), ('age', '18')]
"""
urlqs = 'name=%E5%BC%A0%E4%B8%89&age=18'
print(parse_qsl(urlqs))
"""
quote 将内容转化为 URL 编码的格式
%E5%BC%A0%E4%B8%89
unquote 解码
张三
"""
print(quote('张三'))
print(unquote('%E5%BC%A0%E4%B8%89'))
"""
robotparser 用来解析robot协议
"""
r = RobotFileParser()
r.set_url("https://www.baidu.com/robots.txt")
# 读取并解析指定的url 该方法不会返回结果,但对文件进行了读取操作,这一步必须调用,如果不调用,则接下来的判断均为False;
r.read()
# 判断是否可以抓取内容
print(r.can_fetch('Baiduspider', 'https://www.baidu.com'))