学习笔记


文章目录

  • URL地址编码模块
    • 作用
    • 常用的方法
      • urllib.parse.utlencode({dict})
      • urllib.parse.quote(string)编码
      • urllib.parse.unquote(string)解码

URL地址编码模块

  • 模块
urllib.parse

作用

对URL地址中的查询参数进行编码。

比如,我们在百度中查询【垂耳兔】:

可以看到其URL地址(编码前):

https://www.baidu.com/s?wd=垂耳兔&rsv_spt=1&rsv_iqid=0xe5d979f300027bbc&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=0&rsv_dl=tb&rsv_t=1e54j7VuDW5lTX6%2B7OlhbhlIKUVoVOH%2F2LuYPHgQU46Iab8FfpjQiHRIouHM3DEMCAug&oq=%E5%9E%82%E8%80%B3%E5%85%94&rsv_pq=872089960004898e

我们看到了一堆查询参数,太多了!需要注意的是,这里仅有一部分查询参数是我们需要的,而有些则是不需要的。一般来说【wd=垂耳兔】这个参数,我们肯定是需要的,因为这个参数包含了我们要查询的内容。

当我们向网站发起请求时,肯定不能传递这样的URL地址,URL地址需要符合一定的传输协议。此时,我们需要对这个URL地址进行编码,来满足请求规则。

常用的方法

urllib.parse.utlencode({dict})

我们看到urllib.parse utlencode()方法的参数中有一个字典,这个字典里可以放查询参数。

比如,我们可以设置参数为如下字典:

{'wd':'垂耳兔'}

urllib.parse utlencode()方法可以对字典中的查询参数进行编码,将其转换成满足请求规则的URL地址。

举个例子

我们设置查询参数,在百度搜索上查询【垂耳兔】:

from urllib import request
from urllib import parseurl = 'http://www.baidu.com/s?'
headers = {'User-Agent':'Mozilla/5.0'}query_string = parse.urlencode({'wd':'垂耳兔'})
url_com = url + query_stringreq = request.Request(url = url_com, headers = headers)response = request.urlopen(req)html = response.read().decode('utf-8')
print(html)

部分结果:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="utf-8"><title>百度安全验证</title>

可以看到,百度返回信息,需要我们进行验证,嘤嘤嘤,可能是我被百度识破了伪装。哎…不管怎样,我们先试着验证一下,再看看有没有拿到查询结果:

嗯,验证后的确拿到了查询结果:

接下来,我们可以在百度中不停的翻页,查看不同页面中的url有什么变化,从而判断各个查询参数有什么作用.

我们发现,当我们翻页到第2页时,pn参数变为10,当我们翻页到第3页时,pn参数变为20:

由此,我们发现,pn参数应该可以控制页数。

现在我们再敲一段代码,设置pn查询参数值为20,来指定查询结果页数:

from urllib import request
from urllib import parsemy_url = 'http://www.baidu.com/s?'
headers = {'User-Agent':'Mozilla/5.0'}
query_string_dict = {'wd':'垂耳兔','pn': 20}query_string = parse.urlencode(query_string_dict)
url_com = my_url + query_stringreq = request.Request(url = url_com, headers = headers)response = request.urlopen(req)html = response.read().decode('utf-8')
print(html)

部分结果:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="utf-8"><title>百度安全验证</title>

没错,又需要验证,才能获取网页,这个问题,我们之后再解决,现在为了学查询参数这个知识点,我先忍着。

验证后获取的网页:

可以看到,我们成功获取了第3页的查询结果。

需要注意的是,我们看到URL中各个查询参数之间都是通过【&】进行拼接的,我们在代码中不手动添加【&】真的可以吗?答案是可以的,在用urllib.parse utlencode()方法进行编码时,它会自动的在各个查询参数之间添加【&】,我们来验证一下:

query_string_dict = {'wd':'垂耳兔','pn': 20}query_string = parse.urlencode(query_string_dict)
print(query_string)

