接口测试 | urllib篇 19 urllib基本示例
时间:2022-05-07
本文章向大家介绍接口测试 | urllib篇 19 urllib基本示例,主要内容包括实例、小结、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
概述
本章就要就urllib中parse、request模块的重点API进行说明,也是以后大家最常用到的API。
- 本文不会列举所有的API。
- 本文以实例方式演示说明API,即直接上代码
实例
- 先看一个基本的实例:
#-*- coding:utf-8 -*-
__author__ = "苦叶子"
import urllib.parse
import urllib.request
if __name__ == "__main__":
print("urllib API实例演示说明")
# 访问百度首页
response=urllib.request.urlopen('http://www.baidu.com')
# 打印下首页是html源码
# 获取完整的响应内容,便于断言其中的特定值
html=response.read()
print(html)
# 打印下http header信息
# 有时候我们需要提前header值来用于下一个请求
header = response.info()
print(header)
# 获取下状态码 http响应的status code
# 接口测试的一个断言,就是断言状态码
status_code = response.getcode()
print(status_code)
# 打印下本次请求的目标url
url = response.geturl()
print(url)
- 下面我们基本的爬虫实例
我们尝试爬取下博客园首页的一些链接。
注意:需要用到前基础篇html.parser模块相关是技术
#-*- coding:utf-8 -*-
__author__ = "苦叶子"
import urllib.parse
import urllib.request
from html.parser import HTMLParser
class BlogHTMLParser(HTMLParser):
data = []
data_key = ""
def __init__(self):
HTMLParser.__init__(self)
self.is_a = False
def handle_starttag(self, tag, attrs):
# 处理开始为a的标签
if tag == "a":
self.is_a = True
for name,value in attrs:
if name == "href":
# 提取a的href属性值
self.data_key = value
def handle_data(self, data):
# 处理结束为a的标签
if self.is_a and self.lasttag == "a":
# 将a标签的href属性值作为key, a的文本作为data构建字典
self.data.append({self.data_key : data})
def handle_endtag(self, tag):
# 处理a结束标签
if self.is_a and self.lasttag == "a":
self.is_a = False
def get_data(self):
# 返回所有从a中提取到的目标数据
return self.data
if __name__ == "__main__":
print("urllib爬取博客园首页实例演示说明")
url = "https://www.cnblogs.com/"
# 访问首页
response = urllib.request.urlopen(url)
# 获取首页的html
data = response.read().decode(encoding="utf-8")
# 提取所有的链接
blogHtmlParser = BlogHTMLParser()
blogHtmlParser.feed(data)
links = blogHtmlParser.get_data()
print(links)
小结
在做爬虫的一些基础研究、学习时,建议能多多使用urllib,加深、加强对http的理解和掌握。
- Swift学习资源
- 稳扎稳打JavaScript(三)——创建对象的几种方式
- 快速教程:使用Cython来扩展Python/NumPy库
- 稳扎稳打JavaScript(四)——闭包
- JavaScript奇淫技巧(一)
- 动态规划法(四)——0/1背包问题
- 动态规划法(三)——最长公共子序列
- Python数据分析模块 | pandas做数据分析(三):统计相关函数
- 动态规划法(二)——弗洛伊德算法
- Python数据分析模块 | pandas做数据分析(二):常用预处理操作
- 贪心算法(一)——概述
- Python数据分析模块 | pandas做数据分析(一):基本数据对象
- 贪心算法(二)——一般背包问题
- 贪心算法(三)——最佳合并模式
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 0797-使用HDP或CDP的Atlas采集CDH6的元数据和血缘
- 现代通信理论与新技术 PPT笔记整理
- 找找规律——LeetCode题目6:Z字形变换
- 给你点信心——LeetCode题目7:整数反转
- Python -二叉树 创建与遍历算法(很详细,转自国外教程)
- APP流量来源追踪方式——Android篇
- 从浏览器输入网址回车到看到页面过程到底经历了什么?
- Flutter Bloc 官方文档(BlocBuilder翻译)
- OpenGL ES 3.0 | 统一变量和属性的概念与(在程序中的)获取流程、统一变量缓冲区对象详解、std140块规范、用 命名统一变量块 建立 统一变量缓冲区对象 的流程 和 相关API 和...
- 深入浅出SVM(PART III)
- 高频原题——LeetCode题目8:字符串转换整数 (atoi)
- 不转字符串判断——LeetCode题目9:回文数
- 关于双指针的简单理解
- 面试题噩梦之一——LeetCode题目10:正则表达式匹配
- 什么时候触发GC