由于涉及到中文,因此必然地涉及到了编码的问题,这一次借这个机会算是完全搞清楚了。html
问题要从文字的编码讲起。本来的英文编码只有0~255,恰好是8位1个字节。为了表示各类不一样的语言,天然要进行扩充。中文的话有GB系列。可能还据说过Unicode和UTF-8,那么,它们之间是什么关系呢?python
Unicode是一种编码方案,又称万国码,可见其包含之广。可是具体存储到计算机上,并不用这种编码,能够说它起着一个中间人的做用。你能够再把Unicode编码(encode)为UTF-8,或者GB,再存储到计算机上。UTF-8或者GB也能够进行解码(decode)还原为Unicode。数据库
在python中Unicode是一类对象,表现为以u打头的,好比u'中文',而string又是一类对象,是在具体编码方式下的实际存在计算机上的字符串。好比utf-8编码下的'中文'和gbk编码下的'中文',并不相同。能够看以下代码:express
1vim 2cookie 3网络 4学习 5网站 6ui 7 8 9 |
|
能够看到,其实存储在计算机中的只是这样的编码,而不是一个一个的汉字,在print的时候要知道当时是用的什么样的编码方式,才能正确的print出来。有一个说法提得很好,python中的Unicode才是真正的字符串,而string是字节串
既然有不一样的编码,那么若是在代码文件中直接写string的话,那么它究竟是哪种编码呢?这个就是由文件的编码所决定的。文件老是以必定的编码方式保存的。而python文件能够写上coding的声明语句,用来讲明这个文件是用什么编码方式保存的。若是声明的编码方式和实际保存的编码方式不一致就会出现异常。能够见下面例子: 以utf-8保存的文件声明为gbk
1 2 3 4 5 6 7 8 9 |
|
提示错误 File "test.py", line 1 SyntaxError: Non-ASCII character '\xe6' in file test.py on line 1, but no encodi ng declared; see http://www.python.org/peps/pep-0263.html for details 改成
1 2 3 4 5 6 7 8 9 |
|
输出正常结果 u'\u6c49' '\xe6\xb1\x89' '\xba\xba' '\xe6\xb1\x89'
更多内容可参见这篇文章http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html
其实用python爬取网页很简单,只有简单的几句话
1 2 |
|
这样就能够得到到页面的内容。接下来再用正则匹配去匹配所须要的内容就好了。
可是,真正要作起来,就会有各类各样的细节问题。
这是一个须要登陆认证的网站。也不太难,只要导入cookielib和urllib库就行。
1 2 3 |
|
这样就装载进一个cookie,用urlOpener去open登陆之后就能够记住信息。
若是只是作到上面的程度,不对open进行包装的话,只要网络情况有些起伏,就直接抛出异常,退出整个程序,是个很很差的程序。这个时候,只要对异常进行处理,多试几回就好了:
1 2 3 4 5 6 7 8 9 |
|
其实正则匹配并不算是一个特别好的方法,由于它的容错性很很差,网页要彻底统一。若是有稍微的不统一,就会失败。后来看到说有根据xpath来进行选取的,下次能够尝试一下。
写正则实际上是有必定技巧的:
此次的数据是放进Excel的。到后面才意识到若是放进数据库的话,可能就没有那么多事了。可是已经写到一半,难以回头了。
搜索Excel,能够得出几个方案来,一个是用xlrt/xlwt库,这个无论电脑上是否安装了Excel,均可以运行,但只能是xls格式的。还有一个是直接包装了com,须要电脑上安装了软件才行。我采用的是前一种。
基本的读写没有问题。可是数据量一大起来,就有问题了。
结合以上两点,最终采起了这么一个策略,若是行数是1000的倍数,进行一次flush,若是行数超过65536,新开一个sheet,若是超过3个sheet,则新建一个文件。为了方便,把xlwt包装了一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
|
因为网页也有本身独特的转义字符,在进行正则匹配的时候就有些麻烦。在官方文档中查到一个用字典替换的方案,私觉得不错,拿来作了一些扩充。其中有一些是为保持正则的正确性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
编码问题由于涉及到中文,因此必然地涉及到了编码的问题,这一次借这个机会算是完全搞清楚了。 问题要从文字的编码讲起。本来的英文编码只有0~255,恰好是8位1个字节。为了表示各类不一样的语言,天然要进行扩充。中文的话有GB系列。可能还据说过Unicode和UTF-8,那么,它们之间是什么关系呢? Unicode是一种编码方案,又称万国码,可见其包含之广。可是具体存储到计算机上,并不用这种编码,能够说它起着一个中间人的做用。你能够再把Unicode编码(encode)为UTF-8,或者GB,再存储到计算机上。UTF-8或者GB也能够进行解码(decode)还原为Unicode。 在python中Unicode是一类对象,表现为以u打头的,好比u'中文',而string又是一类对象,是在具体编码方式下的实际存在计算机上的字符串。好比utf-8编码下的'中文'和gbk编码下的'中文',并不相同。能够看以下代码:
能够看到,其实存储在计算机中的只是这样的编码,而不是一个一个的汉字,在print的时候要知道当时是用的什么样的编码方式,才能正确的print出来。有一个说法提得很好,python中的Unicode才是真正的字符串,而string是字节串 文件编码既然有不一样的编码,那么若是在代码文件中直接写string的话,那么它究竟是哪种编码呢?这个就是由文件的编码所决定的。文件老是以必定的编码方式保存的。而python文件能够写上coding的声明语句,用来讲明这个文件是用什么编码方式保存的。若是声明的编码方式和实际保存的编码方式不一致就会出现异常。能够见下面例子: 以utf-8保存的文件声明为gbk
提示错误 File "test.py", line 1 SyntaxError: Non-ASCII character '\xe6' in file test.py on line 1, but no encodi ng declared; see http://www.python.org/peps/pep-0263.html for details 改成
输出正常结果 u'\u6c49' '\xe6\xb1\x89' '\xba\xba' '\xe6\xb1\x89' 更多内容可参见这篇文章http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html 基本方法其实用python爬取网页很简单,只有简单的几句话
这样就能够得到到页面的内容。接下来再用正则匹配去匹配所须要的内容就好了。 可是,真正要作起来,就会有各类各样的细节问题。 登陆这是一个须要登陆认证的网站。也不太难,只要导入cookielib和urllib库就行。
这样就装载进一个cookie,用urlOpener去open登陆之后就能够记住信息。 断线重连若是只是作到上面的程度,不对open进行包装的话,只要网络情况有些起伏,就直接抛出异常,退出整个程序,是个很很差的程序。这个时候,只要对异常进行处理,多试几回就好了:
正则匹配其实正则匹配并不算是一个特别好的方法,由于它的容错性很很差,网页要彻底统一。若是有稍微的不统一,就会失败。后来看到说有根据xpath来进行选取的,下次能够尝试一下。 写正则实际上是有必定技巧的:
Excel操做此次的数据是放进Excel的。到后面才意识到若是放进数据库的话,可能就没有那么多事了。可是已经写到一半,难以回头了。 搜索Excel,能够得出几个方案来,一个是用xlrt/xlwt库,这个无论电脑上是否安装了Excel,均可以运行,但只能是xls格式的。还有一个是直接包装了com,须要电脑上安装了软件才行。我采用的是前一种。 基本的读写没有问题。可是数据量一大起来,就有问题了。
结合以上两点,最终采起了这么一个策略,若是行数是1000的倍数,进行一次flush,若是行数超过65536,新开一个sheet,若是超过3个sheet,则新建一个文件。为了方便,把xlwt包装了一下
转换网页特殊字符因为网页也有本身独特的转义字符,在进行正则匹配的时候就有些麻烦。在官方文档中查到一个用字典替换的方案,私觉得不错,拿来作了一些扩充。其中有一些是为保持正则的正确性。
结
|