结果:

  wd=%E5%9E%82%E8%80%B3%E5%85%94&pn=20
  • 案例

在这个案例中,我们要将查询结果存在一个HTML文件中。为了避免,通过程序向百度发送请求,结果要验证的尴尬情景,我们换一个搜索引擎,爬取查询结果,那么就用搜狗吧!

我们首先在浏览器中查询【垂耳兔】:

我们看到,貌似需要用到query查询参数。

我们在浏览器中翻到第3页:

可以看到,page查询参数变为了3,由此我们判断,这个page参数可以控制页数。

接下来,我们通过程序来查询【垂耳兔】,并查看第3页的查询结果:

from urllib import request
from urllib import parsemy_url = 'https://www.sogou.com/web?'
headers = {'User-Agent':'Mozilla/5.0'}
query_string_dict = {'query':'垂耳兔','page':3}query_string = parse.urlencode(query_string_dict)
url_com = my_url + query_stringreq = request.Request(url = url_com, headers = headers)response = request.urlopen(req)html = response.read().decode('utf-8')
print(html)

部分结果:

        <div class="str_info_div"><p class="str_info"><span class="str-c-txt blue-color" style ="display:none" id="sogou_vr_30000909_pink_1"><strong>[</strong><i>图文</i><strong>]</strong></span>                    <em><!--red_beg-->垂耳兔<!--red_end--></em>是宠物兔中非常流行的品种,它最大的特点就是有着一对垂着的耳朵。其可爱萌萌的样子实在让人忍不住想要马上把它抱回家饲养。在饲养<em><!--red_beg-->垂耳兔<!--red_end--></em>之前,了解一些相关知...</p><div class="fb" ><cite id="cacheresult_info_1">太平洋时尚网 - pet.pclady.com.cn/1...&nbsp;-&nbsp;2016-8-1</cite>&nbsp;-&nbsp;<!--resultsnap_beg--><a target="_blank" style="color: #666666;" href="http://snapshot.sogoucdn.com/websnapshot?ie=utf8&url=http%3A%2F%2Fpet.pclady.com.cn%2F155%2F1554499.html&did=c103019d5b6c85bf-a459bc045d54e056-6e9a7b6e8e4014d44eeae2ab2434a020&k=d03273cdb123cc84b7d5ef1b12c8f90c&encodedQuery=%E5%9E%82%E8%80%B3%E5%85%94&query=%E5%9E%82%E8%80%B3%E5%85%94&&w=01020400&m=0&st=1" id="sogou_snapshot_1"><!--resultsnap_end-->快照</a></div>

可以看到,我们的确获取到了查询页面。

接下来我们将查询到的页面,用gb18030编码格式,保存成HTML文件:

#gbk-gb2312-gb18030
with open('ChuiRr.html', 'w', encoding = 'gb18030') as f:f.write(html)

我们用Sublime检查一下,刚刚创建的ChuiEr.html文件:

再用Chrome浏览器打开这个HTML文件:

虽然打开了,但是乱码了~ 这个问题依然留下来,以后解决。

urllib.parse.quote(string)编码

urllib.parse.quote()方法可以对字符串进行编码。

举个例子1

代码:

from urllib import parsestring = '黑白道奇'
print(parse.quote(string))

结果:

  %E9%BB%91%E7%99%BD%E9%81%93%E5%A5%87

举个例子2

代码:

from urllib import parsemy_url = 'https://www.sogou.com/web?query={}'word = input('请输入搜索内容:')
query_string = parse.quote(word)
print(my_url.format(query_string))

控制台输出:

urllib.parse.unquote(string)解码

举个例子

代码:

from urllib import parse
word = input('请输入搜索内容:')
query_string = parse.quote(word)
result = parse.unquote(query_string)
print(result)

结果:

