php网页抓取乱码(1.源码文件开头使用__importunicode_literals_)
优采云 发布时间: 2022-02-12 21:21php网页抓取乱码(1.源码文件开头使用__importunicode_literals_)
2021-10-10
虫子有时会破坏你的心情,阻碍你留在现在的状态。但是,我很清楚,那是一种激励,是注定要被你踩到的垫脚石!
python2.7中最头疼的可能就是编码问题了,尤其是window环境下,有时候会莫名其妙的出现问题,有时候昨天还好好的,今天突然就这样了。. . 遇到这种问题,真是一肚子火。. . 他妈的!
首先,我们在写python代码的时候,一定要注意一些编码规范。
1.源文件使用#-*-coding:utf-8-*-指定编码,保存文件为utf-8格式
2.在文件开头使用 from __future__ import unicode_literals 避免在中文前面加 u 以允许迁移到 python3。
3.python内部存储为unicode,所有输入必须先解码成unicode,输入时encode变成想要的编码。常用的window环境有utf-8、gbk、gb2312、gb18030等。
4.通用网站基本都是utf-8或者gb2312。您可以尝试解码然后编码当前输出环境的编码格式。系统默认的编码格式是通过sys.getfilesystemencoding()传递的。说到文件路径,需要转换成系统默认编码。
5.unicode 字符串在写入文件时必须转换为某种字符编码。
在爬取网页的时候,我们可以先看网页的字符编码,可以在html代码或者f12看网中看到:
当您打印网页的源代码时,您必须小心。你可能会得到 UnicodeEncodeError!
你可以这样做:
1 type = sys.getfilesystemencoding()
2 #utf-8为网页编码,可能为gbk等
3 html = html.decode('utf-8').encode(type)
另一种通用的方法是使用 chardet 包来确定网页编码。刚试了一下,速度很慢。. . 需要安装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解释器也是一个工具。你需要让他明白,所以他需要解码,然后他需要编码让你明白。为了万无一失,建议使用chardet包!
分类:
技术要点:
相关文章: