python网络爬虫系列(一)——urllib库(urlopen、urlretrieve、urlencode、parse-qs、urlparse和urlsplit、request.Request类)

urllib库

urllib库是Python中一个最基本的网络请求库。可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据。

一、urlopen函数:

在Python3的urllib库中,所有和网络请求相关的方法,都被集到urllib.request模块下面了,以先来看下urlopen函数基本的使用:

from urllib import parse,requestresp=request.urlopen('http://www.baidu.com')
print(resp.read())

在这里插入图片描述

实际上,使用浏览器访问百度,右键查看源代码。你会发现,跟我们刚才打印出来的数据是一模一样的。也就是说,上面的三行代码就已经帮我们把百度的首页的全部代码爬下来了。一个基本的ur请求对应的python代码真的非常简单。
以下对urlopen函数的进行详细讲解:

  1. ur1:请求的url。
  2. data:请求的data,如果设置了这个值,那么将变成post请求。
  3. 返回值:返回值是一个http.client.HTTPResponse对象,这个对象是一个类文件句柄对象。有read(size)readlinereadlines以及 getcode等方法。

二、urlretrieve函数:

这个函数可以方便的将网页上的一个文件保存到本地。以下代码可以非常方便的将百度的首页下载到本地:

request.urlretrieve("http://www.baidu.com/""baidu.html"

在这里插入图片描述

三、urlencode函数:

用浏览器发送请求的时候,如果url中包含了中文或者其他特殊字符,那么浏览器会自动的给我们进行编码。而如果使用代码发送请求,那么就必须手动的进行编码,这时候就应该使用urlencode函数来实现。urlencode 可以把字典数据转换为URL编码的数据。
示例代码如下:

from urllib import parse
data={'name':'爬虫基础','greet':'hel1o world','age':100}
qs=parse.urlencode(data)
print(qs)

在这里插入图片描述

四、parse-qs函数:

可以将经过编码后的url参数进行解码.示例代码如下:

from urllib import parse 
qs="name=%E7%88%AC%E8%99%AB%E5%9F%BA%E7%A1%80&greet=hel1o+world&age=100"
print(parse.parse_qs(qs))

在这里插入图片描述

五、urlparse和urlsplit:

有时候拿到一个url想要对这个url中的各个组成部分进行分割,那么这时候就可以使用urlparse 或者是urlsplit来进行分割。

urlparse VS urlsplit:
urlparse和urlsplit基本上是一模一样的。唯一不一样的地方是,'urlparse里面多了一个params属性,而urlsplit 没有这个params 属性。
比如有一个ur1为:url=“http://www.baidu.com/s;he116wd=python&username=abc#1”,那么urlparse可以获取到hello,而urlsplit不可以获取到ur1中的params。不过params也用得比较少。

示例代码如下:

from urllib import parse# urlparse()函数,可以对url中的各个组成部分进行分割
url = 'http://www.baid.com/s;hello?wd=python&username=abc#1'
result = parse.urlparse(url)
print(result)
print('sheme:',result.scheme)
print('netloc:',result.netloc)
print('path:',result.path)
print('params:',result.params)
print('query:',result.query)
print('fragment:',result.fragment)
print("___________________________________________________")# urlsplit()函数,可以对url中的各个组成部分进行分割。
# 与urlparse()函数的区别是获取不到params参数
url = 'http://www.baid.com/s;hello?wd=python&username=abc#1'
result1 = parse.urlsplit(url)
print(result1)
print('sheme:',result1.scheme)
print('netloc:',result1.netloc)
print('path:',result1.path)
print('query:',result1.query)
print('fragment:',result1.fragment)

在这里插入图片描述

六、request.Request类:

如果想要在请求的时候增加一些请求头,那么就必须使用request.Request类来实现。比如要增加一个user-Agent,示例代码如下:
在这里插入图片描述

from urllib import request,parse# url = 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='# resp = request.urlopen(url)
# print(resp.read())url='https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'
headers = {'User-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36','Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=','cookie':'JSESSIONID=ABAAAECABFAACEA3AD765CDE843CA586D421446C532914E; WEBTJ-ID=20200705115323-1731d1b6bc825-0405fa83b8e6d6-4353760-1327104-1731d1b6bc9384; RECOMMEND_TIP=true; _ga=GA1.2.46425096.1593921203; _gid=GA1.2.826525276.1593921203; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1593921203; user_trace_token=20200705115324-c8c6fa59-8a84-4396-8006-b333350a1ba3; LGUID=20200705115324-4e60a88a-117c-41b1-9f9a-4fab6e3de16c; index_location_city=%E5%85%A8%E5%9B%BD; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%221731d1bd5ef189-0fcf11ef369d0e-4353760-1327104-1731d1bd5f053e%22%2C%22%24device_id%22%3A%221731d1bd5ef189-0fcf11ef369d0e-4353760-1327104-1731d1bd5f053e%22%7D; sajssdk_2015_cross_new_user=1; gate_login_token=026296b5405ba7262db2b24fcf9d5b8117c81a1e33622a5e79041639173d1a81; LG_HAS_LOGIN=1; _putrc=FC2FE27B6F83DDA8123F89F2B170EADC; login=true; hasDeliver=0; privacyPolicyPopup=false; TG-TRACK-CODE=search_code; X_HTTP_TOKEN=fce9ae0065ee91cf1966393951d8f9e3438bdf9565; _gat=1; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1593936691; unick=%E7%94%A8%E6%88%B77635; showExpriedIndex=1; showExpriedCompanyHome=1; showExpriedMyPublish=1; PRE_UTM=; PRE_HOST=; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2Fjobs%2Flist%5Fpython%3FlabelWords%3D%26fromSearch%3Dtrue%26suginput%3D; PRE_SITE=https%3A%2F%2Fwww.lagou.com%2F; LGSID=20200705161131-ef5a3ae0-624a-4e8d-a2ab-f1a137a0b949; SEARCH_ID=af2f4215dc1c4b94b740856f91881da2; LGRID=20200705161132-15702da1-6480-4fa5-8e16-72c5a2c0ed45'
}data = {'first':'true','pn':1,'kd':'python'
}req = request.Request(url,headers=headers,data=parse.urlencode(data).encode('utf-8'),method='POST')
resp = request.urlopen(req)
print(resp.read().decode('utf-8'))
# print(resp.read())

在这里插入图片描述
JSON在线解析网站:http://json.cn/
自动获取本地IP地址网站:http://httpbin.org/

七、代码:

from urllib import request
from urllib import parse# resp = request.urlopen('http://www.baidu.com')
# print(resp.read())
# print(resp.read(10))
# print(resp.readline())
# print(resp.readlines())
# print(resp.getcode())# urlretrieve函数,可以将网页上的一个文件保存到本地
# request.urlretrieve("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1593927965278&di=8749753c6b8d8d142eb37ebac38fe7de&imgtype=0&src=http%3A%2F%2Fcyimg.quji.com%2Fnewsimg%2F2016%2F02%2F19%2F0449ff918e2484761f2dee7af1432108.jpg",'luban.jpg')# urlencode函数,可以把字典数据转换成url编码的数据# data = {'name':'爬虫基础','greet':'hello world','age':100}
# qs = parse.urlencode(data)
# print(qs)# 案例
# url = 'http://www.baidu.com/s?wd=刘德华'
url = 'http://www.baidu.com/s'
params = {"wd":"刘德华"}
qs = parse.urlencode(params)
print(qs)
url = url + "?" + qs
print(url)
resp = request.urlopen(url)
print(resp.read())# parse_qs函数,可以将经过编码后的url参数进行解码
print(parse.parse_qs(qs))

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471022.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 2265. 统计值等于子树平均值的节点数(DFS)

文章目录1. 题目2. 解题1. 题目 给你一棵二叉树的根节点 root ,找出并返回满足要求的节点数,要求节点的值等于其 子树 中值的 平均值 。 注意: n 个元素的平均值可以由 n 个元素 求和 然后再除以 n ,并 向下舍入 到最近的整数。…

LeetCode 2267. 检查是否有合法括号字符串路径(BFS)

文章目录1. 题目2. 解题1. 题目 一个括号字符串是一个 非空 且只包含 ( 和 ) 的字符串。 如果下面 任意 条件为 真 ,那么这个括号字符串就是 合法的 。 字符串是 () 。字符串可以表示为 AB(A 连接 B),A 和 B 都是合法括号序列。…

python网络爬虫系列(三)——cookie的原理、保存与加载

一、什么是cookie? 在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。 cookie的出现就是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器,然后浏览器保存在本地,当…

LeetCode 2266. 统计打字方案数(动态规划)

文章目录1. 题目2. 解题1. 题目 Alice 在给 Bob 用手机打字。数字到字母的 对应 如下图所示。 为了 打出 一个字母,Alice 需要 按 对应字母 i 次,i 是该字母在这个按键上所处的位置。 比方说,为了按出字母 s ,Alice 需要按 7 四…

大学毕业4年-回顾和总结(2)-钱,收入和支出

过年回家,长辈最喜欢问两件事。第一件事,谈朋友没有啊。第二件事,现在一个月搞多少钱。 如果你和他们说,一个月工资是1万,那么他们立刻认为,你现在手上应该有十多万了。 上班族听了,心里…

python网络爬虫系列(四)——requests模块

requests模块 知识点: 掌握 headers参数的使用掌握 发送带参数的请求掌握 headers中携带cookie掌握 cookies参数的使用掌握 cookieJar的转换方法掌握 超时参数timeout的使用掌握 代理ip参数proxies的使用掌握 使用verify参数忽略CA证书掌握 requests模块发送post请…

PyQt5 基本窗口控件(绘图类 / 拖拽 / 剪贴板 / 日历时间 / 菜单、工具、状态栏 / 打印)

文章目录1. 窗口绘图类1.1 QPainter绘制文字绘制点1.2 QPen1.3 QBrush1.4 QPixmap2. 拖拽与剪贴板2.1 拖拽2.2 剪贴板 QClipboard3. 日历与时间3.1 QCalendar3.2 QDateTimeEdit4. 菜单栏、工具栏、状态栏4.1 菜单栏 QMenuBar4.2 工具栏 QToolBar4.3 状态栏 QStatusBar5. QPrint…

python网络爬虫系列(0)——爬虫概述 http协议复习

一、爬虫概述 知识点: 了解 爬虫的概念 了解 爬虫的作用 了解 爬虫的分类 掌握 爬虫的流程 1. 爬虫的概念 模拟浏览器,发送请求,获取响应 网络爬虫(又被称为网页蜘蛛,网络机器人)就是模拟客户端(主要指…

使用TFHpple解析html

https://github.com/topfunky/hpple 前期准备工作 引入静态库文件 添加库文件的 header search paths(注意,必须选中 All) 将从github上下载的源码包拖入工程当中 准备工作结束 使用详情 我们来解析网址 http://www.cnblogs.com/YouXianMing/ 中的title标签哦. 思路是这样子的:…

LeetCode 2269. 找到一个数字的 K 美丽值

文章目录1. 题目2. 解题1. 题目 一个整数 num 的 k 美丽值定义为 num 中符合以下条件的 子字符串 数目: 子字符串长度为 k 。子字符串能整除 num 。 给你整数 num 和 k ,请你返回 num 的 k 美丽值。 注意: 允许有 前缀 0 。 0 不能整除任…

LeetCode 2270. 分割数组的方案数(前缀和)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始长度为 n 的整数数组 nums 。 如果以下描述为真,那么 nums 在下标 i 处有一个 合法的分割 : 前 i 1 个元素的和 大于等于 剩下的 n - i - 1 个元素的和。下标 i 的右边 至少有一个 元素&#xff…

python网络爬虫系列(五)——数据提取 jsonpath模块

一、数据提取概述 知识点 了解 响应内容的分类了解 xml和html的区别 1. 响应内容的分类 在发送请求获取响应之后,可能存在多种不同类型的响应内容;而且很多时候,我们只需要响应内容中的一部分数据 结构化的响应内容 json字符串 可以使用re、…

LeetCode 2271. 毯子覆盖的最多白色砖块数(前缀和+二分查找)

文章目录1. 题目2. 解题1. 题目 给你一个二维整数数组 tiles &#xff0c;其中 tiles[i] [li, ri] &#xff0c;表示所有在 li < j < ri 之间的每个瓷砖位置 j 都被涂成了白色。 同时给你一个整数 carpetLen &#xff0c;表示可以放在 任何位置 的一块毯子。 请你返回…

Nimbus三Storm源码分析--Nimbus启动过程

Nimbus server, 首先从启动命令开始, 同样是使用storm命令"storm nimbus”来启动看下源码, 此处和上面client不同, jvmtype"-server", 最终调用"backtype.storm.daemon.nimbus"的mainnimbus是用clojure实现的, 但是clojure是基于JVM的, 所以在最终发布…

python网络爬虫系列(六)——数据提取 lxml模块

一、数据提取-lxml模块 知识点 了解 lxml模块和xpath语法的关系了解 lxml模块的使用场景了解 lxml模块的安装了解 谷歌浏览器xpath helper插件的安装和使用掌握 xpath语法-基础节点选择语法掌握 xpath语法-节点修饰语法掌握 xpath语法-其他常用语法掌握 lxml模块中使用xpath语…

LeetCode 2273. 移除字母异位词后的结果数组

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的字符串 words &#xff0c;其中 words[i] 由小写英文字符组成。 在一步操作中&#xff0c;需要选出任一下标 i &#xff0c;从 words 中 删除 words[i] 。其中下标 i 需要同时满足下述两个条件&#xff1a; 0 < i …

python网络爬虫系列(七)——selenium的介绍 selenium定位获取标签对象并提取数据 selenium的其它使用方法

一、selenium的介绍 知识点&#xff1a; 了解 selenium的工作原理了解 selenium以及chromedriver的安装掌握 标签对象click点击以及send_keys输入 1. selenium运行效果展示 Selenium是一个Web的自动化测试工具&#xff0c;最初是为网站自动化测试而开发的&#xff0c;Seleniu…

LeetCode 2274. 不含特殊楼层的最大连续楼层数

文章目录1. 题目2. 解题1. 题目 Alice 管理着一家公司&#xff0c;并租用大楼的部分楼层作为办公空间。 Alice 决定将一些楼层作为 特殊楼层 &#xff0c;仅用于放松。 给你两个整数 bottom 和 top &#xff0c;表示 Alice 租用了从 bottom 到 top&#xff08;含 bottom 和 t…

python网络爬虫系列(八)——常见的反爬手段和解决方法

常见的反爬手段和解决思路 学习目标 了解 服务器反爬的原因了解 服务器常反什么样的爬虫了解 反爬虫领域常见的一些概念了解 反爬的三个方向了解 常见基于身份识别进行反爬了解 常见基于爬虫行为进行反爬了解 常见基于数据加密进行反爬 1 服务器反爬的原因 爬虫占总PV(PV是指…

LeetCode 2275. 按位与结果大于零的最长组合(位运算)

文章目录1. 题目2. 解题1. 题目 对数组 nums 执行 按位与 相当于对数组 nums 中的所有整数执行 按位与 。 例如&#xff0c;对 nums [1, 5, 3] 来说&#xff0c;按位与等于 1 & 5 & 3 1 。同样&#xff0c;对 nums [7] 而言&#xff0c;按位与等于 7 。 给你一个…