利用python爬虫(part2)--urllib.parse模块相关推荐

  1. 利用python爬虫(part1)--urllib.request模块

    学习笔记 文章目录 网络爬虫概述 定义 爬虫分类 爬取数据步骤 爬虫请求模块 常用方法 urllib.request.urlopen()方法 响应对象(response)方法 关于请求头 urllib ...

  2. 利用python爬虫(part16)--json解析模块

    学习笔记 json解析模块 json.loads 作用 把json格式的字符串转为Python数据类型. 语法 res = requests.get(url=url, headers=headers) ...

  3. Python爬虫核心知识-第二章:2.2 爬虫urllib.parse模块

    Python爬虫核心知识 第二章:2.2 爬虫urllib.parse模块 2.2 爬虫urllib.parse模块 Python中的urllib.parse模块中,提供了很多用来解析和重组URL的函 ...

  4. urllib.parse模块

    urllib.parse模块 python中提供urllib.parse模块用来编码和解码,分别是urlencode()与unquote() 编码urlencode() # 导入parse模块 fro ...

  5. Python爬虫【urllib模块】

    通用爬虫 爬虫的一般流程 1 初始化一批URL,将这些URL放入队列 2 从队列中取出这些URL,通过DNS解析IP,对IP对应的网站下载HTML页面,保存到本地服务器中,爬取完的URL放到已爬取队列 ...

  6. Python爬虫之urllib模块2

    Python爬虫之urllib模块2 本文来自网友投稿 作者:PG-55,一个待毕业待就业的二流大学生. 看了一下上一节的反馈,有些同学认为这个没什么意义,也有的同学觉得太简单,关于Beautiful ...

  7. Python爬虫进阶——urllib模块使用案例【淘宝】

    Python爬虫基础--HTML.CSS.JavaScript.JQuery网页前端技术 Python爬虫基础--正则表达式 Python爬虫基础--re模块的提取.匹配和替换 Python爬虫基础- ...

  8. python爬虫之urllib库详解

    python爬虫之urllib库详解 前言 一.urllib库是什么? 二.urllib库的使用 urllib.request模块 urllib.parse模块 利用try-except,进行超时处理 ...

  9. python爬虫爬取音乐_利用python爬虫实现爬取网易云音乐热歌榜

    利用python爬虫实现爬取网易云音乐热歌榜 发布时间:2020-11-09 16:12:28 来源:亿速云 阅读:102 作者:Leah 本篇文章给大家分享的是有关利用python爬虫实现爬取网易云 ...

最新文章

  1. POI之excel导入导出
  2. php exec多条命令怎么拼接_PHP--手摸手,教你撸一个会自动补全的命令行工具1
  3. 智能合约如何可信的与外部世界交互
  4. python将object转换为float_将pandas系列类型从object转换为float64
  5. 方法入门_方法的定义
  6. MySql 内连接,外连接查询方式区别
  7. javascript动态创建radio button元素支持IE/Firefox
  8. python3的 pymysql把mysqldb库取代了,让python 3支持mysqldb的解决方法
  9. python矩阵行数_python查看矩阵的行列号以及维数方式
  10. Java判断100到200之间所有的素数,并且输出这些素数
  11. mysql数据上传apache_配置Apache服务器 数据库mySQL
  12. JS替换textarea里的回车换行
  13. jms与ActivityMQ中的简单使用
  14. 硅谷外卖安装axios报错
  15. 掉队于云计算市场是甲骨文裁员的最大原因
  16. 关于Shine-hale
  17. PS教程:如何快速制作立体文字排版效果
  18. 《梦想新大陆》美术研发手札
  19. java邮件群发代码_基于java的邮件群发软件
  20. Android app反编译

热门文章

  1. 操作系统 真象还原 读书笔记
  2. 操作系统 哈工大 李治军
  3. few-shot learning 1.1——零样本学习
  4. java 存储cookie_java设置cookie,存储和读取 | 学步园
  5. win下 cmd 查询本机开了哪些端口 并查看开启端口的软件
  6. 自然语言处理工具pyhanlp分词与词性标注
  7. app测试之耗电量测试
  8. Struts2 学习系列 (2) 访问web资源
  9. android的m、mm、mmm编译命令
  10. UWP x:bind