Bug有时候破坏的你的兴致,阻挠了保持到现在的渴望。可是,自己又非常明白,它是一种激励,是注定要被你踩在脚下的垫脚石!

  python2.7中最头疼的可能莫过于编码问题了,尤其还是在window环境下,有时候总是出现莫名其妙的问题,有时候明明昨天还好好的,今天却突然。。。遇到这种问题真的是一肚子的火。。。fuck!

  首先,在我们编写python代码的时候就要注意一些编码的规范。

  1.源码文件用#-*-coding:utf-8-*- 指定编码并把文件保存为utf-8格式

  2.文件开头使用from __future__ import unicode_literals   以此避免在中文前面加u,以考虑到迁移到python3。

  3.python内部是用Unicode存储的,所有的输入要先decode变成unicode,输入的时候encode变成想要的编码。在window环境下常用到的有utf-8,gbk,gb2312,gb18030等。

  4.一般网站基本都是utf-8或者gb2312。可以尝试进行decode,然后encode 当前输出环境的编码格式,系统默认的编码格式通过sys.getfilesystemencoding()。涉及到文件路径的时候要转换为系统默认的编码。

  5.unicode字符串在写入文件时必须转换为某种字符编码。

  在抓取网页时,我们可以先看看该网页的字符编码,这些内容可以在html代码或者f12看network中看到:

  当你得到网页源码后进行print的时候,那么你就要小心了。你可能会得到UnicodeEncodeError!

  你可以这样:

1 type = sys.getfilesystemencoding()
2 #utf-8为网页编码,可能为gbk等
3 html = html.decode('utf-8').encode(type)

  另外还有一种万能的方式,就是用chardet包确定网页编码。刚试了试 比较慢。。。需要安装chardet包,地址为https://pypi.python.org/pypi/chardet 可以通过pip install chardet 或者 easy_install chardet安装。使用代码如下:

1 htmlCharsetGuess = chardet.detect(pageCode)
2 htmlCharsetEncoding = htmlCharsetGuess["encoding"]
3 htmlCode_decode = pageCode.decode(htmlCharsetEncoding)
4 type = sys.getfilesystemencoding()
5 htmlCode_encode = htmlCode_decode.encode(type)
6 print htmlCode_encode

  还有一种可能就是,你得到的网站内容是被gzip压缩过的,这时候我们还需要去解压缩。大部分的服务器是支持gzip压缩的,我更改了一下HttpClient.py。我们默认就去已gzip的方式去访问网站,得到压缩过的内容再处理,这样抓取速度就更快了,下面来看一下HttpClient.py的Get方法:

 1 import zlib
 2 def Get(self, url, refer=None):
 3     try:
 4       req = urllib2.Request(url)
 5       req.add_header('Accept-encoding', 'gzip')#默认以gzip压缩的方式得到网页内容
 6       if not (refer is None):
 7         req.add_header('Referer', refer)
 8       response = urllib2.urlopen(req, timeout=120)
 9       html = response.read()
10       gzipped = response.headers.get('Content-Encoding')#查看是否服务器是否支持gzip
11       if gzipped:
12           html = zlib.decompress(html, 16+zlib.MAX_WBITS)#解压缩,得到网页源码
13       return html
14     except urllib2.HTTPError, e:
15       return e.read()
16     except socket.timeout, e:
17       return ''
18     except socket.error, e:
19       return ''

  写了这么多发现没写到点子上,自己经验比较少,然而字符编码这种事情是需要经验的。总结起来就是一句话,如果出现了UnicodeEncodeError错误了,就说明字符编码出问题了,python解释器也是一个工具,你需要让他明白,所以要decode,然后他为了让你明白所以要encode。  为了万无一失推荐使用chardet包!

转载于:https://www.cnblogs.com/jixin/p/5141701.html

