使用爬虫爬取网页经常遇到各种编码问题,因此产生乱码
今天折腾了一天,全部总结一遍
环境:win10,pycharm,python3.4
1.首先先来网页编码是utf-8的:
以百度首页为例:
使用requests库
import requests

url="http://www.baidu.com"
response = requests.get(url)
content = response.text
print(content)
结果有代码显示,但是出现乱码

使用urllib库
import urllib.request

response = urllib.request.urlopen('http://www.baidu.com')
print(response.read())
结果有代码显示,但是以二进制返回

接下来介绍encode()和decode()方法
encode()用于解码,decode()方法用于编码
注:python3默认编码为utf-8
例1:
text = '中华'
print(type(text))
print(text.encode('gbk'))#以gbk形式解码,即把utf-8的字符串text转换成gbk编码
print(text.encode('utf-8'))#以utf-8形式解码,因为原本是utf-8编码,所以返回二进制
print(text.encode('iso-8859-1'))#报错
返回结果:
<class 'str'>
b'\xd6\xd0\xbb\xaa'
b'\xe4\xb8\xad\xe5\x8d\x8e'
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-1: ordinal not in range(256)
为什么第四个报错?
我查寻了一下latin-1是什么?
Latin1是ISO-8859-1的别名,有些环境下写作Latin-1。
ISO-8859-1编码是单字节编码。
Unicode其实是Latin1的扩展。只有一个低字节的Uncode字符其实就是Latin1字符(这里认为unicode是两个字节,事实上因为各种版本不一样,字节数也不一样)
所以我的理解是:因为中文至少两个字节,所以不能解码出来

例2:
text = '中华'
print(type(text)) #<class 'str'>
text1 = text.encode('gbk')
print(type(text1)) #<class 'bytes'>
print(text1) #b'\xd6\xd0\xbb\xaa'
text2 = text1.decode('gbk')
print(type(text2)) #<class 'str'>
print(text2) #中华
text3 = text1.decode('utf-8') #报错:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in position 0: invalid continuation byte
print(text3)

text4= text.encode('utf-8')
print(type(text4)) #<class 'bytes'>
print(text4) #b'\xe4\xb8\xad\xe5\x8d\x8e'
text5 = text4.decode('utf-8')
print(type(text5)) #<class 'str'>
print(text5) #中华
text6 = text4.decode('gbk') #报错:UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 2: illegal multibyte sequence
print(text6)

为什么text3和text6会报错呢?
因为他们解码和编码使用的编码标准不一样。text1是用gbk解码,那么用utf-8编码回去就会报错,text6同理

好,回到百度例子,那么我们要怎么样才能看到我们想要的网页源代码呢?
使用requests库
import requests

url="http://www.baidu.com"
response = requests.get(url)
content = response.text.encode('iso-8859-1').decode('utf-8')
#把网页源代码解码成Unicode编码,然后用utf-8编码
print(content)

使用urllib库
import urllib.request

response = urllib.request.urlopen('http://www.baidu.com')
print(response.read().decode(utf-8))

2.关于网页源代码是gbk或者gb2312编码的网页:
import requests
response = requests.get('http://www.dytt8.net/')
#print(response.text)
html = response.text

print(html)
结果返回乱码

import urllib.request
#get请求
response = urllib.request.urlopen('http://www.baidu.com')
print(response.read())
结果返回二进制

正确代码:
import requests
response = requests.get('http://www.dytt8.net/')
#print(response.text)
html = response.text.encode('iso-8859-1').decode('gbk')

print(html)

import urllib.request
#get请求
response = urllib.request.urlopen('http://www.dytt8.net/')
print(response.read().decode('gbk'))

