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),但仍然会在编码方面出错
于是改正为gbk编码,但仍然报错,因为数据当中有不少是学生的姓名,姓名当中居然出现了“䶮”(yan 第三声)这样的字,而gbk编码无法支持,后来去查阅了
百度百科 以及 python的官方文档 才深刻的认识到了中国的文字真的是太多了,最后挑选了目前python能够支持的最大的字符集’gb18030',才差不多解决了问题。
当然,如果对数据的完整性要求没有太严格,可以考虑使用'ignore'参数:
5、xpath是一个很好的工具,scrapy官方文档 有提到大概的使用方法以及安装方法,W3School中更给出了详细的使用方法。这儿简单说一下安装方法。
a、首先,最好将python作为全局使用的命令(windows下),需要修改 PATH 环境变量,将Python的可执行程序及额外的脚本添加到系统路径中。将以下路径添加到PATH
中:
然后打开命令行窗口,并且运行以下命令来修改 PATH :
b、最好有安装pip,它是一个类似于linux那种管理所有python所有包的工具,可以在这儿以及这儿获取到,下载完成之后,用命令行进入到存放的目录,运行命令:
c、在命令行窗口任意目录输入以下命令:
6、因为很多xpath的结果当中有空格以及回车(主要是因为学校的网页上面有太多莫名其妙的回车),所以需要将这些东西去除,从而让数据更好看一点,可以使用正则等方法,以下是找到的一个解决方案:
7、仔细观察,勤于查找,多用官方文档
8、reference:
文件读写操作
用Python抓网页的注意事项
编码相关
stackoverflow有关编码的讨论
python爬虫实例-爬取北邮研究生成绩
9、后续问题:
目前仍有一些问题,在xpath提取数据的时候,由于一些课程的xml差距比较大,比如有些课程有备注信息:
则无法使用有备注信息的xpath语句进行获取,理论上应该有解决办法,但目前对xpath了解的还不够深刻,留作后面考虑
改进:
1、多线程,学期数过多,最好能够多线程/进程获取数据
2、添加对异常的处理:urlopen,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语句没有寻找到想要的东西等等
相关文章推荐
- Python爬虫简单实战:抓取小猪短租西安市前五页民房数据
- python 爬虫实战 抓取学校bbs相关板块的发帖信息
- Python爬虫框架Scrapy实战之抓取户外数据
- Python爬虫框架Scrapy 学习笔记 10.1 -------【实战】 抓取天猫某网店所有宝贝详情
- Python爬虫实战四之抓取淘宝MM照片
- Python爬虫抓取手机APP的传输数据
- python 爬虫实战--登陆学校教务系统获取成绩信息
- Python爬虫实战六之抓取爱问知识人问题并保存至数据库
- Python爬虫框架Scrapy 学习笔记 10.2 -------【实战】 抓取天猫某网店所有宝贝详情
- python 爬虫 实战 抓取妹子图中图
- Python爬虫抓取手机APP的传输数据
- python实现爬虫统计学校BBS男女比例之数据处理(三)
- Python爬虫框架Scrapy实战之批量抓取招聘信息
- Python爬虫实战(4):抓取淘宝MM照片
- Python 网络爬虫5 ---- 第一次实现抓取数据并且存放到mysql数据库中
- Python爬虫框架Scrapy 学习笔记 10.2 -------【实战】 抓取天猫某网店所有宝贝详情
- Python爬虫框架Scrapy实战之批量抓取招聘信息
- Python微博地点签到大数据实战(三)大数据利器:爬虫
- Python爬虫:抓取手机APP的传输数据
- Python爬虫:抓取手机APP的传输数据