网络爬虫,又被称为网页蜘蛛,是一种按照一定的规则,自动地抓取网上信息的程序或者脚本。之所以选择Python编写爬虫,即是因为它简单啊。
爬虫的思路是什么呢?简单来说,就是爬取整个网页的数据,然后从中筛选中我们想要的数据。所以,在我们的需求中,使用爬虫爬取数据主要有如下步骤:
1.爬取数据
2.解析数据
爬取数据
我们要爬取的数据的是考生的成绩,自然,我们的目标网站就是吉林教育信息网的成绩查询结果页面。
目标网站
所以需要使用POST请求访问网址,那么要传递哪些参数呢? 我们在查询页面中输入考生号和姓名后,如下图。
点击“查询”按钮,进入查询结果页面。使用谷歌浏览器审查元素,按如下步骤找到Form Data,如下图所示。
在Form Data中 包含两项,ksh(考生号)和xm(姓名)。注意 这里的xm的值没有显示,这是因为网站开发人员对汉字进行了编码。点击“Form Data”右侧的“ view source” 查看资源,效果如下图。
看到的一串字符就是中文汉字编码后的结果。
爬取页面
在Python中有一个非常好用的获取页面信息的库——Reqeusts.
Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。
警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症、冗余代码症、重新发明轮子症、啃文档症、抑郁、头疼、甚至死亡。
安装requests
要使用requests非常简单,只需要一行命令
创建项目
打开你的编辑器,pycharm或是sublime等都可以。创建一个文件夹,命名为“Gaokao”,作为你的项目根目录。
使用requests获取页面信息
在chengji文件夹下,创建一个“Score.py”的python文件。下面要伸出你的双手开始敲代码了。在chengji.py中敲如下代码:
上述代码中,最核心的代码是使用requests.post()发送请求。注意在发送的时候,传递的formdata 就是xm和ksh,其中xm需要使用encode('gbk')进行编码。此外,还传递了header也就是请求头信息。该信息来源也成绩结果页面,从Request Headers取出比较重要的信息。 如下图。
接下来,运行score.py 文件,运行效果如下:
对比下查询页面的HTML代码,发现他们是一样的。
这样我们就获取到页面内容。接下来的就是解析页面,从页面获取各科成绩数据。
解析数据
从上述爬取的结果中,可以看出我们想要的获取的成绩数据包含在HTML页面中,只要把它们从页面中提取出来就可以了。在Python中实现这种功能的包有很多,我们选择一个简单实用的Beautiful Soup.
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.
安装BeautifulSoup
安装BeautifulSoup非常简单,一行命令:
数字4是它的版本号。
BeautifulSoup还需要一个解析器,解析器也有很多,我们选择lxml,所以还需要在安装一下lxml.运行如下命令
实用BeautifulSoup解析数据
解析之前,先来观察获取的页面信息,如下图所示。
我们发现,要获取的数据均在这个标签内。这个规律非常重要,下面就可以使用BeautifulSoup轻松获取标签内的数据了。
我们开始编写代码。在score.py文件中新增如下代码:
上述代码中,创建了一个parse_page_detail()的函数用于解析数据。该函数通过soup.find_all('td')方法获取所有标签info对象。然后for 循环变量info对象,并使用get_text()函数来获取每一个标签的内容,并且存入列表。
运行score.py 文件,运行效果如图。
上图中红色部分就是从结果页面中获取到的成绩数据。这是一个列表,列表中前面的是名称,后面的是对应的值。如前一个元素是"考号",后一个元素是考号的具体值。下一个元素"姓名",再下一个就是姓名的具体值,以此类推。
当我们修改get_score()函数中,xm和ksh两个变量的值,就可以查询对应的考生成绩。至此,我们就使用爬虫获取了考生的高考成绩。
接下来,为了让普通人(非程序员)都可以使用我们的代码查询成绩,我们还需要做一个网页。当用户在网页上输入考生号和密码就能显示成绩(和联通微信平台功能类似)。
在下一篇中,我们将会介绍使用Flask开发网站显示查询结果。
领取专属 10元无门槛券
私享最新 技术干货