python爬虫 urllib模块url编码处理详解
作者:minger_lcm 发布时间:2021-09-13 02:24:37
标签:python,爬虫,urllib,模块,url,编码处理
案例:爬取使用搜狗根据指定词条搜索到的页面数据(例如爬取词条为‘周杰伦'的页面数据)
import urllib.request
# 1.指定url
url = 'https://www.sogou.com/web?query=周杰伦'
'''
2.发起请求:使用urlopen函数对指定的url发起请求,
该函数返回一个响应对象,urlopen代表打开url
'''
response = urllib.request.urlopen(url=url)
# 3.获取响应对象中的页面数据:read函数可以获取响应对象中存储的页面数据(byte类型的数据值)
page_text = response.read()
# 4.持久化存储:将爬取的页面数据写入文件进行保存
with open("sougou.html","wb") as f:
f.write(page_text)
print("写入数据成功")
f.close()
编码错误
【注意】上述代码中url存在非ascii编码的数据,则该url无效。如果对其发起请求,则会报如下错误:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 15-17: ordinal not in range(128)
url的特性:url不可以存在非ASCII编码字符数据,url必须为ASCII编码的数据值。所以我们在爬虫代码中编写url时,如果url中存在非ASCII编码的数据值,则必须对其进行ASCII编码后,该url方可被使用。
上面的“周杰伦” 不是ASCII编码字符数据,所以url就会变成无效的url,不符合url特性,所以报错误
所以必须对url中的非ascii的数据进行ascii的编码,则该url方可被发起请求:
需要用到 urllib.parse
方法 1:使用quote函数
quote函数作用:对url中所存在的特殊字符进行ASCII的编码,把url中的非ascii编码的字符单独取出来,使用quote函数进行转码,
转码之后,把转码的结果拼接到原有的url当中。
import urllib.request
import urllib.parse
# 1.指定url
url = 'https://www.sogou.com/web?query=周杰伦'
word = urllib.parse.quote("周杰伦")
# 查看转码后结果
print(word)
# %E5%91%A8%E6%9D%B0%E4%BC%A6
from urllib.request import urlopen
import urllib.parse
# 1.指定url
url = 'https://www.sogou.com/web?query='
# url的特性:url不可以存在非ASCII编码字符数据
word = urllib.parse.quote("周杰伦")
# 将编码后的数据值拼接回url中
url = url+word # 有效url
'''
2.发起请求:使用urlopen函数对指定的url发起请求,
该函数返回一个响应对象,urlopen代表打开url
'''
response = urlopen(url=url)
# 3.获取响应对象中的页面数据:read函数可以获取响应对象中存储的页面数据(byte类型的数据值)
page_text = response.read()
# 4.持久化存储:将爬取的页面数据写入文件进行保存
with open("周杰伦.html","wb") as f:
f.write(page_text)
print("写入数据成功")
来源:https://www.cnblogs.com/mingerlcm/p/11335891.html
0
投稿
猜你喜欢
- 本博文源于《python数据可视化》(黑马程序员编著)。先讲解bar参数如何使用,然后分别演示堆积柱形图和带误差柱形图画法。bar参数bar
- 0. 准备相关表来进行接下来的测试相关建表语句请看:https://github.com/YangBaohust/my_sqluser1表,
- 代码如下:Class XMLClass Private objXml Private xmlDoc Private xmlPath '
- 刚开始学习tensorflow,还不太会用,开个博记录,今天遇到一个问题是用tf.layers.dense创建的全连接层,如何查看权重?知道
- 随着网站访问量的加大,每次从数据库读取都是以效率作为代价的,很多用ACCESS作数据库的更会深有体会,静态页加在搜索时,也会被优先考虑。互联
- 1. 从官网下载 mysql-5.7.13-linux-glibc2.5-x86_64.tar.gz经测试, 本文还适用于如下版本:MySQ
- 一日,遇到一个问题,求上一个月的今天。 最开始我们使用 strtotime(”-1 month”) 函数求值,发现有一个问题,月长度不一样的
- SQL触发器实例1 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一
- 利用Python写了一个小脚本想要传给使用Windows但没有装Python的朋友执行,这时候就可以利用将档案包装成exe档案,让没有Pyt
- 1. 停止服务MySQL2. 卸载mysql相关的程序3. 删除注册表(运行->regedit),machine->system
- 本文实例为大家分享了微信小程序实现搜索框功能的具体代码,供大家参考,具体内容如下效果:wxml文件:<view class="
- 最近因工作需要,要学习PHP的基础编程,于是学习架设PHP工作环境。但按照教材上介绍的那样,安装了WMAP后,一直无法运行成功。后发现Apa
- 前言最近工作中需要开发前端操作远程虚拟机的功能,简称WebShell. 基于当前的技术栈为react+django,调研了一会发现大部分的后
- 现在主流的cms或者blog等系统中,都内置的有插件系统,但是层层深入、剖析实现的方式,其实都是最简单的钩子的复杂化的实现。前言钩子是插件执
- 本文实例讲述了微信小程序基于slider组件动态修改标签透明度的方法。分享给大家供大家参考,具体如下:1、效果展示2、关键代码index.w
- 作者:HelloGitHub-追梦人物文中所涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库当博客上发布的文章越来越多时
- 目录v-model.sync细微之处的区别总结功能作用场景:v-model <!--父组件--> &n
- 本文实例讲述了MySQL 的启动选项和系统变量。分享给大家供大家参考,具体如下:MySQL的配置信息可以通过两种方式实现,一种是命令行形式,
- 前一阵子经理问我能不能把用户最后一次登录我们的业务数据库的时间记录下来,因为之前有人修改过数据库sa用户的登录密码,所以我们要记录一下。 我
- 环境:Python3.6.4 + pandas 0.22主要是DataFrame.apply函数的应用,如果设置axis参数为1则每次函数每