文章目录
一、数据的类型
1、结构化数据
可以用统一的结构加以表示的数据。可以使用关系型数据库表示和存储,表现为二维形式的数据。特点是:数据以行为单位,一行数据表示一个实体的信息,每一行数据的属性是相同的。比如MySQL数据表中是数据。
2、半结构化数据
是结构化数据的一种形式,并不符合关系型数据库或其他数据表的形式关联起来的数据模型结构,但包含相关标记,用来分隔语义元素以及对记录和字段进行分层。因此,它也被称为自描述的结构。常见的半结构数据有HTML,XML和JSON等,实际上是以树或者图的结构来存储的。
3、非结构化数据
就是没有固定结构的数据,各种文档、图片、视频/音频等都属于非结构化数据。对于这类数据,我们一般直接整体进行存储,而且一般存储为二进制的数据格式。除了结构化和半结构数据之外的数据都是非结构化数据。
4、总结
简单来说,结构化数据要求严格,数据类型和大小都是提前规定好了的;而半结构化数据没有那么严格,可以适当扩充;非结构化数据,可以任意修改。
二、HTML与XML的区别
- 1、在HTML中不区分大恽,在XML中严格区分。
- 2.在HTML中,有时不严格,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略或者之类的结束标记。在XML中,是严格的树状结构,绝对不能省略掉结束标记。
- 3、在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个/字符作为结尾。这样分析器就知道不用查找结束标记了。
- 4、在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。
- 5、在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应的值。
- 6、HTML使用固有的标记;而XML没有固有的标记;HTML标签是预定义的:XML标签是免费的、自定义的、可扩展的。
- 7、HTML是用来显示数据并将内容与数据结合的,偏重前端;而XML是用来描述数据、存放数据的。HTML的设计目标是现实数据并集中与数据外观,而XML的设计目标是描述数据并集中与数据的内容。
总的来说就是,XML的语法要求比HTML的要严格;但他们的作用和设计目标不同,因此各有好处,就看我们是否用得恰当。
三、json文件
1、json文件的认识
JSON(JavaScript Object Notation, JS对象标记)是一种轻量级的数据交换格式。它基于ECMAScript (w3c制定的JS规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,铕效地提升网络传输效率。
2、JSON的语法规则
在JS语言中,一切都是对象。因此,任何支持的类型都可以通过JSON来表
示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型。
- 对象表示为键值对。
- 数据由逗号分隔。
- 花括号保存对象。
- 方括号保存数组。
3、JSON与JS对象的关系
实际上可以这么理解, JSON是JS对象的字符串表示法,它使用文本表示一个JS对象的信息,本质是一个字符串。
四、提取网页中的信息
1、XPath与Ixml的关系
XPath是一门在XML、HTML文档中查找信息的语言,对XPath的理解是很多高级XML、HTML应用的基础,XPath 在XML中通过元素和属性进行导航。Ixml是一个用来处理XMLr的第三方Python库,它在底层封装了用C语言编写的libxm12 和libxslt,并以简单强大的Python API, 兼容并加强了著名的Element TreeAPI。
安装: pip install Ixml
使用: from lxml import etree
# from xml.etree import ElementTree
# 或者这样导入
from xml.etree import cElementTree
# 一个xml字符串
xmlStr = """<bookstore>
<book>
<title lang="en">Python爬虫</title>
<author>Za·huw</author>
<year>2020</year>
<price>99,79</price>
</book>
<book>
<title lang="en">Python数据分析</title>
<author>Zo·ro</author>
<year>2018</year>
<price>49.9</price>
</book>
</bookstore>
"""
# 根节点
root = cElementTree.fromstring(xmlStr)
# print(root)
# 查找某一个节点
elements = root.find("book/title")
print(elements)
# 关于xpath语法其实并不好用,在我们需要xpath路径的时候我们完全可以借助浏览器来获取
# 找到对应的元素,右击检查,定位到需要链接那里,右击,Copy,有一个Copy Xpath,这就是我们需要的
2、Beautiful Soup的使用
Beautiful Soup是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树(parse tree)。它提 供简单又常用的导航(navigating) ,搜索以及修改剖析树的操作。它可以大大节省你的编程时间。
安装: pip install beautifuilsoup4。
# BeautifulSoup:相对于xpath而言,可读性好,可维护性好
# 缺点是:慢
from bs4 import BeautifulSoup
doc = ['<html><head><title>Hello</title></head>',
'<body><pid="firstpara" align="center">Hello world!></body></html>']
soup = BeautifulSoup(''.join(doc),"html")
print(soup.prettify())
print(type(soup.contents[0]))
# BeautifulSoup最好用的方法:找p标签的align属性
soup.findAll('p',align="center")
五、爬虫的实现
1、urllib来实现
from urllib import request
# 获取新浪首页的网页源代码
print(request.urlopen(request.Request("http://www.sina.com.cn")).read().decode())
2、request来实现
import requests
res = requests.get("http://www.sina.com.cn")
res.decoding = "utf-8"
print(res.text)
3、修改headers请求头信息
from urllib import request
# 修改请求头headers信息:用自己的浏览器,按F12查看数据,点Network,
# 随便找个数据包,找到Headers下的User-Agent,复制该键值对
# 即将自己访问该网站时的身份标识为一个浏览器,因为该身份浏览器是无法检测出是否正确的(一个爬虫可以利用的漏洞)
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36"}
request.urlopen(request.Request("http://www.sina.com.cn/",headers=headers)).read().decode('utf-8')
4、正则匹配复习
# 正则匹配
# 取出i=d%0A&from=AUTO&to=AUTO&%smartresult=dict&的key和value(()分组的方法)
import re
rec = "i=d%0A&from=AUTO&to=AUTO&%smartresult=dict&"
pi = "(.*?)=(.*?)&"
vv = re.findall(pi,rec)
print(vv)
5、url encode编码
实例:输入关键词,获取百度搜索网页
import urllib
from urllib import request
# 变量设定
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36"}
url = "https://www.baidu.com/s?"
keyword = input("请输入你要查询的信息:")
wd = {"wd":keyword} # 保存临时键值对
# 完成一次get请求
wd = urllib.parse.urlencode(wd) # 将get请求进行url encode编码
fullUrl = url + wd # 拼接搜索页的链接:原url + 对get请求的url编码
print(fullUrl) # 输出搜索页链接
# 获取整个网页文件:获取网页源代码 + 写入文件
req = request.Request(fullUrl,headers=headers)
response = request.urlopen(req)
with open("baiduSearch.html","wb") as f: # 响应信息就是字节类型的,因此不需要解码
f.write(response.read())