文档章节

Python3使用Requests抓取网页乱码问题

amita
 amita
发布于 2017/05/13 17:32
字数 467
阅读 472
收藏 0

1. 问题1

import requests
r = requests.get(url)
print r.text

结果乱码!

分析

with open('a.html', 'wb') as f:
    f.write(r.content)

用编辑器打开一看,非文本。用命令 file a.html 一看,识别为 gzip 格式。原来返回数据经过了 gzip 压缩。
难道要自己判断格式并解压缩?
搜了下,发现 requests 支持 gzip 自动解压,这里为何不行?难道网站返回的编码有误?

print(response.headers['content-encoding'])

返回的确实是“gzip”,怎么没有自动解压?
经过坑die的探索,终于发现response.headers['content-encoding']的值其实是“gzip ”,右边多了几个空格!导致无法识别。
这个锅谁来背?request 库还是网站??

解决方案

1. Request header 里移除 ”Accept-Encoding”:”gzip, deflate”

这样能直接得到明文数据,缺点:流量会增加很多,网站不一定支持。

2. 自己动手,解压缩,解码,得到可读文本

这也是本文使用的方案

2. 问题2

print(response.encoding)

发现网页编码是 'ISO-8859-1',这是神马?
《HTTP权威指南》第16章国际化里提到,如果HTTP响应中Content-Type字段没有指定charset,则默认页面是'ISO-8859-1'编码。这处理英文页面当然没有问题,但是中文页面就会有乱码了!

分析

1. print(r.apparent_encoding)  
2. get_encodings_from_content(r.content)
  1. 据说使用了一个叫chardet的用于探测字符集的第三方库,解析会比较慢。没装,结果是 None
  2. 网上很多答案如此,应该是 python2 的,因为 3 里的 r.content 是 bytes 类型,应改为get_encodings_from_content(r.text),前提是 gzip 已经解压了

3. 源码

代码如下, 基于Python 3.5

# 猜测网页编码  
def guess_response_encoding(response):
    if response.encoding == 'ISO-8859-1':
        if response.content[:2] == b"\x1f\x8b":  # gzip header
            content = gzip.decompress(response.content)
            content = str(content, response.encoding)
        else:
            content = response.text
        encoding = get_encodings_from_content(content)
        if encoding: 
            response.encoding = encoding[0]
        elif response.apparent_encoding: 
            response.encoding = response.apparent_encoding
    print("guess encoding: ", response.encoding)

© 著作权归作者所有

共有 人打赏支持
amita
粉丝 7
博文 11
码字总数 6124
作品 0
广州
程序员
python2利用urllib2抓取中文网页乱码的问题

话说晚上上完爬虫抓取班会之后群里有童鞋扔出来了一个网址 www.runoob.com/python/python-exercise-example1.html 并且疑问说这个地址用urllib2抓出来的居然是乱码希望大家一起看看。本着上山...

木木成洋
2017/11/11
0
0
python2利用urllib2抓取中文网页乱码的问题

话说晚上上完爬虫抓取班会之后群里有童鞋扔出来了一个网址 www.runoob.com/python/python-exercise-example1.html 并且疑问说这个地址用urllib2抓出来的居然是乱码希望大家一起看看。本着上山...

木木成洋
2017/11/02
0
0
文章内容提取库 goose 简介

爬虫抓取数据有两个头疼的点,写过爬虫的小伙伴们一定都深有体会: 网站的防抓取机制。你要尽可能将自己伪装成“一个人”,骗过对方的服务器反爬验证。 网站的内容提取。每个网站都需要你做不...

crossin
10/13
0
0
Python3 requests 添加 cookie

我们平时使用requests获取网络内容很简单,几行代码搞定了,例如: [python] view plain copy import requests res=requests.get("https://cloud.flyme.cn/browser/index.jsp") print res.co......

阿豪boy
01/17
0
0
Python--(爬虫与数据库的连接)

(每一天都是属于你的!) Python对于初学后巩固基础的人还是更多的来接触python爬虫会更好一些,在Python爬虫中包含很多基础部分知识,并且在项目中会提升你的成功感!加油! 我在工作之余时...

jamesjoshuasss
06/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

深入解析MySQL视图VIEW

Q:什么是视图?视图是干什么用的? A:视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。   通过视图,可以展现基表的部分数据;...

IT--小哥
43分钟前
2
0
虚拟机学习之二:垃圾收集器和内存分配策略

1.对象是否可回收 1.1引用计数算法 引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时候计数器值为0的对象就是不可能...

贾峰uk
53分钟前
2
0
smart-doc功能使用介绍

smart-doc从8月份底开始开源发布到目前为止已经迭代了几个版本。在这里非常感谢那些敢于用smart-doc去做尝试并积极提出建议的社区用户。因此决定在本博客中重要说明下smart-doc的功能,包括使...

上官胡闹
昨天
9
0
JavaEE——Junit

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 Junit Junit又名单元测试,Junit是用来测试Jav...

凯哥学堂
昨天
6
0
读《美丽新世界》

一、背景 十一国庆节从重庆回深圳的时候,做得绿皮车,路上看了两本书:李笑来的《韭菜的自我修养》和禁书《美丽新世界》。 上篇文章已经分享了 读《韭菜的自我修养》,这篇文章来记录一下《...

tiankonguse
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部