网页抓取解密(做了个网络爬虫抓取网页,最后居然搞出来了)
优采云 发布时间: 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。