爬虫基础(二)——数据存储与解析

对数据进行解析是爬虫的一项非常重要的功能,在解析数据之前,首先要对数据进行存储,本章介绍python中的数据存储,包括:文件存储、数据库存储和使用lxml模块进行数据解析。

2.1文件存储

目录

2.1文件存储

2.1.2 JSON文件存储

2.1.3 CSV文件存储

2.2 关系型数据库存储

2.2.1 连接数据库

2.2.2 创建表

2.2.3插入数据

2.2.4 浏览数据

 2.2.5 修改数据

2.2.6 删除数据

2.3 非关系型数据库存储

2.4 LXML模块解析数据

2.4.1 xpath常用规则

xpath解析原理

①实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中

②调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获

2.4.2 读取文件进行解析


2.1.1 TXT文件存储

主要是python的读写操作,略。

2.1.2 JSON文件存储

什么是JSON以及如何用python语言来编码和解码JSON对象?

JSON(JacaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式。

 字典和列表是python中的数据类型,可以转换为JSON数据。在python中,要想操作JSON类型文件,可通过导入JSON库来实现。

json 对象常用的方法:

1、json.dumps() 与 json.dump() (python数据转化为JSON字符串)

2、 json.loads() 与 json.load()(1的逆向操作)

 详细用法:(14条消息) Python之Json数据的存储_QI2510980868的博客-CSDN博客

2.1.3 CSV文件存储

CSV,全称为Comma-Separated Values,中文可以叫做逗号分隔值或字符分隔值

(14条消息) Python-CSV文件存储_秀呀秀的博客-CSDN博客_python保存csv文件,这个跟书上讲的差不多。跟操作TXT文本流程差不多,就是用到的库和数据格式有别。

2.2 关系型数据库存储

关系型数据库,是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。用户通过查询来检索数据库中的数据,而查询是一个用于限定数据库中某些区域的执行代码。关系模型可以简单理解为二维表格模型,而一个关系型数据库就是由二维表及其之间的关系组成的一个数据组织。

关系型数据库有多种,如 SQLite、MySQL、Oracle、SQL Server、DB2 等。

python提供了对关系型数据库的支持。下面学习如何用python操作文本型关系数据库SQLite

SQLite 3可使用sqlite3模块与python进行集成,Python3.x默认自带了该模块。

参考:SQLite – Python | 菜鸟教程 (runoob.com)

2.2.1 连接数据库

使用数据库的第一步,调用SQLite3的connect()方法

import sqlite3 as sql						#导入sqlite3模块
con=sql.connect("my_db.db")				#连接到数据库
if con:								#如果成功连接
	print("成功连接到数据库")				#输出内容
con.close()							#关闭连接

2.2.2 创建表

表是构成数据库的基本单元

import sqlite3 as sql
con=sql.connect("my_db.db")
c=con.cursor()  #调用connection对象的cursor()方法创建一个游标对象
c.execute('''   #调用游标对象的execute()方法执行建表的语句
CREATE TABLE USER
(ID INT PRIMARY KEY     NOT NULL,
NAME           TEXT    NOT NULL,
AGE            INT     NOT NULL,
ADDRESS        CHAR(50),
SALARY         REAL);
''')
print("成功创建用户表")
con.commit() #提交已经执行的操作
con.close()

execute()方法的语法格式

cursor.execute(sql [, optional parameters])

sql为需要执行的SQL语句,optional parameters为执行SQL语句需要的其他参数

2.2.3插入数据

还是游标对象的execute()方法,改成插入数据的SQL语句即可

c.execute("INSERT INTO USER (ID,NAME,AGE,ADDRESS,SALARY) \
      VALUES (1, 'Paul', 32, 'California', 20000.00 )")

2.2.4 浏览数据

还是游标对象的execute()方法,改成相应的的SQL语句即可

cursor = c.execute("SELECT id, name, address, salary  from USER")
for row in cursor:
   print "ID = ", row[0]
   print "NAME = ", row[1]
   print "ADDRESS = ", row[2]
   print "SALARY = ", row[3], "\n"

第一行也可以这样写 cursor = c.execute("SELECT * FROM USER")

浏览单行数据:

cursor = c.execute("SELECT * FROM USER WHERE id=2")

 2.2.5 修改数据

c.execute("UPDATE USER set SALARY = 25000.00 where ID=1")

2.2.6 删除数据

c.execute("DELETE from USER where ID=2;")

2.3 非关系型数据库存储

书中介绍的是MongDB数据库,需要安装,后面的操作先跳过,后面用到再回来补吧。

2.4 LXML模块解析数据

前面介绍了数据的存储,下面开始介绍数据的解析,用到python的lxml模块。lxml是python的一个解析库,支持HTML和XML的解析,支持XPath解析方式。那么如何用这个模块对获取到的数据进行解析嘞?

注:解析器比较:

解析器         速度      难度

re                最快      难

BeautifulSoup 慢        非常简单

lxml                 快        简单

注:HTML(HyperTextMark-upLanguage)即超文本标记语言,是WWW的描述语言。XML即ExtentsibleMarkup Language(可扩展标记语言),是用来定义其它语言的一种元语言,其前身是SGML(标准通用标记语言)。它没有标签集(tagset),也没有语法规则(grammatical rule),但 是它有句法规则(syntax rule)。html是用来显示数据的;xml是用来描述数据、存放数据的。

2.4.1 xpath常用规则

xpath解析原理

①实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中

②调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获

 举例:

user_database                #选取元素user_database的所有子节点
/user_database               #选取根元素user_database。注释:假如路径起始于正斜杠(/),则此路径始终代表到某元素的绝对路径
user_database/user           #选取属于user_database的子元素的所有user元素
//user                       #选取所有user子元素,而不管它们在文档中的位置
user_database//user          #选择属于user_database元素的后代的所有user元素,而不管它们位于user_database之下的什么位置
//@attribute                 #选取名为 attribute 的所有属性

Xpath语法中的谓语用来查找某个特定的节点或者包含某个指定值的节点,谓语被嵌在方括号中。常见的谓语如下:

Xpath中也可以使用通配符来选取位置的元素,常用的就是“ * ” 通配符,它可以匹配任何元素节点。 

下面通过例子来理解XPath的使用,使用XPath读取文本将其解析为一个XPath对象

例:解析字符串

from lxml import etree
text='''
<div>
    <ul>
        <li class="item-1"><a href="link1.html“>第一个</a></li>
        <li class="item-2"><a href="link2.html“>second item</a></li>
        <li class="item-3"><a href="link3.html“>a 属性</a></li>
    </ul>
</div>
'''             #定义字符串
html=etree.HTML(text)    #初始化生成一个XPath解析对象
result=etree.tostring(html, encoding='utf-8')   #解析对象输出代码
print(type(html))
print(type(result))
print(result.decode('utf-8'))  #转码后的内容

运行结果

<class 'lxml.etree._Element'>
<class 'bytes'>
<html><body><div>
    <ul>
        <li class="item-1"><a href="link1.html“&gt;第一个&lt;/a&gt;&lt;/li&gt;&#10;        &lt;li class=" item-2=""/><a href="link2.html“&gt;second item&lt;/a&gt;&lt;/li&gt;&#10;        &lt;li class=" item-3=""/><a href="link3.html“&gt;a 属性&lt;/a&gt;&lt;/li&gt;&#10;    &lt;/ul&gt;&#10;&lt;/div&gt;&#10;"/></li></ul></div></body></html>

额....为什么我的结果跟书上不一样?

 关于html文档的标签和属性:认识HTML的标签、元素和属性 (baidu.com)

2.4.2 读取文件进行解析

LXML既然可以解析HTML字符串,那也可以解析HTML文件

例:调用parse方法来读取文件的文件名:text.xml

<div>
    <ul>
        <li class="item-1"><a href="link1.html“>first item</a></li>
        <li class="item-2"><a href="link2.html“>second item</a></li>
        <li class="item-3"><a href="link3.html“><span class="bold">third</span></a></li>
        <li class="item-4"><a href="link4.html“>fourth item</a></li>
        <li class="item-5"><a href="link5.html">fifth item</a></li>
    </ul>
</div>

将以上代码保存为text.xml文件

from lxml import etree
htmlEmt = etree.parse('text.xml')					# 使用etree的parse()方法解析xml文件
result = etree.tostring(htmlEmt, pretty_print=True)		# pretty_print: 优化输出
print(result)									# 输出

运行结果


b'<div>\n\t<ul>\n\t\t<li class="item-0"><a href="link1.html">first item</a></li>\n\t\t<li class="item-1"><a href="link2.html">second item</a></li>\n\t\t<li class="item-inactive"><a href="link3.html"><span class="bold">third item</span></a></li>\n\t\t<li class="item-1"><a href="link4.html">fourth item</a></li>\n\t\t<li class="item-0"><a href="link5.html">fifth item</a></li>\n\t</ul>\n</div>\n'

Process finished with exit code 0

例:调用XPath方法获取相应标签的文本内容

from lxml import etree
htmlEmt = etree.parse('text.xml')					# 使用etree的parse()方法解析xml文件

result = htmlEmt.xpath('//li')		# 获取所有‘li’
for i in result:
    print(etree.tostring(i))

结果:

b'<li class="item-0"><a href="link1.html">first item</a></li>\n\t\t'
b'<li class="item-1"><a href="link2.html">second item</a></li>\n\t\t'
b'<li class="item-inactive"><a href="link3.html"><span class="bold">third item</span></a></li>\n\t\t'
b'<li class="item-1"><a href="link4.html">fourth item</a></li>\n\t\t'
b'<li class="item-0"><a href="link5.html">fifth item</a></li>\n\t'

Process finished with exit code 0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值