Python之网络爬虫(XML与HTML与JSON文件、urllib与request的用法)

2023-05-16

文章目录

      • 一、数据的类型
      • 二、HTML与XML的区别
      • 三、json文件
      • 四、提取网页中的信息
      • 五、爬虫的实现

一、数据的类型

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())
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python之网络爬虫(XML与HTML与JSON文件、urllib与request的用法) 的相关文章

  • 如何在 HTML/CSS 中进行制表符停止

    我想用 HTML 呈现一些文本的格式 这是一张图片 请注意带有项目符号点和段落编号的灰线 项目符号应位于页面中央 并且数字应正确对齐 我一直在尝试思考如何在 HTML 中做到这一点 但一无所获 您将如何捕获这种格式 您可以使用 before
  • Python - 使用 win32com.client 将 Excel 单元格范围格式化为表格

    我正在尝试编写一个函数 该函数选择工作表中的所有非空单元格 根据内容调整列宽 并将其格式化为表格 我被困在最后一点 这是我当前的代码 import win32com client from win32com client import co
  • python中的语音识别持续时间设置问题

    我有一个 Wav 格式的音频文件 我想转录 我的代码是 import speech recognition as sr harvard sr AudioFile speech file wav with harvard as source
  • 有没有办法在 Blazor 中隐藏 div?

    我正在使用 Blazor 并且想在按下导航栏切换器图标时隐藏侧边栏 列表项崩溃了 但问题是 div 仍然存在 div class page div class sidebar div class nav top row pl 4 navba
  • 导入错误:无法导入名称 urandom

    我正在构建一个新的 Linux 环境 并在 Python 上看到以下错误 python c import random Traceback most recent call last File
  • 可重用的 Tensorflow 卷积网络

    我想重用来自Tensorflow 专业人士的 MNIST CNN 示例 http www tensorflow org tutorials mnist pros index md 我的图像尺寸为 388px X 191px 只有 2 个输出
  • 从文件中读取单词并放入列表中

    本质上 我有一个巨大的文件 所有文件包含每行多个单词 每个单词用空格分隔 有点像这样 WORD WORD WORD WORD ANOTHER WORD SCRABBLE BLAH YES NO 我想要做的是将文件中的所有单词放入一个巨大的列
  • 在 html 中创建子页面 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 假设我有一个网站http www example com http www example com 如何为此页面创建更多子页面 即 w
  • 为 Keras 编写自定义数据生成器

    我将每个数据点存储在 npy 文件中 其中shape 1024 7 8 我想通过类似的方式将它们加载到 Keras 模型中ImageDataGenerator 所以我编写并尝试了不同的自定义生成器 但它们都不起作用 这是我改编的一个this
  • __subclasses__ 没有显示任何内容

    我正在实现一个从适当的子类返回对象的函数 如果我搬家SubClass from base py 没有出现子类 subclasses 它们必须在同一个文件中吗 也许我从来没有直接导入subclass py对Python隐藏子类 我能做些什么
  • “分页文件太小,无法完成此操作”尝试训练 YOLOv5 对象检测模型时出错

    我有大约 50000 个图像和注释文件用于训练 YOLOv5 对象检测模型 我在另一台计算机上仅使用 CPU 训练模型没有问题 但需要太长时间 因此我需要 GPU 训练 我的问题是 当我尝试使用 GPU 进行训练时 我不断收到此错误 OSE
  • 包装 C++ Qt 小部件以便在 Python 中与 PySide 一起使用

    在 Python 中使用自定义 Qt 显示小部件包装自定义 C 库以便在基于 PySide 的 QApplication 中使用的最佳方法是什么 C 库是否需要特殊处理才能使用 SWIG 进行包装 封装的 Qt 小部件能否与 PySide
  • 将 Matlab MEX 文件中的函数直接嵌入到 Python 中

    我正在使用专有的 Matlab MEX 文件在 Matlab 中导入一些仿真结果 当然没有可用的源代码 Matlab 的接口实际上非常简单 因为只有一个函数 返回一个 Matlab 结构体 我想知道是否有任何方法可以直接从Python调用M
  • 调试 python Web 服务

    我正在使用找到的说明here http www diveintopython net http web services user agent html 尝试检查发送到我的网络服务器的 HTTP 命令 但是 我没有看到按照教程中的建议在控制
  • 如何从 Selenium 获取元素的属性

    我正在 Python 中使用 Selenium 我想得到 val of a
  • Python中如何实现相对导入

    考虑 stuff init py mylib py Foo init py main py foo init py script py script py想要进口mylib py 这只是一个示例 但实际上我只想在父目录中进行模块的相对导入
  • 矩阵求逆 (3,3) python - 硬编码与 numpy.linalg.inv

    对于大量矩阵 我需要计算定义为的距离度量 尽管我确实知道强烈建议不要使用矩阵求逆 但我没有找到解决方法 因此 我尝试通过对矩阵求逆进行硬编码来提高性能 因为所有矩阵的大小均为 3 3 我预计这至少会是一个微小的改进 但事实并非如此 为什么
  • 使用 php 将 HTML 输出转换为纯文本

    我正在尝试将示例 HTML 输出转换为纯文本 但我不知道如何操作 我使用 file get contents 但我尝试转换的页面返回的结果最相似 raw http localhost guestbook profiles php file
  • 每行中最后一次出现 True 的索引

    我有一个二维数组 a False False False False False True True True True True True True True True True True True True True True True
  • 张量流多元线性回归不收敛

    我正在尝试使用张量流训练具有正则化的多元线性回归模型 由于某种原因 我无法获取以下代码的训练部分来计算我想要用于梯度下降更新的误差 我在设置图表时做错了什么吗 def normalize data matrix averages np av

随机推荐