php网页抓取乱码(1.源码文件开头使用__importunicode_literals_)

优采云 发布时间: 2022-02-12 21:21

  php网页抓取乱码(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包!

  分类:

  技术要点:

  相关文章:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线