关键字:urllib,字节,字符,抓取基金累计净值代码,元组
当我们有了一定的语法知识我们来开始尝试实战一下如何简单抓取基金网站数据,我们测试的网址:http://fund.eastmoney.com/fund.html。
我们使用pyhton官网上的一个网络编程库urllib来进行网络编程,官网地址:21.5. urllib — URL handling modules — Python 3.6.5 documentation
目前我们只需要用到urllib.request请求模块,请看下面代码:
我们使用URLopen方法,根据官网我们可以知道,得到一个对象http.client.HTTPResponse(类文件对象),提供了以下方法:
read() , readline() , readlines(),fileno()和close(): 这些方法的使用与文件对象完全一样。
info():返回一个httplib.HTTPMessage 对象,表示远程服务器返回的头信息。
getcode():返回Http状态码,如果是http请求,200表示请求成功完成;404表示网址未找到。
geturl():返回请求的url地址。
我们使用read方法打印出来看看。可以看到出现的结果 是b'xxxxxxxxx',这个结果是什么呢?看不明白!先放放,我们先看看下面的例子:
如果我们使用w=b'王',会发生什么呢?如下:
这个就涉及到计算机的历史了,因为最初的 ascii包含了字母、数字、标点符号啥的够了。后来发现中国人、日本人、韩国人啥的也用计算机。这就不够了。于是就出现了各个国家的编码规定。用双字节或三个字节来表示中文(由于2进制太长,转为16进制来表示)。比如最著名的“utf-8”编码规则。
那么我们怎么才能看到王这个字是几个字节呢?我们需要使用到编码和解码的两个方法:
可以看到原来王在机器的眼里就是'\xe7\x8e\x8b',同样我们可以将'\xe7\x8e\x8b'解码成我们人类认识的字符:
对上面代码做个简单解释:encode方法默认是使用utf-8来进行编码的,对于王这个字,在utf-8这个编码规则下他的字节就是'\xe7\x8e\x8b',在‘gb2312d’的编码规则下,王就是'\xcd\xf5'字节。
上面简单的科普了一下字节和字符的概念,前面这个b表示的是返回的数据是字节。我相信大家知道了字节和字符的区别,简单来说就是字节是给机器看的,字符是给人看的。让我们回到最上面使用URLopen方法获取到的结果,原来我们得到是字节数据。
让我们打开网址的源码,可以看到原来他的编码规则是“gb2312”,那我们来使用“gb2321”来进行解码一下
解码之后得到的数据如下,好像是html文件对吗,至少能看懂一些了,是个进步。
我们下面要做什么呢,很简单就是将获取到的html文档写入到文件中保存起来。以gb2312解码成字符然后使用utf8编码后存到test.html文件中。
接下来我们需要做的就是读取保存的html文件,根据beautifulsoup文档中的api来获取我们需要的数据。beautifulsoupapi地址:
Beautiful Soup 4.2.0 文档 — Beautiful Soup 4.2.0 documentation,很完美是中文的。
我们来简单分析一下所要爬取网站的元素:
例如我们需要知道基金代码这个字段的值,我们审查元素后得知,他在id为“oTable”的table标签下,进入tbody标签,class为bzdm的td标签保存的数据就是我们所需要的基金代码。那么简单的代码可以这样写:
我们发现我们已经把所有的基金代码的数据都得到了,这个是一个list类型,查看beautifulsoup文档,我们发现兄弟节点api,这样我们就可以优化我们的代码
这样我们就获取了我们需要的数据了。
那么问题又来了,我们不能只是打印出来就完事了呀,我们得把数据进行封装处理,我们得学习一个新的数据类型元组。
元组和list很类似,但是有点不同的是,元组中的元素是不能改变的,在后面接触到数据库后,我们会发现,我们获取的数据大多数都是元组类型的。虽然元组不能改变,但是可以通过相加来得到新的元组,举个简单的例子:
注意上例代码中,注意b元组,当元组中只有一个元素的时候,必须得加上“,”,这样解释器才会认为他是元组类型。
我们既然初步学会了使用元组,那么,我们可以简单的对我们获取到的数据进行简单的处理封装:
今天就学习到这,下次我们来学习python的数据库模块,如何把抓取到的数据存入到数据库!下期见