python爬虫 urllib模块url编码处理详解


Posted in Python onAugust 20, 2019

案例:爬取使用搜狗根据指定词条搜索到的页面数据(例如爬取词条为‘周杰伦'的页面数据)

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("写入数据成功")

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
Jun 25 Python
Django ORM框架的定时任务如何使用详解
Oct 19 Python
python+django加载静态网页模板解析
Dec 12 Python
Python+tkinter使用80行代码实现一个计算器实例
Jan 16 Python
python3实现基于用户的协同过滤
May 31 Python
Win8.1下安装Python3.6提示0x80240017错误的解决方法
Jul 31 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
Jun 14 Python
Django 全局的static和templates的使用详解
Jul 19 Python
Python字典推导式将cookie字符串转化为字典解析
Aug 10 Python
python控制台实现tab补全和清屏的例子
Aug 20 Python
Python实现AES加密,解密的两种方法
Oct 03 Python
基于python模拟bfs和dfs代码实例
Nov 19 Python
pytorch实现用Resnet提取特征并保存为txt文件的方法
Aug 20 #Python
python web框架 django wsgi原理解析
Aug 20 #Python
opencv转换颜色空间更改图片背景
Aug 20 #Python
pytorch 预训练层的使用方法
Aug 20 #Python
python爬虫 urllib模块反爬虫机制UA详解
Aug 20 #Python
Pytorch 抽取vgg各层并进行定制化处理的方法
Aug 20 #Python
python实现抠图给证件照换背景源码
Aug 20 #Python
You might like
mac os快速切换多个PHP版本的方法
2017/03/07 PHP
jquery动态改变onclick属性导致失效的问题解决方法
2013/12/04 Javascript
js模拟hashtable的简单实例
2014/03/06 Javascript
js 判断浏览器使用的语言示例代码
2014/03/22 Javascript
javascript:void(0)的问题使用探讨
2014/04/10 Javascript
javascript类型转换示例
2014/04/29 Javascript
jQuery实现ctrl+enter(回车)提交表单
2015/10/19 Javascript
Angular发布1.5正式版,专注于向Angular 2的过渡
2016/02/18 Javascript
AngularJS基础 ng-if 指令用法
2016/08/01 Javascript
Javascript中常见的逻辑题和解决方法
2016/09/17 Javascript
jquery 动态增加删除行的简单实例(推荐)
2016/10/12 Javascript
ReactNative 之FlatList使用及踩坑封装总结
2017/11/29 Javascript
基于jquery实现左右上下移动效果
2018/05/02 jQuery
nodejs 如何手动实现服务器
2018/08/20 NodeJs
vue.js添加一些触摸事件以及安装fastclick的实例
2018/08/28 Javascript
微信小程序实现组件顶端固定或底端固定效果(不随滚动而滚动)
2020/04/09 Javascript
微信公众号网页分享功能开发的示例代码
2020/05/27 Javascript
[02:54]DOTA2亚洲邀请赛 VG战队出场宣传片
2015/02/07 DOTA
python 爬虫出现403禁止访问错误详解
2017/03/11 Python
python 删除非空文件夹的实例
2018/04/26 Python
Python3.6连接Oracle数据库的方法详解
2018/05/18 Python
Centos 升级到python3后pip 无法使用的解决方法
2018/06/12 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
2018/12/20 Python
解决Django连接db遇到的问题
2019/08/29 Python
浅谈tensorflow使用张量时的一些注意点tf.concat,tf.reshape,tf.stack
2020/06/23 Python
一款利用html5和css3实现的3D立方体旋转效果教程
2016/04/26 HTML / CSS
全球速卖通巴西站点:Aliexpress巴西
2016/08/24 全球购物
酒店总经理工作职责
2013/12/13 职场文书
教师党性分析材料
2014/02/04 职场文书
致标枪运动员广播稿
2014/02/06 职场文书
《我的第一本书》教学反思
2014/02/15 职场文书
城管大队整治方案
2014/05/06 职场文书
2014年客房部工作总结
2014/11/22 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
幼儿园国培研修日志
2015/11/13 职场文书
Java存储没有重复元素的数组
2022/04/29 Java/Android