简简单单的一篇小文章记录下urllib库的使用【python爬虫入门进阶】(02-2)
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。
😁 1. 社区逛一逛,周周有福利,周周有惊喜。码农飞哥社区,飞跃计划
💪🏻 2. Python基础专栏,基础知识一网打尽。 Python从入门到精通
❤️ 3. Ceph实战,从原理到实战应有尽有。 Ceph实战
❤️ 4. Java高并发编程入门,打卡学习Java高并发。 Java高并发编程入门
干货满满,建议收藏,需要用到时常看看。 小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~。
前言
这是一篇很短很短的小短文,这也是一篇很简单很简单的基础文。本文只是平平无奇的记录。没有波澜不惊,没有美女艳照,没有长篇大论。
urllib库是什么
urllib库python的一个最基本的网络请求库,不需要安装任何依赖库就可以导入使用。它可以模拟浏览器想目标服务器发起请求,并可以保存服务器返回的数据。
urllib库怎么使用
1. urllib最简单使用
urllib库的一个最基本方法是 urlopen,该方法通常用于抓取网页内容。
from urllib import request
url = 'http://www.baidu.com'
response = request.urlopen(url)
print(response.read())
通过urlopen 方法抓取网页,它返回的内容是一个urllib.response对象,通过调用response对象的read方法读取数据,读取的数据是一个bytes类型的数据。
urlopen方法的介绍
语法结构:
urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
*, cafile=None, capath=None, cadefault=False, context=None)
参数说明:
- url: 传入的是一个url的字符串,也可以是一个Request对象
- data: 传入的是请求参数,默认为None。
- timeout: 传入超时时间,单位是秒
- cadefault :可忽略
- context: 如果传入的话必须是传入的是ssl,通过该参数可以忽略SSL校验。
读取数据
- read() : 读取所有的数据,类型是bytes类型,如果要转成字符串的话可以
response.read().decode('utf-8')
通过decode(utf-8)
方法转成utf-8的字符串。 - readline() : 读取单行数据
urlretrieve() 方法
urlretrieve方法可以将指定的url的网页内容保存到一个本地的html文件中。
url = 'http://www.baidu.com'
file = 'baidu.html'
request.urlretrieve(url, file)
这里就是将url的内容保存到baidu.html中。
针对https的网页请求
针对HTTPS的请求,通常情况下我们需要传入SSL证书,如果我们没有SSL证书的话,可以在请求的时候忽略SSL证书校验。
from urllib import request
import ssl
#忽略SSL证书校验
context = ssl._create_unverified_context()
url = 'https://blog.csdn.net/u014534808'
response = request.urlopen(url, context=context)
print(response.read().decode('utf-8'))
参数处理
现有如下连接: https://so.csdn.net/so/search?q=线程池&t=blog&u=u014534808&urw=
因为该链接的参数中有中文,所以如果我们直接将该链接传入到urlopen方法中,请求的话会报编码错误。
context = ssl._create_unverified_context()
url = 'https://so.csdn.net/so/search?q=线程池&t=blog&u=u014534808&urw='
response = request.urlopen(url, context=context)
print(response.read().decode('utf-8'))
这时候,我们就需要使用urlencode方法对参数进行编码。然后再组装请求地址,接着调用urlopen方法。
url = "https://so.csdn.net/so/search"
params = {"q": '线程池','t':'blog','u':'u014534808'}
qs = parse.urlencode(params)
url = url +'?'+ qs
res = request.urlopen(url=url, context=context)
print(res.read().decode('utf-8'))
输出结果是:
urlparse方法和urlsplit方法
urlparse方法和urlsplit方法都可以用来分割一个url地址的各个部分。他们唯一的区别是urlsplit可以返回params属性
https://www.baidu.com/s?wd=python&username=abc#1
其中:
- result1.scheme 输出的是请求地址的主题,是http还是https
- result1.netloc 输出的是请求地址的域名
- result1.path 输出的是接口的path,不包括域名
- result1.query 输出的是请求参数
- result1.fragment 输出的是#分割的部分
url = 'https://www.baidu.com/s?wd=python&username=abc#1'
result1 = parse.urlparse(url)
result2 = parse.urlsplit(url)
print(result1)
print(result2)
print('scheme:', result1.scheme)
print('netloc', result1.netloc)
print('path', result1.path)
print('query', result1.query)
print('fragment', result1.fragment)
运行结果是:
传入请求头
通过request.Request的方法可以返回一个Request对象,在该方法中可以传入一个请求头,在请求头中可以传入user-agent和Referer等信息。
from urllib import request, parse
import ssl
url = 'https://www.lagou.com/jobs/positionAjax.json?city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false'
headers = {
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36',
'Referer': 'https://www.lagou.com/jobs/list_Python/p-city_2?&cl=false&fromSearch=true&labelWords=&suginput=',
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
data = {
'first': 'true',
'pn': 1,
'kd': 'Python'
}
context = ssl._create_unverified_context()
req = request.Request(url=url, headers=headers,
data=parse.urlencode(data).encode('utf-8'), method='POST')
resp = request.urlopen(req, context=context)
print(resp.read().decode('utf-8'))
- 点赞
- 收藏
- 关注作者
评论(0)