python以gzip header请求html数据时,response内容乱码无法解码的解决方案

1. 问题背景

在使用urllib2 module抓取web数据时,如果希望使用如何request header,减少传输时数据量。返回的数据,是经过gzip压缩的。直接按照 content.decode(“utf8”), 解码会出现异常,并且也无法检测网页数据的实际编码类型。

2. 问题分析

因为http请求中,如果在request header包含”Accept-Encoding”:”gzip, deflate”, 并且web服务器端支持,返回的数据是经过压缩的,这个好处是减少了网络流量,由客户端根据header,在客户端层解压,再解码。urllib2 module,获取的http response数据是原始数据,没有经过解压,所以这是乱码的根本原因。

3. 解决方案

3.1 Request header移除”Accept-Encoding”:”gzip, deflate”

最快的方案,能直接得到可解码的数据,缺点是,传输流量会增加很多。

3.2 使用zlib module,解压缩,然后解码,得到可读的明文数据。

这也是本文使用的方案

4. 源码解析

代码如下, 这是一个典型的模拟form表单,post方式提交请求数据的代码,基于python 2.7

,

代码块

代码块语法遵循标准markdown代码

#! /usr/bin/env python2.7
import sys
import zlib
import chardet
import urllib
import urllib2
import cookielib

def main():
    reload( sys )
    sys.setdefaultencoding(‘utf-8‘)
    url = ‘http://xxx.yyy.com/test‘
    values = {
            "form_field1":"value1",
            "form_field2":"TRUE",
             }

    post_data = urllib.urlencode(values)
    cj=cookielib.CookieJar()
    opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
    headers ={"User-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:36.0) Gecko/20100101 Firefox/36.0",
              "Referer":"http://xxx.yyy.com/test0",
              "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
              "Accept-Language":"en-US,en;q=0.5",
              "Accept-Encoding":"gzip, deflate",
              "Connection":"keep-alive",
              # "Cookie":"QSession=",
              "Content-Type":"application/x-www-form-urlencoded",
              }
    req = urllib2.Request(url,post_data,headers)
    response = opener.open(req)
    content = response.read()
    gzipped = response.headers.get(‘Content-Encoding‘)
    if gzipped:
        html = zlib.decompress(content, 16+zlib.MAX_WBITS)
    else:
        html = content
    result = chardet.detect(html)
    print(result)
    print html.decode("utf8")

if __name__ == ‘__main__‘:
    main()  

使用本脚本需要以下环境

- Mac OS 10.9+

- Python 2.7.x

目录

[TOC]来生成目录:

  • 问题背景
  • 问题分析
  • 解决方案
    • 1 Request header移除Accept-Encodinggzip deflate
    • 2 使用zlib module解压缩然后解码得到可读的明文数据
  • 源码解析
      • 代码块
      • 目录
时间: 2024-11-05 14:46:54

python以gzip header请求html数据时,response内容乱码无法解码的解决方案的相关文章

用 python 或者curl 抓取web数据时

今天接到一个web的同事求助,他本来通过java抓取一个web页面的内容,但是发现抓取得都是些乱码,然后又尝试用 python的urllib来获取,依然是乱码,不过在浏览器访问却是正常的json格式数据. 首先,我先用curl获取了下这个web,发现确实是一些不可见的字符,把它保存下来. 再使用浏览器获取下这个web内容,对比下发现字节数是不一样的,说明不是编码显示的问题. 这个时候我考虑可能是http协议参数的问题,于是使用wireshark捕获用浏览器的请求,用tcpdump捕获了curl的

MySQL 插入数据时,中文乱码问题的解决(转)

当向 MySQL 数据库插入一条带有中文的数据形如 insert into employee values(null,'张三','female','1995-10-08','2015-11-12','Sales',2000,'是个好员工!'); 出现乱码时,可以使用语句 show variables like 'character%'; 来查看当前数据库的相关编码集. 从上图中可以看到 MySQL 有六处使用了字符集,分别为:client .connection.database.results

mysql插入数据时,中文乱码问题的解决

当向 MySQL 数据库插入一条带有中文的数据形如 insert into employee values(null,'张三','female','1995-10-08','2015-11-12','Sales',2000,'是个好员工!'); 出现乱码时,可以使用语句 show variables like 'character%'; 来查看当前数据库的相关编码集. 从上图中可以看到 MySQL 有六处使用了字符集,分别为:client .connection.database.results

向hive上传数据时,中文乱码

sudo -u hive hive -e "use dataplat;load data local inpath '/home/dlht/data/test/2_times.csv' overwrite into table 2_times " 这时中文乱码 解决办法是,将数据转成utf-8..

[MySQL] 导入数据时防止出现乱码

当我们在进行导入sql语句的操作时,一定要注意是否设置了编码,如果没有设置编码,在php代码中进行读取时会出现乱码. 一般可以有两种方式 1.在sql文件中增加set names utf8 2.在进行导入时的命令中增加参数,比如 mysql -uroot -p123456 数据库名 --default-character-set=utf8 < /xxx.sql 原文地址:https://www.cnblogs.com/taoshihan/p/12141600.html

MySQL 插入数据时,中文乱码问题的解决

在mysql控制台,查看当前数据库的相关编码集:show variables like 'character%'; 一劳永逸的解决乱码问题,打开my.ini这个配置文件,加入这个代码,然后重启mysql服务 [mysql] default-character-set=utf8 [mysqld] character-set-server=utf8

Vue-Resource请求PHP数据失败的原因

在写一个Vue项目的时候发现在使用Vue-Resource的post方法请求PHP数据时,完全没有反应,查阅资料才知道没有加配置参数: { emulateJSON:true } 这个配置参数的意思是: 设置为true后,会把request body以application/x-www-form-urlencoded的形式发送,相当于表单提交.此时http中的header的content-type为application/x-www-form-urlencoded.常用于服务器端未使用applic

Power BI Python 在Power BI Desktop中Python代码如何使用Power Query数据

通过Power BI Python 在Power BI Desktop中使用Python导入数据这篇文章,我们知道了Power BI如何获取Python脚本中的导入数据.那么反过来如何在Python中使用Power Query中的数据了? 首先我们进入Power Query管理器界面,通过新建一个空查询,并建立一个1到100的列表,再将其转换为表 随后我们依次点击"转换/运行Python脚本" 在脚本对话框中,输入如下所示的代码: dataset.insert(1,"add_

HTTP 请求方式: GET和POST的比较当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。

什么是HTTP? 超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议. HTTP在客户端和服务器之间以request-response protocol(请求-回复协议)工作. GET - 从指定的服务器中获取数据 POST - 提交数据给指定的服务器处理 GET方法: 使用GET方法时,查询字符串(键值对)被附加在URL地址后面一起发送到服务器: /test/demo_form.jsp?name1=value1