自学Python八 爬虫大坑之网页乱码相关推荐

  1. 杭州自学python爬虫_金华自学python网络爬虫直播

    金华自学python网络爬虫直播操作符说明实例.表示任何单个字符?[ ]字符集,对单个字符给出取值范围[abc],表示a,b,c,[a-z]表示a到z的单个字符[^ ]非字符集,对单个字符给出排除范围 ...

  2. Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过浏览器审查元素解析真实网页地址...

    由于主流网站都使用JavaScript展示网页内容,和前面简单抓取静态网页不同的是,在使用JavaScript时,很多内容并不会出现在HTML源代码中,而是在HTML源码位置放上一段JavaScrip ...

  3. python网络爬虫--网页登录

    1.前言 主要用到python的selenium库,通过模仿浏览器行为+定位登录所需的标签位置,实现网页登录功能.最后在码云(gitee)上测试自动登录功能. 2.selenium定位网页元素 关于s ...

  4. python网络爬虫之解析网页的正则表达式(爬取4k动漫图片)[三]

    目录 前言 一.正则表达式的学习 1.正则表达式的匹配工具 2.正则表达式的样式 3.正则表达式的案例 二.爬取网页图片 1.分析网页 2.获取数据 爬取妹子网的案例 后记 前言 hello,大家好 ...

  5. python爬虫-彻底解决网页乱码

    前言 相信大家在使用requests模块在抓取网页时,有时会遇到类似好å�¬ç��é�³ä¹�ï¼�好ç��ç��格式的编码,很是头疼. 如何解决这种问题呢?下面来看一下requests解码方 ...

  6. 开发记录_自学Python写爬虫程序爬取csdn个人博客信息

    每天刷开csdn的博客,看到一整个页面,其实对我而言,我只想看看访问量有没有上涨而已... 于是萌生了一个想法: 想写一个爬虫程序把csdn博客上边的访问量和评论数都爬下来. 打算通过网络各种搜集资料 ...

  7. 自学Python六 爬虫基础必不可少的正则

    要想做爬虫,不可避免的要用到正则表达式,如果是简单的字符串处理,类似于split,substring等等就足够了,可是涉及到比较复杂的匹配,当然是正则的天下,不过正则好像好烦人的样子,那么如何做呢,熟 ...

  8. Python使用request包请求网页乱码解决方法

    使用requests请求网页时,返回的页面信息有时是乱码,如下代码 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) Appl ...

  9. 自学Python九 爬虫实战二(美图福利)

    作为一个新世纪有思想有文化有道德时刻准备着的屌丝男青年,在现在这样一个社会中,心疼我大慢播抵制大百度的前提下,没事儿上上网逛逛YY看看斗鱼翻翻美女图片那是必不可少的,可是美图虽多翻页费劲!今天我们就搞 ...

最新文章

  1. Scikit-learn环境的搭建
  2. 将time_t格式的字符串转换成具体的时间, 存放在SystemTime结构体中
  3. POJ 1007 DNA排序解题
  4. spring boot没有web.xml,如何向嵌入式的servlet容器中注册servlet组件
  5. android游戏渠道支付,Android渠道支付隐患及推荐解决方案
  6. Linux环形缓冲区原理
  7. AI 口罩督查官诞生,识别率高达 85%!
  8. group by调优的一些测试
  9. 小学计算机键盘的初步认识教案,小学三年级信息技术--认识键盘教学设计(宋艳)[小编整理]...
  10. C语言基础丨(六)程序结构——顺序结构【1】
  11. 创建图层-只是保存lyr,此路不通
  12. 郑州大学计算机考研944,2020年郑州大学944计算机技术专业基础综合考研复习资料...
  13. 华为社会招聘面试流程
  14. 打印代码执行所耗费时间--毫秒
  15. 无损视频合并软件有哪些?如何合并视频
  16. Markdown的使用之一:表格和公式
  17. 小米机器人扫地机贴纸_小米扫地机亲测,真的好用
  18. Git配置指南与使用
  19. 使用keras.applications和keras_applications构建keras.Model
  20. 解决pycharm汉化后无法打开设置

热门文章

  1. LinkedHashMap转对象
  2. JAVA笔记:double四舍五入并保留两位小数的方法
  3. jdbcUrl is required with driverClassName错误解决
  4. java循环1000000000_Java11比Java8快多少,不是测试人员一眼也能看懂
  5. 用Python快速找到出现次数最多的数据
  6. 重学前端学习笔记(十三)--浏览器工作解析(三)
  7. solrcloud配置中文分词器ik
  8. angular4 辅助路由
  9. Qt 信号-槽的同步与异步处理
  10. PS:oracle恢复删除的数据