文章目录
概述
urllib是Python自带的标准库。官方文档https://docs.python.org/3.7/library/urllib.html。
查看官方文档,发现Urllib库有6个py文件,统共是4个模块,如下所示。
文件名 | 模块 | 代码量 | 有效代码量 |
---|---|---|---|
__init__.py | - | 0 | |
request.py | urllib.request请求模块 | 2740行 | 推测1000行 |
response.py | - | 80行 | 70行 |
error.py | urllib.error异常处理模块 | ||
parse.py | urllib.parse是url解析模块 | 1048行 | 推测800行 |
robotparser.py | urllib.robotparser是robots.txt解析模块 |
源码量略大,遵循二八法则,先通过网上资料掌握常用的使用方法。
测试网址httpbin.org,它可以提供 HTTP 请求测试。
urllib.request模块
文档说明(暂时只需了解)
官方文档:https://docs.python.org/3/library/urllib.request.html#module-urllib.request
初步需要掌握常用的函数。接下来简单介绍文档结构。
1. 六个函数方法:urlopen()、install_opener()、build_opener()、pathname2url)、url2pathname()、getproxies();
2. 很多类:Request()、OpenerDirector、BaseHandler、HTTPDefaultErrorHandler、
HTTPRedirectHandler、HTTPCookieProcessor()、ProxyHandler();
3. 各个类中包含的objects,主要内容是其中的函数方法。
4. 使用示例Examples
5. 遗留接口Legacy interface,包含Python2的部分函数和类。
实践操作(关键点)
请求的1个函数方法和1个class对象
函数 | 简要说明 |
---|---|
urllib.request.urlopen(url, data, timeout) | data是字典格式,返回响应实例response |
urllib.request.Request() | class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None |
urlopen()函数的data是可选的,传递data参数即选择Post传参方式,要求格式是byte。
当我们不需要添加任何请求头信息时,使用urlopen()函数更加方便。
urlopen() 方法可以实现最基本的请求发起,但如果请求中需要加入headers等信息,那么我们可以利用Request类构建一个请求。(将请求独立成一个对象,方便配置参数)
操作 | 简要说明 |
---|---|
创建Request请求实例 | request = urllib.request.Request(url) |
利用Request请求实例 | response = urllib.requset.urlopen(request) |
参数data | 必须传bytes类型,如果是一个字典,可以先用 urllib.parse.urlencode() 编码 |
参数headers | 是一个字典,可以通过headers参数传递,或add_header()添加请求头 |
参数method | 传参方式,比如Get、Post、Put等 |
处理response实例常用的7种基本方式
函数 | 简要说明 |
---|---|
1.类实例response | HTTPResposne类型实例,打印得到class信息 |
2.读取网页response.read() | 读取网页内容,返回二进制格式 |
response.read().decode(‘utf-8’) | 输出UTF-8格式数据,包括中文 |
response.readline() | 返回二进制格式页面的第一行 |
response.readlines() | 以列形式返回二进制数据,每行是一个元素 |
3.读取响应信息response.getcode() | 获取状态码 |
response.getheaders() | 获取列表形式响应头,即BP抓包看到的响应头信息 |
response.getheader(‘Server’) | 获取指定的响应头 |
urllib.request高级特性
上面我们虽然可以构造 Request ,但是一些更高级的操作,比如 Cookies 处理,代理该怎样来设置?接下来就需要更强大的工具 Handler 登场了。
简而言之你可以把它理解为各种处理器,有专门处理登录验证的,有处理 Cookies 的,有处理代理设置的,利用它们我们几乎可以做到任何 HTTP 请求中所有的事情。
遇见的问题:
__pycache__缓存文件
疑问
查看python\Lib\urllib目录,对比官方文档源码文件,发现目录下存在六个urllib库的源码py文件,但是还有一个名为__pycache__的py缓存目录,什么机制?
解答
现象:第一次运行python工程时,在目录下总会生成一个__pycache__文件夹,里面是与py文件同名的pyc或pyo文件。
python的基本运行机制:python是脚本语言,运行python程序不需要编译,而是边解释边运行。优势是可以直接运行程序,劣势是运行效率较慢。具体点就是,Python解释器会把源码转换成字节码,而不是二进制代码,然后使用解释器执行这些字节码。
缓存文件夹:Python解释器编译py脚本文件,并将编译结果保存到__pycache__目录。下次执行时,如果解释器发现py脚本没有修改过,那么就不再编译,而直接运行缓存目录中的pyc文件。优势是,在工程较大时可以大大缩短项目运行前的准备时间。
参考
概述
《python爬虫从入门到放弃(三)之 Urllib库的基本使用》
文章地址https://www.cnblogs.com/zhaof/p/6910871.html
urllib.request模块
《python urllib如何获取http状态码》,2013-02
https://blog.csdn.net/weixin_34110749/article/details/91759411
《urllib获取响应后的六种基本处理和常见状态码》,2018-10
https://blog.csdn.net/Watson_Ashin/article/details/83444478
《urllib.request详细介绍》,2019-03
https://blog.csdn.net/qq_43546676/article/details/88777227
遇到问题
《为什么python不需要编译而c++需要_C++ or Python 这个选择题该怎么做?》
https://blog.csdn.net/weixin_39986435/article/details/110896871
《运行Python脚本时生成的__pycache__文件夹》,2017-06
https://blog.csdn.net/index20001/article/details/73501375