您的位置:首页 > 编程语言 > Python开发

python 爬虫 实战(一) —— 抓取学校开课数据

2015-02-01 22:45 811 查看
1、在python方面的爬虫领域,有一个很强大的集成化、开源的工具,叫 scrapy,做这个小项目之前稍微试用了一下,本来只是想尽快完成这个小项目,但scrapy还是有点深,所以并没有实际掌握,倒是接触到了里面一个很强大的正则工具,xpath,摆脱了学正则化表达式的痛苦

2、整个项目就是一些小模块的累加,也是不断摸索的过程。

3、一开始,使用urllib以及urllib2初探模拟浏览器发送请求的过程当中,由于对cookie机制的不了解,犯下了一个比较严重的错误:

学校具体的课程数据是由 学期->学院->课程信息 这样的结构组成的,为了爬取到所有的数据就得从一开始的学期开始抓取数据,所以就得每一层的链接都要访问,这样cookie才能够正确,不会出现404等问题。我一开始直接将chrome里面的cookie数据直接封装到了请求的头里面,从而造成了很大的错误。

4、字符集问题。由于一开始没有考虑到字符集相关的问题,所以经常会出现乱码或者xpath无法进行正则,后来开始使用gb2312(因为网页的头当中的 charset 为gb2312),但仍然会在编码方面出错

UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 1771-1772


于是改正为gbk编码,但仍然报错,因为数据当中有不少是学生的姓名,姓名当中居然出现了“䶮”(yan 第三声)这样的字,而gbk编码无法支持,后来去查阅了
百度百科 以及 python的官方文档 才深刻的认识到了中国的文字真的是太多了,最后挑选了目前python能够支持的最大的字符集’gb18030',才差不多解决了问题。

当然,如果对数据的完整性要求没有太严格,可以考虑使用'ignore'参数:

#全部转换为utf-8       
data = data.decode('gb18030').encode("utf-8")        
content = data.decode('utf-8')


5、xpath是一个很好的工具,scrapy官方文档 有提到大概的使用方法以及安装方法,W3School中更给出了详细的使用方法。这儿简单说一下安装方法。
a、首先,最好将python作为全局使用的命令(windows下),需要修改 PATH 环境变量,将Python的可执行程序及额外的脚本添加到系统路径中。将以下路径添加到PATH
中:

$安装目录:\Python2.7\;$安装目录:\Python2.7\Scripts\;


然后打开命令行窗口,并且运行以下命令来修改 PATH

$安装目录:\Python27\python.exe $安装目录:\Python27\tools\scripts\win_add2path.py
关闭命令行窗口之后,重新打开,输入以下命令,确认可以输出python的版本号:

python --version


b、最好有安装pip,它是一个类似于linux那种管理所有python所有包的工具,可以在这儿以及这儿获取到,下载完成之后,用命令行进入到存放的目录,运行命令:

python get-pip.py
即可安装完成pip

c、在命令行窗口任意目录输入以下命令:

pip install lxml
就可以安装完成xpath,以后如果需要其他的库,如chardet等等,都可以输入类似的命令进行安装

6、因为很多xpath的结果当中有空格以及回车(主要是因为学校的网页上面有太多莫名其妙的回车),所以需要将这些东西去除,从而让数据更好看一点,可以使用正则等方法,以下是找到的一个解决方案

a = '   123123   '
a = "".join(a.split())
#结果为
a='123123'


7、仔细观察,勤于查找,多用官方文档

8、reference:

文件读写操作

用Python抓网页的注意事项

编码相关

stackoverflow有关编码的讨论

python爬虫实例-爬取北邮研究生成绩

9、后续问题:

目前仍有一些问题,在xpath提取数据的时候,由于一些课程的xml差距比较大,比如有些课程有备注信息:

<td width="60"><small><small>双语教学。                                                                                                                    <small/><small/></td>
则需要使用xpath("//td/small/small")获取,但有一些课程没有备注信息:

<td width="60">.</td>


则无法使用有备注信息的xpath语句进行获取,理论上应该有解决办法,但目前对xpath了解的还不够深刻,留作后面考虑

改进

1、多线程,学期数过多,最好能够多线程/进程获取数据

2、添加对异常的处理:urlopen,xpath语句没有寻找到想要的东西等等
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: