现在的位置: 首页 > 综合 > 正文

python爬虫初学(3)

2014年09月05日 ⁄ 综合 ⁄ 共 2072字 ⁄ 字号 评论关闭

已知在一个网页中,他的头部信息描述了很多这个页面的有用信息,包括该网页的字符编码,等等一系列对抓取爬虫有用的信息。为了能够利用这些信息,就要用一些特定的函数或者发放获取到这些信息。


获取函数头部信息的代码为:

import urllib                 #导入模块
url = "http://www.iplaypython.com/"
html = urllib.urlopen(url)
head_info = html.info()

head_info里面就包含网站的头部信息,type之后,发现他的类型为一个实例。那么dir(head_info)一下,就会发现这个实例所能引用的方法有哪些

>>> import urllib
>>> dir(urllib.urlopen('http://www.163.com').info())
['__contains__', '__delitem__', '__doc__', '__getitem__', '__init__', '__iter__', '__len__', '__module__', '__setitem__', '__str__', 'addcontinue', 'addheader', 'dict', 'encodingheader', 'fp', 'get', 'getaddr', 'getaddrlist', 'getallmatchingheaders', 'getdate', 'getdate_tz', 'getencoding', 'getfirstmatchingheader', 'getheader', 'getheaders', 'getmaintype', 'getparam', 'getparamnames', 'getplist', 'getrawheader', 'getsubtype', 'gettype', 'has_key', 'headers', 'iscomment', 'isheader', 'islast', 'items', 'keys', 'maintype', 'parseplist', 'parsetype', 'plist', 'plisttext', 'readheaders', 'rewindbody', 'seekable', 'setdefault', 'startofbody', 'startofheaders', 'status', 'subtype', 'type', 'typeheader', 'unixfrom', 'values']
>>> 


其中getparam这个方法就可以获取一下网站的字符编码,这个函数不是每次调用的时候去检查一遍网页的所有内容看是什么编码,它是在网页的头部信息中获取到的。

Expires: Thu, 10 Apr 2014 15:51:37 GMT
Date: Thu, 10 Apr 2014 15:50:17 GMT
Server: nginx
Content-Type: text/html; charset=GBK
Vary: Accept-Encoding,User-Agent,Accept
Cache-Control: max-age=80
X-Via: 1.1 sicyd210:8110 (Cdn Cache Server V2.0), 1.1 hnyd196:4 (Cdn Cache Server V2.0)
Connection: close

上面是网易主页的网站头部信息,可以看到,网页的字符编码在charset中。所以,当我们要对于这个网页头部信息获取他的字符编码的时候,可以调用getparam函数,并且向函数传递一个参数'charset',那么该函数就会返回头部信息中charset所保存的内容,即字符编码。但是如果某些网站没有把字符编码的信息放在函数头部的话,那么我们就获取不到这个值,返回的就是NONE,即某个网页的头部信息中没有charset这个值,那么就不能获取。爬取的这些头部信息不是从网页中来爬取的,是在它的网站服务器上面。


chardet字符集检测模块:

如果某些网站因为编写不规范,导致我们在用getparam的时候并不能获取到网页的字符编码模式,返回的是空值,我们就要用chardet模块中的detect方法来检测 某个网页的字符编码。

#coding=utf-8
import chardet
import urllib                 #导入模块
url = "http://www.iplaypython.com/"
html = urllib.urlopen(url).read()
print chardet.detect(html)

向detect方法传入该网页的内容,就会检测到这个网页所用的字符集。


{'confidence': 0.99, 'encoding': 'utf-8'}

返回的是一个字典,第一个是这个结果的可信度,第二个是检测出来的这个网页的字符编码方式。这个模块的方法,是会检测你网页的全部内容,以这个为准,不会相信任何网页中显示表明的字符编码方式。这个函数还能检测任何以字符串形式作为参数传递进来的字符编码方式。


可以把上述的检测功能封装为一个函数,作为检测网页字符编码的一个模块。





抱歉!评论已关闭.