python3爬虫编码问题的更多相关文章

  1. python3爬虫中文乱码之请求头‘Accept-Encoding’:br 的问题

    当用python3做爬虫的时候,一些网站为了防爬虫会设置一些检查机制,这时我们就需要添加请求头,伪装成浏览器正常访问. header的内容在浏览器的开发者工具中便可看到,将这些信息添加到我们的爬虫代码 ...

  2. s14 第4天 关于python3.0编码 函数式编程 装饰器 列表生成式 生成器 内置方法

    python3 编码默认为unicode,unicode和utf-8都是默认支持中文的. 如果要python3的编码改为utf-8,则或者在一开始就声明全局使用utf-8 #_*_coding:utf ...

  3. Python3爬虫系列:理论+实验+爬取妹子图实战

    Github: https://github.com/wangy8961/python3-concurrency-pics-02 ,欢迎star 爬虫系列: (1) 理论 Python3爬虫系列01 ...

  4. day008 字符编码之 字符编码 、Python2和Python3字符编码的区别

    计算机基础(掌握) 启动应用程序的流程 双击qq 操作系统接受指令然后把该操作转化为0和1发送给CPU CPU接受指令然后把指令发送给内存 内存接受指令把指令发送给硬盘获取数据 qq在内存中运行 文本 ...

  5. Python3 爬虫之 Scrapy 核心功能实现(二)

    博客地址:http://www.moonxy.com 基于 Python 3.6.2 的 Scrapy 爬虫框架使用,Scrapy 的搭建过程请参照本人的另一篇博客:Python3 爬虫之 Scrap ...

  6. Python3 爬虫之 Scrapy 框架安装配置(一)

    博客地址:http://www.moonxy.com 基于 Python 3.6.2 的 Scrapy 爬虫框架使用,Scrapy 的爬虫实现过程请参照本人的另一篇博客:Python3 爬虫之 Scr ...

  7. Python3的编码整理总结

    python3在内存中是用unicode编码方式存储的,所以不能直接储存和传输,要转化为其他编码进行储存和传输. 字符串通过编码转换成字节码,字节码通过解码成为字符串 encode:str --> ...

  8. 字符编码 + python2和python3的编码区别(day08整理)

    目录 昨日回顾 二十三.元组内置方法 二十四.散列表 二十五.字典内置方法 二十六.集合内置方法 二十七.深浅拷贝 拷贝 浅拷贝 深拷贝 今日内容 二十八.字符编码 1.文本编辑器存储信息的过程 2. ...

  9. python3爬虫--反爬虫应对机制

    python3爬虫--反爬虫应对机制 内容来源于: Python3网络爬虫开发实战: 网络爬虫教程(python2): 前言: 反爬虫更多是一种攻防战,针对网站的反爬虫处理来采取对应的应对机制,一般需 ...

随机推荐

  1. openMP编程(上篇)之并行程序设计

    openMP简介 openMP是一个编译器指令和库函数的集合,主要是为共享式存储计算机上的并行程序设计使用的. 当计算机升级到多核时,程序中创建的线程数量需要随CPU核数变化,如在CPU核数超过线程数 ...

  2. Maven打包时,不包含jar包

    在给Maven项目打war包时,如果不想把依赖中的jar包也包含进去,可以在plugins中加入 <span style="white-space:pre"> < ...

  3. jquery文本框textarea自适应高度

    浏览器中默认的文本框是不能根据内容的增多变高,只能固定高度有滚动条,体验不是很好,找了很多方法兼容都不行,总算找到个兼容良好的方法: <body> <textarea id=&quo ...

  4. Angular-ui/bootstarp modal 主控制器与模态框控制器传值

    调用模态框: $scope.open = function (size) { //这里很关键,是打开模态框的过程 var modalInstance = $uibModal.open({ animat ...

  5. js截取关键字之后的字符串

    需求:截取下面字符串"="之后的所有字符 var str = "12345=6"; //要截取的字符串 var index = str.indexOf(&quo ...

  6. Python基础-I/O模型

    一.I/O模型 IO在计算机中指Input/Output,也就是输入和输出.由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘.网络等,就需要IO接 ...

  7. 08_zookeeper的客户端工具curator_watcher

    [使用usingWatcher()] //两个usingWatcher的传入参数不同 public interface Watchable<T> { T watched(); T usin ...

  8. AndroidStudio运行时出现错误:Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled

    本来想调出MMDS,没想到报出这个错误: 最后发现原来是自己选Android Device Monitor不小心把Enable ADB Integration前面的√去掉了.点击工具栏中的Tools, ...

  9. c++ 判断是64还是32位系统

    1.IsWow64Process 确定指定进程是否运行在64位操作系统的32环境(Wow64)下. 语法 BOOL WINAPI IsWow64Process( __in HANDLE hProces ...

  10. C# 程序启动最小化至任务栏及闪烁

    主要功能: C#让窗体最小化至任务栏,同时在系统托盘区的图标点击左键能显示窗体,并使窗体闪烁. 首先: 创建窗体应用程序,并添加控件NotifyIcon及ContextMenuStrip控件 Noti ...