使用爬虫爬取网页经常遇到各种编码问题,因此产生乱码
今天折腾了一天,全部总结一遍
环境: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. JS实现九九乘法表和时间问候语

    编码 小练习,练习使用循环实现一个九九乘法表 第一步,最低要求:在Console中按行输出 n * m = t 然后,尝试在网页中,使用table来实现一个九九乘法表 <!DOCTYPE htm ...

  2. javascript获取文件后缀名

    javascript获取文件后缀名:在需要验证文件格式的时候,首先就要获得文件的格式,下面是一个通过正则表达式获取文件后缀名的一个简单实例. function validate(){ var impo ...

  3. Python-网络编程(二)

    今天继续网络编程的东西 一.网络通讯原理 1.互联网的本质就是一系列的网络协议 我们是在浏览器上输入了一个网址,但是我们都知道,互联网连接的电脑互相通信的是电信号,我们的电脑是怎么将我们输入的网址变成 ...

  4. yield* 表达式

    yield* 表达式用于委托给另一个generator 或可迭代对象. 委托给其他生成器 function* g1() { yield 2; yield 3; yield 4; } function* ...

  5. Eclipse开发工具printf打印方法提示报错的解决方法

    最近在学习java,在练习printf方法的使用时按照书上的语法配置却出现了报错.报错内容为:The method printf(String, Object[]) in the type Print ...

  6. GeoJSON相关操作

    简介 本文主要介绍GEOJSON相关的操作 环境 gt-geojson-.jar,jts-1.8.jar 直接上代码 代码 wkt格式的geometry转成json格式 public String e ...

  7. Python爬虫教程-14-爬虫使用filecookiejar保存cookie文件(人人网)

    Python爬虫教程-14-爬虫使用filecookiejar保存cookie文件(人人网) 上一篇介绍了利用CookieJar访问人人网,本篇将使用filecookiejar将cookie以文件形式 ...

  8. 【深入理解JAVA虚拟机】第5部分.高效并发.1.Java内存模型与线程。

    1.概述 摩尔定律:描述处理器晶体管数量与运行效率之间的发展关系.Amdahl定律:通过系统中并行化与串行化的比重来描述多处理器系统能获得的运算加速能力. 从摩尔定律到Amdahl定律的转变,代表了近 ...

  9. 【设计模式最终总结】桥接模式 VS 外观模式

    差异点 外观模式,是把功能通过一个接口提供出来,方便日后更换实现,或者这种实现可以由多方提供,但同时只用一个.典型例子:@Slf4j 桥接模式,多个维度,每个维度提供一个接口,这些接口集中在一个类中, ...

  10. CDN缓存策略

    以下内容就是FAQ,自己也学习一下... 1.CDN加速原理通过动态域名解析,网友的请求被分配到离自己最快的服务器.CDN服务器直接返回缓存文件或通过专线代理原站的内容.网络加速+内容缓存,有效提供访 ...