数据分析之数据采集与操作

 金诚   2018-03-25 18:45   186 人阅读  0 条评论

前言

数据分析的源头——数据,往往是最令数据分析师头疼的问题,头疼的地方在于:
1. 数据在哪?
2. 数据的存在形式是什么样的?
3. 如何将不同的数据格式进行有价值的计算?
4. 如何将不同的数据文件进行转化?转化为计算机理解的内容?
5. 如何将数据转化为人能理解的内容?
6. txt、json、excel、csv、sql如何操作更有效率?如何分析这些文件的内容更有助于其他人?
7. 糟糕的文件如何读取?
8. 网络上数据,如何获取?

常用格式的数据读写

txt

txt文件可能是最常见的文件类型了,读写起来也非常方便

使用Python普通的IO语法操作 读写即可,这里我们复习一下,曾经讲过的文件读写。

当然,你也可以考虑使用numpy、pandas提供的txt io API,在txt中的数据非常庞大、规整的时候,使用扩展包的增强能力,将显得极为有用。

普通语法获取文件的两种方式:

关于open()函数还有很多参数,详情请阅读open()函数的API,它可以解决普通文件转换成对象的大部分需求。

比如编码:

读取的三种写法

直接操作file对象,调用file 模块的API,可以读写文件

示例:

写入的两种写法

写入操作也可以直接利用file对象的API

写入单行示例:

写入多行列表示例:

csv(常见)

读写csv文件的三种方式

csv

使用csv模块,可以大大提升读写csv文件的效率

读取csv文件

小思考:获取到的rows怎么玩?参考《分析各国科技工作者健康指数》案例

可以看出enumerate()函数的强大之处,可以将任何序列数据,转换成索引、item的对象

写入csv文件

numpy

使用 numpy模块,也可以提升操作csv文件的能力

读取文件

参考上一篇《》案例:分析2016年美国大选川普和克林顿的投票趋势

存入文件

写入用的还是csv对象

pandas

pandas读取csv文件

示例:

pandas也支持切片,通过a['column_name']切出指定列

pandas写入csv文件

json

json语法规则 :

  • 数据是键值对
  • 由逗号分隔
  • {}保存对象,如{key1:val1, key2,:val2}
  • []保存数组,如[val1, val2, ..., valn]

读取json文件

写入json文件

json转化成csv文件

将json转换成csv文件,最需要进行的步骤是:

这样看来,其他的步骤,都只是打辅助了,比如,我们要把json的数据,转化成列表,塞给pandas的concat()函数。

此时的技术点,就只是json->csv了。

xls,xlsx

用pandas处理,方便快捷

读取xls文件

写入xls文件

其他文件的数据提取思路

其他文件大多数都支持格式转换,将其他文件转换成上述文件即可。

数据库

数据库介绍

SQLite数据库

第一步,先初始化操作数据库:导sqlite3包、初始化连接池、初始化游标

第二步,完成我想要对数据库进行的操作

用execute()执行单条sql语句

数据量太多,需要频繁编写sql语句?
第三步,用executeMany()执行多条sql插入

将上述修改,提交至数据库,(未提交之前,都只是临时写入,并不会永久生效)

每次操作完数据库,都要记得释放资源:

什么?在关闭数据库之前,还想做点查询操作?

查询数据库的每一行行,通过索引操作 ,0,1,2。

可是我又想知道每一列的数据呢?答:通过列名访问。'collumn_name1'..。

爬虫

爬虫简介:

爬虫有两大功能:
1. 自动抓取互联网信息
2. 利用互联网的数据,进行分析、产品开发
爬虫的基本架构:
1.URL模块
对获取到的url进行访问、下载url对应的数据
管理已爬取和为爬取的URL
2.下载模块
根据给定的URL,从对应的服务器上下载对应的数据
3.解析模块
解析URL对应的网页,处理或保存数据

URL模块

具体干什么

将URL对应的网页下载到本地或读入内存。

实现方式

  • 原生基础 urllib、http.cookiejar
  • 第三方封装 requests

urllib两种写法,用于获取HTTPResponse对象

