
1.4 案例分析
1.4.1 网络爬虫及信息提取
1.问题描述
从网络中获取的大量信息,是目前数据分析工作中的一个常用数据来源。这里,通过一个简单的实验,掌握如何从网络中下载网页内容并从网页中提取需要的数据。
具体要求:从百度新闻中根据指定关键词进行搜索,并下载指定条数的新闻标题,将这些标题显示在屏幕上或输出到文件中。
2.求解思路和相关知识介绍
1)获取网页数据
本实验使用requests库的get函数从指定网页上下载数据,其使用方法描述如下:
get(url,params=None,**kwargs)
作用:发送一个get请求。
url:指定要从哪个网址获取网页数据。
params(可选):在请求时发送的字典、元组列表或字节类型的数据。
**kwargs:一些可选参数。
返回:Response类对象。
例如,通过:
request=requests.get(url,timeout=30,headers=headersParameters)
可以创建一个Response类对象request。通过这个request对象,可以从url对应的网址下载网页数据,超时设置为30秒,headersParameters中保存了请求头的信息,如:
代码清单1-1 设置请求头信息

2)从网页数据中提取信息
下载的网页数据中包含了大量信息,但通常只有部分信息是我们需要的。因此,需要使用正则表达式对网页数据进行匹配,提取出需要的那些信息。在设计正则表达式前,需要先分析要提取的信息在网页中对应的HTML代码。在浏览器中访问网页,按F12键调出浏览器的调试工具(单击图1-62中的箭头),查看页面上的元素,然后查看要获取元素的HTML代码(图1-62中红框所示)。

图1-62 网页调试页面示例
根据图1-63中的信息,可以设计出如下正则表达式:

图1-63 新闻标题对应的HTML代码

即匹配以<h3 class="c-title">开始、以</h3>结束的字符串,[\s\S]*?表示匹配尽可能短的内容。
匹配结果中虽然包含了要提取的标题信息,但还包含<…>等无关的HTML标记,因此,还需要通过re.sub函数去除title中多余的HTML标记,如:

3)数据显示和文件保存
假设已将新闻标题保存在了titles中,则可以通过for循环将这些新闻标题显示在屏幕上,如:
代码清单1-2 使用for循环显示新闻标题

按类似的方法,也可以将新闻标题写入filepath所对应的文件中,如:
代码清单1-3 将新闻标题写入文件

3.代码实现及分析
代码清单1-4给出了本实验网络爬虫的完整代码,请读者在自己的计算机中实现并测试该系统。
代码清单1-4 网络爬虫完整代码



4.实验结果及分析
代码运行后,将在屏幕上显示爬取进度和提取的新闻标题,如下所示:
已获取10条新闻标题
已获取20条新闻标题
已获取30条新闻标题
已获取40条新闻标题
已获取45条新闻标题
1:南开大学商学院MBA“天团导师”工程校友导师公开课第一讲《易经与…
2:南开大学科学营:观《别有洞天》探科技奥妙
3:南开大学吴志成教授做客中国政法大学名家论坛
4:南开大学第21届研究生支教团成员风采展示
5:南开大学科学营:电光科技日新月异
……
同时,会在当前目录下创建文件名为newstitlelist.txt的文本文件,打开该文件后同样可看到新闻标题信息。
提示这里所说的当前目录指的是Jupyter Notebook的默认目录。Windows下Jupyter Notebook默认启动路径就是当前cmd启动Jupyter的路径,可以通过命令行查看当前路径,然后去当前路径下查看是否新增了一个名为newstitlelist.txt的文件。
1.4.2 股票数据图表绘制
1.问题描述及数据集获取
以图表形式展示数据,能够更加清晰地表达数据的整体信息,这是数据分析工作中经常会使用的数据可视化方法。本实验中,以股票数据为例,进行烛台图和条形图的绘制。
股票数据集的获取有多种方式,这里使用tushare包来实现。tushare是一个免费、开源的Python财经数据接口包,主要实现对股票等金融数据从数据采集、清洗加工到数据存储的过程,能够为金融分析人员快速提供整洁、多样、便于分析的数据,在数据获取方面极大地减轻他们的工作量,使他们更加专注于策略和模型的研究与实现。
2.求解思路和相关知识介绍
1)获取股票数据
本实验使用tushare的get_k_data函数获取股票k线数据,关于该函数使用的完整帮助信息如下:

函数的主要参数和数据属性如表1-7和表1-8所示。
表1-7 get_k_data函数主要参数

表1-8 get_k_data函数数据属性

本实验中只指定code(股票代码)和start(开始日期)这两个参数完成股票数据的获取,如通过:

可获取代码为002739的股票从2019-01-01开始到现在的数据。返回的是一个DataFrame格式数据(详情参见Pandas库)。部分股票数据集如表1-9所示。
表1-9 部分股票数据集

2)数据格式转换
使用Matplotlib绘制图表时,要求传入NumPy的ndarray类型的数据。因此,在绘制图表前,需要先将DataFrame格式数据转换为ndarray类型,如:

其中,wdyx是DataFrame格式的股票数据,self.mat_wdyx则是NumPy的ndarray类型的数据。
另外,图表中将日期作为坐标轴标签时,要求使用数值类型的日期数据,而不能传入字符串类型的日期数据。因此,需要将股票数据中第1列字符串格式的日期数据转换为数值格式:
代码清单1-5 日期格式转换

其中,dates中保存了字符串类型的日期数据,num_time中保存了转换后的数值类型的日期数据。
3)图表绘制
需要绘制的图表中包含两个子图,一个子图中显示烛台图,另一个子图中显示条形图。因此,首先创建一个包含两个子图的图表:
代码清单1-6 创建图表

然后,分别在两个子图中完成烛台图和条形图的绘制。
最后,通过plt.show函数显示图表。
提示Anaconda默认安装的包中不包括mpl_finance和tushare包,所以需要用户自己单独安装。打开Anaconda Prompt,使用以下命令安装mpl_finance和tushare包。
pip install mpl_finance
pip install tushare
3.代码实现及分析
代码清单1-7给出了绘制股票数据图表的完整代码,请读者在自己的计算机中实现并测试该系统。
代码清单1-7 绘制股票数据图表的完整代码


4.实验结果及分析
代码运行后,结果如图1-64所示。图1-64分为上、下两个子图,上方的子图以烛台图的形式显示了股票数据,而下方的子图以条形图的形式显示了股票数据。

图1-64 用烛台图和条形图展示股票数据