Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Python 爬虫使用Requests获取网页文本内容中文乱码

Python 爬虫使用Requests获取网页文本内容中文乱码

作者头像
smartsi
发布于 2019-08-07 03:38:48
发布于 2019-08-07 03:38:48
14.3K01
代码可运行
举报
文章被收录于专栏:SmartSiSmartSi
运行总次数:1
代码可运行

1. 问题

使用Requests去获取网页文本内容时,输出的中文出现乱码。

2. 乱码原因

爬取的网页编码与我们爬取编码方式不一致造成的。如果爬取的网页编码方式为utf8,而我们爬取后程序使用ISO-8859-1编码方式进行编码并输出,这会引起乱码。如果我们爬取后程序改用utf8编码方式,就不会造成乱码。

3. 乱码解决方案

3.1 Content-Type

我们首先确定爬取的网页编码方式,编码方式往往可以从HTTP头(header)的Content-Type得出。

Content-Type,内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件,这就是经常看到一些Asp网页点击的结果却是下载到的一个文件或一张图片的原因。如果未指定ContentType,默认为TEXT/HTML。charset决定了网页的编码方式,一般为gb2312utf-8

HTML语法格式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
station_request = requests.get("http://blog.csdn.net/sunnyyoona")
content_type = station_request.headers['content-type']
print content_type  # text/html; charset=utf-8
3.2 chardet

如果上述方式没有编码信息,一般可以采用chardet等第三方网页编码智能识别工具识别:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install chardet

使用chardet可以很方便的实现文本内容的编码检测。虽然HTML页面有charset标签,但是有些时候并不准确,这时候我们可以使用chardet来进一步的判断:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
raw_data = urllib.urlopen('http://blog.csdn.net/sunnyyoona').read()
print chardet.detect(raw_data)  # {'confidence': 0.99, 'encoding': 'utf-8'}

raw_data = urllib.urlopen('http://www.jb51.net').read()
print chardet.detect(raw_data)  # {'confidence': 0.99, 'encoding': 'GB2312'}

函数返回值为字典,有2个元素,一个是检测的可信度,另外一个就是检测到的编码。

3.3 猜测编码

当你收到一个响应时,Requests会猜测响应(response)的编码方式,用于在你调用Response.text方法时,对响应进行解码。Requests首先在HTTP头部检测是否存在指定的编码方式,如果不存在,则会使用 charadet来尝试猜测编码方式。

只有当HTTP头部不存在明确指定的字符集,并且Content-Type头部字段包含text值之时,Requests才不去猜测编码方式。在这种情况下, RFC 2616指定默认字符集必须是ISO-8859-1。Requests遵从这一规范。如果你需要一种不同的编码方式,你可以手动设置Response.encoding属性,或使用原始的Response.content

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 一等火车站
url = "https://baike.baidu.com/item/%E4%B8%80%E7%AD%89%E7%AB%99"
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36'}
r = requests.get(url, headers=headers)
print r.headers['Content-Type']  # text/html
# 猜测的编码方式
print r.encoding  # ISO-8859-1
print r.text  # 出现乱码

raw_data = urllib.urlopen(url).read()
print chardet.detect(raw_data)  # {'confidence': 0.99, 'encoding': 'utf-8'}

如上所述,只有当HTTP头部不存在明确指定的字符集,并且Content-Type头部字段包含text值之时,Requests才不去猜测编码方式。直接使用ISO-8859-1编码方式。而使用chardet检测结果来看,网页编码方式与猜测的编码方式不一致,这就造成了结果输出的乱码。

3.4 解决

你可以使用r.encoding = xxx来更改编码方式,这样Requests将在你调用r.text时使用r.encoding的新值,使用新的编码方式。下面示例使用chardet检测的编码方式解码网页:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 一等火车站
url = "https://baike.baidu.com/item/%E4%B8%80%E7%AD%89%E7%AB%99"
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36'}
r = requests.get(url, headers=headers)

# 检测编码
raw_data = urllib.urlopen(url).read()
charset = chardet.detect(raw_data)  # {'confidence': 0.99, 'encoding': 'utf-8'}
encoding = charset['encoding']
# 更改编码方式
r.encoding = encoding
print r.text  # 未出现乱码