写法1:传递字符串url

语法:urllib.request.urlopen(url)

写法2:传递urllib模块的对象Request

语法2: urllib.request.urlopen(urllib.request.Request(url))

通过HTTPResponse解析拿到服务端返回的数据:html、json等其他数据
比如resposne.read()

总结:
- urlopen()函数可以接收string字符串和Request对象
- string字符串,可以发送简单的get请求——get请求可以将参数写到url后面
- Request对象,可以携带请求体、请求头,更灵活。

cookiejar的写法

语法:

第一步:

第二步:

网页解析模块

模块的任务

  • 从已下载的网页中爬取数据
  • 解析网页的实现方式
    1. 正则表达式:利用字符串的模糊匹配
    2. html.parser
    3. BeautifulSoup,结构化的网页解析工具
    4. lxml
    5. </ol start="1.">

解析原理简介

网页的树形结构:

知道这个结构有什么用?

HTML中每个元素都是位于标签中,当我们想获取某个元素的内容时,可以解析该标签中的内容,拿到我们想要的内容。

解析HTML的时候,最重要的时候知道每个HTML文件有什么标签,以及以什么样的顺序解析拿到该标签。

BeautifulSoup

基础用法

第一步:导入模块

第二步:下载html,拿到服务端的响应体

第三步:初始化Beautiful对象

第四步: 查找节点
想对html做些什么?查找这个html文件中,存在哪些标签?查找标签中的属性和属性值?查找《a》标签中包含的数据?都可以通过Beautiful对象bs_obj可以获得

先创造一段简单的html文档

创建BeautifulSoup对象

在函数find_all()中传入你想解析的标签名

输出结果:

你瞧,这样轻松的就将html文件中所有的a标签都拿到了。

你可能又会问,那我如何根据标签的id、标签的class查找我想要的标签呢?

在函数find()中传递你id、class参数即可。
如:

总结,我们学会了BeautifulSoup对象的简单用法,了解了其title属性find()函数的妙用。更多细节,查阅[BeautifuleSoup文档](https://www.crummy.com/software/Beautifu
lSoup/bs4/doc.zh/#id5 "BeautifuleSoup")可以得到更多的知识

进阶

有时候我们并不清楚BeautifulSoup支持哪些查询参数,或者经常忘记查询参数的名称,BeautifulSoup提供了一种简洁的方法供我们查询节点——css查询法

以css的方式查找节点

保存解析的内容

输出某节点的子节点

遍历children对象,可以拿到table标签下的所有子元素

输出某节点的子孙节点

输出某街道的同辈节点

输出某节点的父节点

嘿,到了这一步,我们已经可以灵活得读取HTML格式的文件并从中拿到我们想要的数据了。

接下来,我们希望拿到的数据更精准一些,比如所有a标签中,满足src属性是.jgp为结尾的,这就要求我们继续学习——正则表达式。

正则表达式

正则表达式语法:

总结,导入re包、通过re的compile()函数,传递你编写的正则表达式,得到pattern对象,再根据patter.match()函数接收你想校验的字符串。
compile输入 正则表达式
match输入 校验字符串,最终得到False、True二者之一。

示例:从html中拿到src属性是jpg文件的标签

最为核心的一段,在于bs_obj.findAll("img",{"src":re.compile(r"正则表达式")})

示例2:从html中拿到所有href的值包含“/view”的a标签

网络爬虫框架——scrapy

文章字数超限制了,请点击这篇阅读scrapy

参考

  1. Python IO API: text I/O, binary I/O and raw I/O
  2. numpy IO API
  3. pandas Io tools API
  4. BeautfiluSoup API
  5. 在线html,提供解析的html文件
  6. 正则表达式入门
  7. scrapy shell 提取数据最佳练习
  8. using XPath with Scrapy Selectors here
  9. scrapy Selectors
  10. </ol start="1.">

本文地址:http://www.yangchaofan.cn/archives/340
版权声明:本文为原创文章,版权归 金诚 所有,欢迎分享本文,转载请保留出处!

说点什么

avatar
  Subscribe  
提醒