简简单单的一篇小文章记录下urllib库的使用【python爬虫入门进阶】(02-2)

举报
码农飞哥 发表于 2021/11/22 07:39:26 2021/11/22
【摘要】 简单的urllib库分析

您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦
😁 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)

参数说明:

  1. url: 传入的是一个url的字符串,也可以是一个Request对象
  2. data: 传入的是请求参数,默认为None。
  3. timeout: 传入超时时间,单位是秒
  4. cadefault :可忽略
  5. context: 如果传入的话必须是传入的是ssl,通过该参数可以忽略SSL校验。

读取数据

  1. read() : 读取所有的数据,类型是bytes类型,如果要转成字符串的话可以response.read().decode('utf-8') 通过decode(utf-8) 方法转成utf-8的字符串。
  2. 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

其中:

  1. result1.scheme 输出的是请求地址的主题,是http还是https
  2. result1.netloc 输出的是请求地址的域名
  3. result1.path 输出的是接口的path,不包括域名
  4. result1.query 输出的是请求参数
  5. 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'))
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。