常用格式的本地数据读写
txt, csv, json, xml, xls, xlsx, HDF
其他可以转换成以上格式的数据文件,如GIS中的.dbf可以导出成.csv文件
txt
由字符串组成,每行由EOL(End Of Line)字符隔开,'\n'
打开文件 *注意编码*
file_obj = open(filename, access_mode)
access_mode: 'r', 'w'
读操作
-file_obj.read()读取整个文件内容
-file_obj.readline()逐行读取
-file_obj.readlines()返回列表,列表中的每个元素是行内容
写操作
-file_obj.write()将内容写入文件
-file_obj.writelines()将字符串列表内容逐行写入文件
关闭文件
-file_obj.close()
with语句
-包括了异常处理,自动调用文件关闭操作,推荐使用
-适用于对资源进行访问的场合,确保无论使用过程中是否发生异常都会执行“清理”操作,如文件的关闭、线程的自动获取与释放等
-with open(filename) as f_obj:
# 执行相关操作
CSV(Comma-Separated Values)
-以纯文本形式存储的表格数据(以逗号作为分隔符),通常第一行为列名
-文件操作
-numpy 的 np.loadtxt(), 较复杂
-利用pandas处理,快捷方便
-读操作
-df_obj = pd.read_csv(), 返回DataFrame类型的数据
-写操作
-df_obj.to_csv()
Pandas
-基于NumPy构建
-索引在左,数值在右,索引是pandas自动创建的
-数据结构
-Series, 类似于一维数组的对象
-DataFrame, 表格型数据结构, 每列可以是不同的数据类型,可表示二维或更高维的数据
JSON(JavaScript Object Notation)
-轻量级的数据交换格式
-语法规则
- 数据是键值对
- 由逗号分隔
- {}保存对象,如{key1:val1, key2:val2}
- []保存数组,如[val1, val2,...,valn]
-读操作
-json.load(file_obj)
-返回值是dict类型
-类型转换 json -> csv
-编码操作
-json.dumps()
-编码注意:ensure_ascii=False
XLS/XLSX(Excel文件)
- 常用的电子表格数据
- 文件操作
利用Pandas处理,快捷方便 - 读操作
- df_obj = pd.read_excel(), 返回DataFrame类型的数据
- 写操作
- df_obj.to_excel()
具体见pandas如何处理CSV文件
Python的数据库基本操作
SQLite
关系型数据库管理系统
- 嵌入式数据库,适用于嵌入式设备
- SQLite不是C/S的数据库引擎
- 集成在用户程序中
- 实现了大多数的SQL标准
- 连接数据库
- conn = sqlite3.connect(db_name)
- 如果db_name存在,读取数据库
- 否则,新建
- conn = sqlite3.connect(db_name)
- 获取游标
- conn.cursor()
- 一段私有的SQL工作区,用于暂时存放受SQL语句影响的数据
- CRUD操作
- cursor.execute(sql_str)
- cursor.executemany(sql_str)批量操作
- fetchone(), 拿到一条记录
- fetchall()
- conn.commit(), 提交操作
关闭连接:conn.close()
其他常用的数据库的连接
MySQL
- 主要面对互联网用户,比如建站等
- https://dev.mysql.com/doc/connector-python/en
- PostgreSQL
- Django推荐与 PostgreSQL配合使用
- Psycopg
- http://initd.org/psycopg/docs/
- MongoDB
Oracle
- 适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的,适应高吞吐量的数据库解决方案
- http://www.oracle.com/technetwork/articles/dsl/python-091105.html
数据库多表连接
多表连接
查询记录时将多个表中的记录连接(join)并返回结果
join方式
- 交叉连接(cross join)
- 内连接(inner join)
- 外链接(outer join)
cross join
- 生成两张表的笛卡尔积
- 返回的记录数为两张表的记录数的乘积
inner join
- 生成两张表的交集
- 返回的记录数为两张表的交集的记录数
outer join
- left join(A,B), 返回表A的所有记录,另外表B中匹配的记录有值,没有匹配的记录返回null
- right join(A,B), 返回表B的所有记录,另外表A中匹配的记录有值,没有匹配的记录返回null
- [注]:目前在sqlite3中不支持右连接,可以考虑交换A、B表操作
爬虫简介
爬虫
- 自动抓取互联网信息的程序
利用互联网数据进行分析、开发产品
爬虫基本架构
URL管理模块
- 对计划爬取的或已经爬取的URL进行管理
网页下载模块
- 将URL管理模块中指定的URL进行访问下载
网页解析模块
- 解析网页下载模块中的URL,处理或保存数据
- 如果解析到要继续爬取的URL,返回URL管理模块继续循环
URL管理模块
防止重复爬取或循环指向
实现方式
- Python的set数据结构
- 数据库中的数据表
- 缓存数据库redis,s适用于大型互联网公司
URL下载模块
- 将URL对应的网页下载到本地或读入内存(字符串)
- 实现方式
- urllib
- requests或其他第三方的模块
通过URL直接下载
- response = urllib.request.urlopen(url)
- response.getcode()
- response.read()
通过Request访问下载
request = urllib.request.Request(url)
request.add_head()
request.add_data()
response = urllib.urlopen(request)
- 通过Cookie访问下载
- 使用http.cookiejar模块
cookie_jar = http.cookiejar.CookieJar()
opener = urllib.request.build_opener()
urllib.request.install_opener(opener)
response = urllib.request.urlopen(url)
网页解析模块
- 从已经下载的网页中爬取数据
- 实现方式
- 正则表达式,字符串的模糊匹配
- html.parser
- BeautifulSoup, 结构化的网页解析
- lxml
- 结构化解析
DOM(Document Object Model), 树形结构
BeautifulSoup
用于解析HTML或XML
- pip install beautifulsoup4
- import bs4
步骤
- 创建BeautifulSoup对象
- bs = BeautifulSoup(
- url
- html_parser, # 指定解析器
- encoding, # 确保和网页编码格式一致
- )
- bs = BeautifulSoup(
- 查询节点
- find, 找到第一个满足条件的节点
- find_all, 找到所有满足条件的节点
<a href = "a.html" class = "a_link">next page</a>
- 可按节点类型、属性或内容访问
- 按类型查找节点 : bs.find_all(‘a’)
- 按属性查找节点
- bs.find_all(‘a’, href = ‘a.html’)
- bs.find_all(‘a’, href = ‘a.html’, string = ‘next page’)
- bs.find_all(‘a’, class_ = ‘a_link’) 注意:是 class_
- 获取节点信息
- node是已查找到的节点
- node.name:获取节点标签名称
- node[‘href’] : 获取节点href属性
- node.get_text(): 获取节点文字
- 异常处理
- 网络资源或URL是经常变动的
- 需要处理异常
BeautifulSoup进阶
- 创建BeautifulSoup对象
使用CSS方式、正则表达式查找节点
- 保存解析的内容
- DOM树形结构
- children 只返回“孩子”节点
- desecdants 返回所有“子孙”节点
- next_siblings 返回下一个“同辈”节点
- previous_siblings 返回上一个“同辈”节点
- parent 返回“父亲”节点
正则表达式
- import re
- pattern = re.compile(‘str’) 返回pattern对象
- 推荐使用r’str’无需考虑转义字符
- pattern.match()
- 基本语法:https://msdn.microsoft.com/zh-cn/library/ae5bf541(v=vs.90).aspx
Scrapy简介
- 开源的爬虫框架
用户群: https://scrapy.org/companies/
Scrapy抓取过程
- 使用start_urls作为初始url生成Request, 默认将parse作为它的回调函数
在parse函数中解析目标url
Scrapy高级特性
- 内置数据抽取器css/xpath/re
- 交互式控制台用于调试
- 结果输出的格式支持, JSON, CSV, XML等
- 自动处理编码
支持自定义扩展
Scrapy使用步骤
-
- 创建工程
- scrapy startproject air_quality
- 目录结构
- 创建工程
-
- 定义Item, 构造爬取的对象(可选)
- scrapy.Field()
- 定义Item, 构造爬取的对象(可选)
-
- 编写Spider, 爬虫主体
- scrapy genspider aqi_history_spider https://www.aqistudy.cn/historydata/index.php
- 调用自定义的Item
- 编写Spider, 爬虫主体
-
- 编写配置和Pipeline, 用于处理爬取的结果(可选)
- 默认return item
- 编写配置和Pipeline, 用于处理爬取的结果(可选)
-
- 执行爬虫
- scrapy crawl aqi_history_spider
Scrapy常用命令
- 执行爬虫
- help: 查看帮助, scrapy –help
- version: 查看版本信息
- scrapy version, 查看scrapy 版本
- scrapy version -v, 查看相关模块的版本
- stratproject, 新建工程 scrapy startproject proj_name
- genspider
- list, 列出所有spider, crapy list
- view, 返回网页源代码并在浏览器中打开, scrapy view url
- 有时页面渲染的结果和查看结果是不同的
- parse, 调用工程spider中的parse解析url, scrapy parse url
- shell , 进入交互式调试模式,scrapy shell url
- bench, 可以用来检测scrapy 是否安装成功