网页抓取解密(做了个网络爬虫抓取网页,最后居然搞出来了)

优采云 发布时间: 2022-02-19 07:04

  网页抓取解密(做了个网络爬虫抓取网页,最后居然搞出来了)

  我做了一个网络爬虫来爬取网页,但是如果网页是gbk/gb2312编码的,就会出现乱码,如下:

  得到文本后直接打印,输出str如下: ¹óÖÝÈËÊ¿ ¼ÊÔÐÅÏ¢Íø_¹óÖÝÈËÊÂ¿Ê ¼ÊÔÊÂ¿Ê ¼ÊÔÍø_¹óÖݹ«ÎñÔ±¿¿ ¼ÊÔÔ±¿¿ ¼ÊÔÔ±¿¿

  这个问题困扰了我很久,百度、google都没有找到完全可行的方法,继续折腾,终于出来了!代码转换来回转换,依然无法解决。把问题具体总结一下,分享给大家,互相学习!(有时候问题并不复杂,容易解决。如果问题没有突破,那么解决问题的路是很长的。)总之,遇到问题,选择几种方法去尝试,就有了总是有办法解决它。的。

  1.更改网页源代码的编码格式

  # -*- coding:utf8 -*-

import urllib2

req = urllib2.Request("http://www.baidu.com/")

res = urllib2.urlopen(req)

html = res.read()

res.close()

html = unicode(html, "gb2312").encode("utf8") #gb2312--->utf-8

print html

  2.python爬取网页时字符集转换问题处理解决方案

  有时我们 采集 网页,将字符串保存到文件或在处理后将它们写入数据库。这时,我们需要制定字符串的编码。如果采集网页的编码是gb2312,而我们的数据库是utf-8,不做任何处理直接插入数据库可能会出现乱码(未测试,不知道数据库会不会自动转码),我们需要手动将gb2312转为utf-8。

  首先我们知道python中的字符默认是ascii码。当然,英语没有问题。遇到中国人,立马下跪。

  不知道大家还记得没有,python中打印汉字的时候,需要在字符串前面加上u:

  print u"来做基地?"

  这样就可以显示中文了。u这里的作用是将下面的字符串转换成unicode码,这样才能正确显示中文。

  这里有一个与之相关的unicode()函数,使用如下

  str="来基地"

  str=unicode(str,"utf-8")

  打印字符串

  与u的区别在于unicode用于将str转为unicode编码,需要正确指定第二个参数。这里的utf-8是我的test.py脚本本身的文件字符集,默认的可能是ansi。

  unicode 是键,下面继续

  我们开始爬取百度主页。注意,访问者访问百度主页查看网页源代码时,其charset=gb2312。

  导入 urllib2

  定义主():

  f=urllib2.urlopen("")

  str=f.read()

  str=unicode(str,"gb2312")

  fp=open("baidu.html","w")

  fp.write(str.encode("utf-8"))

  fp.close()

  如果 __name__ == '__main__' :

  主要的()

  解释:

  我们先用urllib2.urlopen()方法抓取百度主页,f为句柄,使用str=f.read()将所有源码读入str

  明确str是我们抓取的html源代码。由于网页默认的字符集是gb2312,如果我们直接保存到文件中,文件编码会是ansi。

  对于大部分人来说,这其实已经足够了,但是有时候我只想把gb2312转成utf-8,怎么办呢?

  第一的:

  str=unicode(str,"gb2312") #这里的gb2312是str的实际字符集,我们现在将其转换为unicode

  然后:

  str=str.encode("utf-8") #将unicode字符串重新编码为utf-8

  最后:

  将str写入文件,打开文件查看编码属性,发现是utf-8,转码为utf-8。

  总结:

  我们回顾一下,如果需要按照指定的字符集保存字符串,有以下步骤:

  1:使用unicode(str, "original encoding") 将str解码成unicode字符串

  2:使用str.encode("specified character set")将unicode字符串str转换成你指定的字符集

  3:将str保存到文件,或写入数据库。当然,你已经指定了编码,对吧?

  3.用 lxml 解析 html

  使用lxml.etree作为网络爬虫来爬取网页,但是如果网页是gbk/gb2312编码的,会出现乱码,如下:

  获取文本后,直接打印,输出结果v如下:

  ¹óÖÝÈËÊ¿ ¼ÊÔÐÅÏ¢Íø_¹óÖÝÈËÊÂ¿Ê ¼ÊÔÍø_¹óÖݹ«ÎñÔ±¿¿ ¼ÊÔÍø_¹óÖÝÖй«这个v的类型又是

  如何解决?

  可以修改源代码的编码格式:

  response.encoding='utf-8'

  page=etree.HTML(response.content)

  nodes_title=page.xpath("//title//text()")

  这样打印出来的nodes_title[0]是正常中文显示的。

  特别注意的是response.text容易出现编码问题,所以以后使用response.content。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线