文档章节

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

amita
 amita
发布于 2017/05/13 17:32
字数 467
阅读 627
收藏 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
Python爬取妹子,哇!太多了,看不过来了,我一个G的硬盘要满了

淘女郎爬虫,可动态抓取淘女郎的信息和照片。 需要额外安装的第三方库 加小编Python学习群:813542856可以获取各类Python学习资料哦! requests pip install requests pymongo pip install ...

浪里小白龙q
2018/11/27
0
0
网页爬虫--requests--urllib2--cgi

-- --import------import requests 模块---python爬虫---------------------------------------------------------------------------- -- 用Pyhton自带的urllib或urllib2模块抓取网页或许有......

liapple6
2018/10/28
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
2018/01/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

图像库stb_image

https://github.com/nothings/stb 目前一般主流的图像格式也就是bmp,jpg,png,tga,dds,除了DDS一般是给DX用的,虽然一堆OpenGL程序也有用的,但是我一般只用png和tga, png不用说了,带a...

robslove
7分钟前
0
0
Spring 事务提交回滚源码解析

前言 在上篇文章 Spring 事务初始化源码分析 中分析了 Spring 事务初始化的一个过程,当初始化完成后,Spring 是如何去获取事务,当目标方法异常后,又是如何进行回滚的,又或是目标方法执行...

TSMYK
26分钟前
1
0
百度黄埔学院将培养一批首席AI架构师,为“国之重器”赋能

深度学习高端人才不仅是AI发展的重要养分,也是企业转型AI巨大推动力。2019年1月19日,百度黄埔学院——深度学习架构师培养计划在百度科技园举行开学典礼,深度学习技术及应用国家工程实验室...

深度学习之桨
53分钟前
2
0
扒站wget仿站

wget -c -r -p -np -k http://xxx.com/xxx 其中: -c, --continue (断点续传) 接着下载没下载完的文件 -r, --recursive(递归) specify recursive download.(指定递归下载) -p, --page...

临江仙卜算子
55分钟前
2
0
Nextjs+React非页面组件SSR渲染

@随风溜达的向日葵 Nextjs Nextjs是React生态中非常受欢迎的SSR(server side render——服务端渲染)框架,只需要几个步骤就可以搭建一个支持SSR的工程(_Nextjs_的快速搭建见Next.js入门)...

随风溜达的向日葵
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部