网络爬虫(Spider)python研究(2)-网页编码解析

网页编码格式比较多,比如utf8,gb2313等等,我们需要转化成统一格式,便于解析文本。

headers = {
    'x-requestted-with': 'XMLHttpRequest',
    'Accept-Language': 'zh-cn',
    'Accept-Encoding': 'gzip, deflate',
    'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6',
    'ContentType': 'application/x-www-form-urlencoded; chartset=UTF-8',
}
req = urllib2.Request(url='http://www.baidu.com/', headers=headers)

try:
    response = opener.open(req)
    html = response.read()
except urllib2.HTTPError, e:
    print "error code:", e.code
except urllib2.URLError, e:
    print "reason:", e.reason

通过url下载到网页文本后,需要做的几件事:
1、是不是有压缩(gzip)
2、判断字符集(utf-8、gbk2313…)
3、解析文本(re、httpparse…)

一、网页压缩
有些网页为了节省流量会要文件,我们在url请求中,可以指定压缩格式(Accept-Encoding):’gzip, deflate’, 一般网页都是gzip。解压gzip 用gzip。flate用zlip。
判断下载的网页是否压缩的方法有两种:
(1)根据头文件消息:

encoding = response.info().get('Content-Encoding')
if encoding == 'gzip':
    html = gzip.GzipFile(fileobj=StringIO.StringIO(html)).read()

(2)根据网页文本:

if html [:6] == '\x1f\x8b\x08\x00\x00\x00':
    html = gzip.GzipFile(fileobj=StringIO.StringIO(html)).read()

ref:http://www.jianshu.com/p/2c2781462902

二、判断字符集
判断网页字符集,可以根据网页上的meta上的charset判断,不过这个一般不准,很多都是随便写的。所以还是自己原始判断最可靠,这里使用chardet库。

import chardet

charset = chardet.detect(html)['encoding']
if charset != 'utf-8':
    html = html.decode('gbk', 'ignore').encode('utf8')

decode传ignore 是为了一些解析错误,不然有些gb2312的网页会报错:
UnicodeDecodeError: ‘gbk’ codec can’t decode bytes in position 23426-23427: illegal multibyte sequence

ref:http://python-china.org/t/146

三、解析文本
解析的工具就很多了,也是网络爬虫很重要的一部分。比如最原始的正则表达式(re)、httpparse、xpath、BeautifulSoup….

比如一个查找多有href=字段的正则表达式:

pattern = re.compile('(?<=href=").*?(?=")')  
links = re.findall(pattern, html)

你可能感兴趣的:(Python,Spider)