参考:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://docs.python-requests.org/en/latest/user/quickstart/#response-content
http://blog.csdn.net/a491057947/article/details/47292923
https://www.cnblogs.com/GUIDAO/p/6679574.html
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
DES加解密算法原理详解与实现
​ 要编写DES密码,先熟悉DES原理,其基本流程就是先将明文分成64bit的分组,然后将64bit二进制码输入到密码器中,密码器对输入的64位码首先进行初始置换,然后在64bit主密钥产生的16个子密钥控制下进行16 轮乘积变换,接着再进行逆置换就得到64位已加密的密文。DES的流程图如下:
timerring
2022/07/20
1.7K0
DES加解密算法原理详解与实现
python 版DES和MAC算法
最近工作中需要用到python中的DES算法,虽然有现成的库,但总感觉用着不方便。于是把之前用的C和Java写的DES和MAC算法移植到python中。测试了下没问题。
杨永贞
2020/08/04
1.1K0
java 版DES和MAC算法
import java.io.UnsupportedEncodingException; import util.Util; /** * PBOC3DES 加密算法 * @author Administrator * */ public class PBOC3DES { private static int HEX = 0; private static int ASC = 1; private static int[][] subKey = new int[16][48]; /
杨永贞
2020/08/04
1.6K0
DES加解密-简单原理与go语言实现
公式: Li = R(i - 1), Ri = L(i - 1) ^ F(R(i - 1), Ki)
i0gan
2021/07/01
1K0
DES加解密-简单原理与go语言实现
DES算法-C/C++实现
本文介绍了DES算法的加密与解密过程,通过对输入数据进行初始置换、子密钥生成、8轮标准加密过程、逆置换、解密过程的详细描述,最后给出了完整的代码示例。
f_zyj
2018/01/09
2.9K0
C语言如何实现DES加密与解密
在工作中遇到的Des解密问题,第三方发来的数据需要我们进行des解密,但是解密的结果前几位始终是乱码。废了半天劲,终于找到了问题所在。
芯动大师
2023/10/14
5722
C语言如何实现DES加密与解密
DES算法的python3实现
DES原理 这里不予以复述, 有很多优秀的博客 原理可以参考这篇博客 https://www.cnblogs.com/songwenlong/p/5944139.html
py3study
2020/01/10
1.1K0
【C++】基础:加密算法介绍与部分实现
加密就是通过密码算法对数据进行转化,使之成为没有正确密钥任何人都无法读懂的报文。而这些以无法读懂的形式出现的数据一般被称为密文。为了读懂报文,密文必须重新转变为它的最初形式——明文,而含有以数学方式转换报文的双重密码就是密钥。
DevFrank
2024/07/24
9650
【C++】基础:加密算法介绍与部分实现
DES算法C++程序设计和实现
Data Encryption Standard (DES) 是一种典型的对称密钥算法,采用块加密方法,它以64位为分组长度,64位一组的明文作为算法的输入,通过与密钥运算和一系列复杂的操作,输出同样64位长度的密文,用同一密钥可以解密,所以该算法所有的保密性依赖于密钥,认为只有持有加密所用的密钥才能解密密文。DES采用64位密钥,但由于每8位中的最后1位用于奇偶校验,实际有效密钥长度为56位。DES算法的基本过程是换位和置换。
梦飞
2022/06/23
1K0
DES算法C++程序设计和实现
DES原理及python实现
DES是一种对称加密算法【即发送者与接收者持有相同的密钥】,它的基本原理是将要加密的数据划分为n个64位的块,然后使用一个56位的密钥逐个加密每一个64位的块,得到n个64位的密文块,最后将密文块拼接起来得到最终的密文
JuneBao
2022/10/26
1.8K0
DES原理及python实现
DES加密ECB模式的Java和C++实现
一、方案详细说明 更新内容: 报文添加加密功能 使用终端: RTU 加密方式: DES加密 DES加密模式: ECB模式 填充方式: zeropadding
ccf19881030
2022/12/01
1.4K0
Go 语言实现 AES 算法的加解密操作
AES(Advanced Encryption Standard,高级加密标准)是一种对称加密算法,即在加密和解密过程中使用同一个密钥。AES 算法属于分组加密算法,将数据按块处理,每块固定大小。AES 算法的核心思想是在多轮操作中对数据进行替换和置换,从而有效打乱数据,使其无法被破解。
陈明勇
2024/11/15
1810
Golang DES 加解密如何实现?
【导读】本文介绍了 DES 加密原理和作用,和 golang 中 DES 加密解密机制的相应实现。
码农编程进阶笔记
2022/08/18
1.9K0
Golang DES 加解密如何实现?
php中常用的Rc4/Des/AuthCode可逆加密函数
首先是AuthCode可逆加密函数,在dz论坛等各大程序的数据传输和登陆验证都有用到。
V站CEO-西顾
2018/06/10
1.4K0
安全篇之永强继续教你加解密:对称篇(三)
篇文中我们已经好像大概似乎看起来貌似搞定了ECB、CBC、CFB、OFB、CTR这五个英文单词缩写代表啥意义了,也弄清楚了aes-128-ecb中的128是啥意思了,好像还接触了一下填充的概念,最后就差那个iv向量到现在还没搞明白是个什么鬼玩意了… …
老李秀
2019/11/13
1.2K0
安全篇之永强继续教你加解密:对称篇(三)
什么?你还不会webshell免杀?(一)
还是可以发现其实只是过滤参数里的内容,其实依旧比较好绕过,下下面的字符串处理中,我们会使用到函数来进行流量加密和代码加密
红队蓝军
2022/07/06
1.6K0
什么?你还不会webshell免杀?(一)
算法科普:神秘的 DES 加密算法
DES 算法是一种常见的分组加密算法,由IBM公司在1971年提出。DES 算法是分组加密算法的典型代表,同时也是应用最为广泛的对称加密算法。本文将详细讲述DES 的原理以及实现过程。
五分钟学算法
2019/09/03
8.2K1
算法科普:神秘的 DES 加密算法
DES ECB加解密的Java实现
[2020-08-12 16:04:15.037]# RECV HEX FROM 117.136.81.93 :51423> C4 FC 35 4A 83 E1 71 F2 0D C0 FC B1 01 72 A2 DE D3 42 8C C8 39 0E EA 17 E8 24 4A 0A 0C 71 70 5B A4 06 FA FB 27 94 96 D9 AD E5 BB B6 29 05 D8 DF BE D9 CD F5 BB 33 CA 42 64 F3 6C 82 AB C4 D6 9D 2F E0 61 45 C2 20 49 02
ccf19881030
2020/08/17
1.7K0
各种密码学算法的GUI编程实现(DES、AES、Present、扩展欧几里得算法、素性检测)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/caomage/article/details/85337080
从入门到进错门
2019/01/03
1.5K0
密码学原理与实践笔记 - wuuconix's blog
移位密码。和凯撒密码原理类似。只不过移动的key不是3而可以是0~25中的任何值。所以Caesar Cipher是Shift Cipher的一种特例。
wuuconix
2023/03/13
9400
密码学原理与实践笔记 - wuuconix's blog
相关推荐
DES加解密算法原理详解与实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档