网页编码格式比较多,比如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)