网页抓取qq(如何判断网页的编码问题(一)_光明网(图))

优采云 发布时间: 2022-02-02 06:13

  网页抓取qq(如何判断网页的编码问题(一)_光明网(图))

  使用python2爬取网页时,经常会遇到抓取到的内容显示为乱码的情况。

  这种情况最大的可能是编码问题:运行环境的字符编码和网页的字符编码不一致。

  例如,在 Windows 控制台 (gbk) 中获取一个 utf-8 编码的 网站。或者,在Mac/Linux终端中抓一个gbk编码的网站(utf-8)。因为大部分网站使用utf-8编码,而且很多人使用windows,都是很常见。

  如果你发现你抓取的内容在英文、数字、符号上看起来都正确,但是中间有一些乱码,你基本上可以断定是这样的。

  这个问题的解决方法是先将结果按照网页的编码方式解码成unicode,然后输出。如果不确定网页的编码,可以参考以下代码:

  import urllib

req = urllib.urlopen("http://some.web.site")

info = req.info()

charset = info.getparam('charset')

content = req.read()

print content.decode(charset, 'ignore')

  'ignore' 参数用于忽略无法解码的字符。

  但是,这种方法并不总是有效。另一种方式是通过正则表达式直接匹配网页代码中的编码设置:

  除了编码问题导致的乱码外,另一个经常被忽视的情况是目标页面启用了 gzip 压缩。压缩网页传输的数据更少,打开速度更快。在浏览器中打开时,浏览器会根据网页的头部信息自动解压。但是直接用代码抓取不会。因此,很可能会感到困惑,为什么打开网页地址是对的,但程序爬取却不行。就连我自己也被这个问题愚弄了。

  这种情况的表现是,几乎所有的抓取内容都是乱码,甚至无法显示。

  要确定网页是否启用了压缩并解压缩,请使用以下代码:

  import urllib

import gzip

from StringIO import StringIO

req = urllib.urlopen("http://some.web.site")

info = req.info()

encoding = info.getheader('Content-Encoding')

content = req.read()

if encoding == 'gzip':

buf = StringIO(content)

gf = gzip.GzipFile(fileobj=buf)

content = gf.read()

print content

  在我们的课堂编程示例天气检查系列中,这两个问题困扰着不少人。这里有一个特殊的解释。

  最后,还有一个“武器”要介绍。如果你一开始使用它,你甚至都不知道存在上述两个问题。

  这是请求模块。

  与爬网类似,只需:

  import requests

print requests.get("http://some.web.site").text

  没有编码问题,没有压缩问题。

  这就是我喜欢 Python 的原因。

  至于如何安装requests模块,请参考之前的文章:

  如何为 Python 安装第三方模块

  pip 安装请求

  随附的:

  【Python第43课】查看天气(1)

  【Python第44课】查看天气(2)

  【Python第45课】查看天气(3)

  【Python第46课】查看天气(4)

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线