小工具      在线工具  汉语词典  css  js  c++  java

初识网络爬虫

机器学习,爬虫 额外说明

收录于:158天前

爬虫简介

网络爬虫又称网络蜘蛛、网络机器人,是按照一定规则自动浏览、检索网页信息的程序或脚本。网络爬虫可以自动请求网页并捕获所需的数据。通过处理捕获的数据来提取有价值的信息。

简单来说,爬虫就是编写一个程序来模拟浏览器上网,然后让它抓取互联网上的数据的过程。

爬虫能做什么?

对于数据分析,爬虫可以从目标网站爬取有用信息,无需人工浏览和拉取;爬虫用于收集搜索引擎咨询。一系列大家熟悉的搜索引擎都是大型网络爬虫,如百度、搜狗、360浏览器、谷歌搜索等,每个搜索引擎都有自己的爬虫程序。比如360浏览器的爬虫叫360Spider,搜狗的爬虫叫Sogousspider。

爬虫分类

网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:通用网络爬虫(General Purpose Web Crawler)、聚焦网络爬虫(Focused Web Crawler)、增量式网络爬虫(Incremental Web Crawler)、深层网络爬虫(Deep Web Crawler)。 实际的网络爬虫系统通常是几种爬虫技术相结合实现的。
通用网络爬虫
通用网络爬虫又称全网爬虫(Scalable Web Crawler),爬行对象从一些种子 URL 扩充到整个 Web,主要为门户站点搜索引擎和大型 Web 服务提供商采集数据。 由于商业原因,它们的技术细节很少公布出来。 这类网络爬虫的爬行范围和数量巨大,对于爬行速度和存储空间要求较高,对于爬行页面的顺序要求相对较低,同时由于待刷新的页面太多,通常采用并行工作方式,但需要较长时间才能刷新一次页面。 虽然存在一定缺陷,通用网络爬虫适用于为搜索引擎搜索广泛的主题,有较强的应用价值。
通用网络爬虫的结构大致可以分为页面爬行模块、页面分析模块、链接过滤模块、页面数据库、URL 队列、初始 URL 集合几个部分。为提高工作效率,通用网络爬虫会采取一定的爬行策略。 常用的爬行策略有:深度优先策略、广度优先策略。
(1)深度优先策略:其基本方法是按照深度由低到高的顺序,依次访问下一级网页链接,直到不能再深入为止。 爬虫在完成一个爬行分支后返回到上一链接节点进一步搜索其它链接。 当所有链接遍历完后,爬行任务结束。 这种策略比较适合垂直搜索或站内搜索,但爬行页面内容层次较深的站点时会造成资源的巨大浪费。
(2)广度优先策略:此策略按照网页内容目录层次深浅来爬行页面,处于较浅目录层次的页面首先被爬行。 当同一层次中的页面爬行完毕后,爬虫再深入下一层继续爬行。 这种策略能够有效控制页面的爬行深度,避免遇到一个无穷深层分支时无法结束爬行的问题,实现方便,无需存储大量中间节点,不足之处在于需较长时间才能爬行到目录层次较深的页面。

专注于网络爬虫
聚焦网络爬虫(Focused Crawler),又称主题网络爬虫(Topical Crawler),是指选择性地爬行那些与预先定义好的主题相关页面的网络爬虫。 和通用网络爬虫相比,聚焦爬虫只需要爬行与主题相关的页面,极大地节省了硬件和网络资源,保存的页面也由于数量少而更新快,还可以很好地满足一些特定人群对特定领域信息的需求。
聚焦网络爬虫和通用网络爬虫相比,增加了链接评价模块以及内容评价模块。聚焦爬虫爬行策略实现的关键是评价页面内容和链接的重要性,不同的方法计算出的重要性不同,由此导致链接的访问顺序也不同。
(1)基于内容评价的爬行策略:DeBra将文本相似度的计算方法引入到网络爬虫中,提出了 Fish Search 算法,它将用户输入的查询词作为主题,包含查询词的页面被视为与主题相关,其局限性在于无法评价页面与主题相关度的高低。 Herseovic对 Fish Search 算法进行了改进,提出了 Sharksearch 算法,利用空间向量模型计算页面与主题的相关度大小。
(2)基于链接结构评价的爬行策略 :Web 页面作为一种半结构化文档,包含很多结构信息,可用来评价链接重要性。 PageRank 算法最初用于搜索引擎信息检索中对查询结果进行排序,也可用于评价链接重要性,具体做法就是每次选择 PageRank 值较大页面中的链接来访问。 另一个利用 Web结构评价链接价值的方法是 HITS 方法,它通过计算每个已访问页面的 Authority 权重和 Hub 权重,并以此决定链接的访问顺序。
(3)基于增强学习的爬行策略:Rennie 和 McCallum 将增强学习引入聚焦爬虫,利用贝叶斯分类器,根据整个网页文本和链接文本对超链接进行分类,为每个链接计算出重要性,从而决定链接的访问顺序。
(4)基于语境图的爬行策略:Diligenti 等人提出了一种通过建立语境图(Context Graphs)学习网页之间的相关度,训练一个机器学习系统,通过该系统可计算当前页面到相关 Web 页面的距离,距离越近的页面中的链接优先访问。印度理工大学(IIT)和 IBM 研究中心的研究人员开发了一个典型的聚焦网络爬虫。 该爬虫对主题的定义既不是采用关键词也不是加权矢量,而是一组具有相同主题的网页。 它包含两个重要模块:一个是分类器,用来计算所爬行的页面与主题的相关度,确定是否与主题相关;另一个是净化器,用来识别通过较少链接连接到大量相关页面的中心页面。

增量网络爬虫
增量式网络爬虫(Incremental Web Crawler)是指对已下载网页采取增量式更新和只爬行新产生的或者已经发生变化网页的爬虫,它能够在一定程度上保证所爬行的页面是尽可能新的页面。 和周期性爬行和刷新页面的网络爬虫相比,增量式爬虫只会在需要的时候爬行新产生或发生更新的页面,并不重新下载没有发生变化的页面,可有效减少数据下载量,及时更新已爬行的网页,减小时间和空间上的耗费,但是增加了爬行算法的复杂度和实现难度。增量式网络爬虫的体系结构[包含爬行模块、排序模块、更新模块、本地页面集、待爬行 URL 集以及本地页面URL 集]。
增量式爬虫有两个目标:保持本地页面集中存储的页面为最新页面和提高本地页面集中页面的质量。 为实现第一个目标,增量式爬虫需要通过重新访问网页来更新本地页面集中页面内容,常用的方法有:(1)统一更新法:爬虫以相同的频率访问所有网页,不考虑网页的改变频率;(2)个体更新法:爬虫根据个体网页的改变频率来重新访问各页面;(3)基于分类的更新法:爬虫根据网页改变频率将其分为更新较快网页子集和更新较慢网页子集两类,然后以不同的频率访问这两类网页。
为实现第二个目标,增量式爬虫需要对网页的重要性排序,常用的策略有:广度优先策略、PageRank 优先策略等。IBM 开发的 WebFountain是一个功能强大的增量式网络爬虫,它采用一个优化模型控制爬行过程,并没有对页面变化过程做任何统计假设,而是采用一种自适应的方法根据先前爬行周期里爬行结果和网页实际变化速度对页面更新频率进行调整。北京大学的天网增量爬行系统旨在爬行国内 Web,将网页分为变化网页和新网页两类,分别采用不同爬行策略。 为缓解对大量网页变化历史维护导致的性能瓶颈,它根据网页变化时间局部性规律,在短时期内直接爬行多次变化的网页,为尽快获取新网页,它利用索引型网页跟踪新出现网页。

深网爬虫
Web 页面按存在方式可以分为表层网页(Surface Web)和深层网页(Deep Web,也称 Invisible Web Pages 或 Hidden Web)。 表层网页是指传统搜索引擎可以索引的页面,以超链接可以到达的静态网页为主构成的 Web 页面。Deep Web 是那些大部分内容不能通过静态链接获取的、隐藏在搜索表单后的,只有用户提交一些关键词才能获得的 Web 页面。例如那些用户注册后内容才可见的网页就属于 Deep Web。 2000 年 Bright Planet 指出:Deep Web 中可访问信息容量是 Surface Web 的几百倍,是互联网上最大、发展最快的新型信息资源。
Deep Web 爬虫体系结构包含六个基本功能模块 (爬行控制器、解析器、表单分析器、表单处理器、响应分析器、LVS 控制器)和两个爬虫内部数据结构(URL 列表、LVS 表)。 其中 LVS(Label Value Set)表示标签/数值集合,用来表示填充表单的数据源。
Deep Web 爬虫爬行过程中最重要部分就是表单填写,包含两种类型:
(1)基于领域知识的表单填写:此方法一般会维持一个本体库,通过语义分析来选取合适的关键词填写表单。 Yiyao Lu等人提出一种获取 Form 表单信息的多注解方法,将数据表单按语义分配到各个组中,对每组从多方面注解,结合各种注解结果来预测一个最终的注解标签;郑冬冬等人利用一个预定义的领域本体知识库来识别 Deep Web 页面内容,同时利用一些来自 Web 站点导航模式来识别自动填写表单时所需进行的路径导航。
(2)基于网页结构分析的表单填写: 此方法一般无领域知识或仅有有限的领域知识,将网页表单表示成 DOM 树,从中提取表单各字段值。 Desouky 等人提出一种 LEHW 方法,该方法将 HTML 网页表示为DOM 树形式,将表单区分为单属性表单和多属性表单,分别进行处理;孙彬等人提出一种基于 XQuery 的搜索系统,它能够模拟表单和特殊页面标记切换,把网页关键字切换信息描述为三元组单元,按照一定规则排除无效表单,将 Web 文档构造成 DOM 树,利用 XQuery 将文字属性映射到表单字段。

robots协议

Robots协议也称为爬虫协议、爬虫规则等。robots.txt协议是君子协议,规定了网站中哪些数据可以爬取,哪些数据不能爬取。

robots.txt文件是一个文本文件,使用任何一个常见的文本编辑器,比如Windows系统安装了Notepad,就可以创建和编辑它 。robots.txt是一个协议,而不是一个命令。robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。robots.txt文件告诉蜘蛛程序在服务器上什么文件是可以被查看的。
当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在,搜索机器人就会按照该文件中的内容来确定访问的范围;如果该文件不存在,所有的搜索蜘蛛将能够访问网站上所有没有被口令保护的页面。百度官方建议,仅当您的网站包含不希望被搜索引擎收录的内容时,才需要使用robots.txt文件。如果您希望搜索引擎收录网站上所有内容,请勿建立robots.txt文件。

如果您将网站视为酒店的房间,那么 robots.txt 就是业主挂在房间门口的“请勿打扰”或“欢迎清洁”标志。该文件告诉访问搜索引擎哪些房间可以进入和访问,哪些房间不向搜索引擎开放,因为它们存放贵重物品或可能涉及居民和访客的隐私。但robots.txt不是命令,也不是防火墙,就像看门人无法阻止小偷等恶意入侵者一样。

# 文件写法
User-agent: * 这里的*代表的所有的搜索引擎种类,*是一个通配符
Disallow: /admin/ 这里定义是禁止爬寻admin目录下面的目录
Disallow: /require/ 这里定义是禁止爬寻require目录下面的目录
Disallow: /ABC/ 这里定义是禁止爬寻ABC目录下面的目录
Disallow: /cgi-bin/*.htm 禁止访问/cgi-bin/目录下的所有以".htm"为后缀的URL(包含子目录)。
Disallow: /*?* 禁止访问网站中所有包含问号 (?) 的网址
Disallow: /.jpg$ 禁止抓取网页所有的.jpg格式的图片
Disallow:/ab/adc.html 禁止爬取ab文件夹下面的adc.html文件。
Allow: /cgi-bin/ 这里定义是允许爬寻cgi-bin目录下面的目录
Allow: /tmp 这里定义是允许爬寻tmp的整个目录
Allow: .htm$ 仅允许访问以".htm"为后缀的URL。
Allow: .gif$ 允许抓取网页和gif格式图片
Sitemap: 网站地图 告诉爬虫这个页面是网站地图

robots.txt文件应放置在网站的根目录下。

爬虫语言选择

PHP、Java、C/C++都可以用来编写爬虫程序,但相比之下Python是最容易编写爬虫程序的。下面简单比较一下它们的优缺点:

PHP:对多线程和异步处理没有很好的支持,并发处理能力较弱; Java也经常被用来编写爬虫程序,但是Java语言本身就非常繁琐,代码量也很大,所以对于初学者来说是一个入门障碍。高的; C/C++虽然运行效率高,但学习和开发成本较高。编写一个小型爬虫程序可能需要很长时间。

Python语言语法优美,代码简洁,开发效率高,支持多种爬虫模块,如urllib、requests、Bs4等。Python的请求模块和解析模块丰富成熟,同时还提供了强大的Scrapy框架,使得编写爬虫程序变得更加容易。因此,使用Python来编写爬虫程序是一个非常好的选择。

http协议和https协议

在编写网络爬虫之前,您需要了解两个协议。 http协议:它是服务器和客户端之间的一种数据交互形式。 http协议中常用的请求头信息:

  • User-Agent:请求承载者的身份
  • 连接:请求完成后,是否断开或保持连接。 http协议中常用的响应头信息:
  • Content-Type:服务器响应客户端的数据类型。 https协议实际上是一种安全的http协议。

网页审查元素

在这里插入图片描述

打开浏览器输入一个网址按F12选择源代码会看到网页的原始数据。也可以ctrl+s将网页保存下来用html软件打开,就能看到原始的网页数据。

爬虫就是根据这些有规则的数据获取相应的内容的,html的标签<T></T>包裹的内容。

网页一般由三部分组成,即HTML(超文本标记语言)、CSS(层叠样式表)和JavaScript(简称“JS”动态脚本语言)。他们三人分别在网页中承担着不同的任务。

  • HTML 负责定义网页的内容
  • CSS 负责描述网页的布局
  • JavaScript 负责网页的行为
{% extends 'base.html' %}
{% block content %}
<div class="col-sm-9 col-12" style="padding-top:25px;padding-bottom:20px; padding-left:0px;padding-right:0px">
    <!--轮播图,不需要管高度,boostrap根据内容更改且默认有15px的padding-->
    <div class="col-12" style="padding:15px 0px">
        <div id="carouselExampleIndicators" class="carousel slide" data-ride="carousel">
              <ol class="carousel-indicators">
                <li data-target="#carouselExampleIndicators" data-slide-to="0" class="active"></li>
                <li data-target="#carouselExampleIndicators" data-slide-to="1"></li>
                <li data-target="#carouselExampleIndicators" data-slide-to="2"></li>
              </ol>
              <div class="carousel-inner">
                <div class="carousel-item active">
                  <img src="/img/lunbofive.jpg" class="d-block w-100" alt="...">
                </div>
                <div class="carousel-item">
                  <img src="/img/lunbotwo.jpg" class="d-block w-100" alt="...">
                </div>
                <div class="carousel-item">
                  <img src="/img/lunbothree.jpg" class="d-block w-100" alt="...">
                </div>
              </div>
              <button class="carousel-control-prev" type="button" data-target="#carouselExampleIndicators" data-slide="prev">
                <span class="carousel-control-prev-icon" aria-hidden="true"></span>
                <span class="sr-only">Previous</span>
              </button>
              <button class="carousel-control-next" type="button" data-target="#carouselExampleIndicators" data-slide="next">
                <span class="carousel-control-next-icon" aria-hidden="true"></span>
                <span class="sr-only">Next</span>
              </button>
            </div>
    </div>


    {% for article,nickname in result %}
    <div class="col-12 article-list" style="height:285px; margin:10px 0px">
    <!--文章一-->
        <div class="container">
            <div class="row">
                <div class="col-3 d-none d-xl-block" style="height:285px; padding:0px">
                    <img src="/img/{
     {article.picture}}" width="250px" height="250px">
                </div>
                <div class="col-9" style="height:285px;padding-bottom:15px; padding-right:15px">
                    <!--标题连接-->
                    <div class="col-12" style="word-break:break-all;width:720px "><a href="/article/{
     {article.articleid}}"><h4>{
   {article.headline}}</h4></a></div>
                    <!--时间-->
                    <div class="col-12 info" style="word-break:break-all;width:800px ">作者:{
   {nickname}} &nbsp;类别:{
   {article_type[article.type]}} &nbsp;日期:{
   {article.createtime}} &nbsp;阅读量:{
   {article.readcount}} &nbsp; 消耗积分:{
   {article.artcost}}</div>
                    <!--文章-->
                        <div class="col-12 article-box" style="word-break:break-all;width:720px; padding-top:10px">
                            <span>
                                {
   {article.content | truncate(399)}}
                            </span>
                        </div>
                </div>

            </div>

        </div>
    </div>

    {% endfor %}



    <div class="col-12 article-list" style="height:285px; margin:10px 0px">
    <!--文章二-->
        <div class="container">
            <div class="row">
                <!--d-none d-xl-block表示在所有见面影藏在pc段显示-->
                <div class="col-3 d-none d-xl-block" style="height:285px; padding:0px">
                    <img src="/img/huozhongyuan.png" width="250px" height="250px">
                </div>


                <div class="col-9" style="height:285px;padding-bottom:15px; padding-right:15px">
                    <!--标题连接-->
                    <div class="col-12" style="word-break:break-all;width:720px "><a href="/article/608"><h4>变形金刚</h4></a></div>
                    <!--时间-->
                    <div class="col-12 info" style="word-break:break-all;width:720px ">作者:atobots &nbsp;&nbsp;&nbsp;类别:movies&nbsp;&nbsp;&nbsp; 日期:<div id="time1"></div></div>
                    <!--文章-->
                    <div class="col-12 article-box" style="word-break:break-all;width:720px ;padding-top:10px">
                        <span>
                            为了追寻能量块,威震天(雨果·维文配音)来到了地球,在北极,他受到磁场的强干扰,意外地被封冻于冰层之下。借助不慎跌入冰谷的科学家们,威震天将有关能量块的信息
                            扫描到科学家的眼镜上。威震天被美国军方秘密转移到位于胡佛大坝地下的秘密基地,这个秘密只有历任国防部长组成的7人军事小组知道。
                        </span>
                    </div>
                </div>


            </div>
        </div>
    </div>




    <!--导航页-->
    <div class="d-sm-12 col-12 list" style="border:solid 1px #cc5994">

        <div class="container">
            <div class="row" style="line-height:50px">
               <div class="col-12" style="text-align:center">

                   <!-- 如果是第1页,则上一页也是第1页,否则上一页为当前页-1 -->
<!--分页-->

                    {# 首页判断 #}
                   {% if page == 1 %}
                   <a href="/type/{
     {type}}-1"></a>&nbsp;&nbsp;
                   {% else %}
                   <a href="/type/{
     {type}}-{
     {page-1}}">上一页</a> &nbsp;
                   {% endif %}

                   <!-- 根据总页数循环填充页码,并为其添加超链接进行导航 -->
                   {% for i in range(paing) %}
                   <a href="/type/{
     {type}}-{
     {i+1}}">{
   {i+1}}</a>&nbsp;&nbsp;
                   {% endfor %}




                   <!-- 如果是最后一页,则下一页也是最后页,否则下一页为当前页+1 -->
                   {% if page == paing %}
                   <a href="/type/{
     {paing}}-{
     {pading}}"></a>
                   {% else %}
                   <a href="/type/{
     {type}}-{
     {page+1}}">下一页</a>
                   {% endif %}



               </div>

            </div>
        </div>
    </div>

</div>

{# 引入侧边栏 #}
{%  include 'side.html' %}
{% endblock %}


上面的网页是一个静态网页。数据未呈现。数据来自服务器。请求发送后,服务器将渲染数据以获得相关内容。爬虫的工作是获取相关内容。

网络爬虫原理:通用爬虫如何获取页面内容?

在这里插入图片描述

  1. 抓取网络

搜索引擎使用通用爬虫来抓取网页。基本工作流程与其他爬虫类似。一般步骤如下:

(1)首先选择一部分种子URL,将这些URL放入待爬取的URL队列中;

(2)取出待爬取的URL,解析DNS获取主机的IP,下载该URL对应的网页,存储到下载的网页库中,并将这些URL放入已抓取的URL队列中。

(3)分析已爬取的URL队列中的URL,分析其中的其他URL,并将该URL放入待爬取的URL队列中,从而进入下一个循环。

那么,搜索引擎如何获取新网站的URL呢?

(1)新网站主动向搜索引擎提交URL:(如百度http://zhanzhang.baidu.com/linksubmit/url)。

(2)在其他网站上设置新的网站外部链接(尽可能在搜索引擎爬虫的爬行范围内)。

(3)当搜索引​​擎与DNS解析服务商(如DNSPod等)合作时,新的网站域名会被快速抓取。

  1. 数据存储

搜索引擎通过爬虫抓取网页后,将数据存储到原始页面数据库中。页面数据与用户浏览器获取的HTML完全相同。

搜索引擎蜘蛛在抓取页面时也会进行某些重复内容检测。一旦他们在访问权重很低的网站上遇到大量抄袭、收集或复制的内容,他们很可能会停止爬行。

  1. 预处理

搜索引擎对爬虫爬回的页面进行各种预处理步骤,包括:

  • 提取文本

  • 中文分词

  • 消除噪音(如版权声明文本、导航栏、广告等...)

  • 索引处理

  • 链接关系计算

  • 特殊文件处理

  • 等待

  1. 获取您需要的数据。

入门案例

# 导入网络请求库
import urllib.request

# 调用方法返回请求对象
response = urllib.request.urlopen("http://www.baidu.com")

# 打印响应内容
print(response)
# 解析响应对象
html = response.read().decode('utf-8')

# 打印内容
print(html)

在这里插入图片描述
如上图所示,第三方库已经把网页的内容读取下来了,这只是爬虫的第一步,这些数据大多是无效的,还需要对这些数据进一步解析。主要就是对爬虫库的方法的运用。

如果还不熟悉python语言看小编之前的python基本语法

. . .

相关推荐

额外说明

若易如何将前端静态资源整合到后端访问中?

若依前后端分离,如何将前端资源打包,然后整合到后端后,与后端一同打包,形成一个jar,这样在部署的时候,就比较简单。但是一般不推荐这样做,既然用到了前后端分离架构,那么,分离部署是一个更好的解决方案,对于这个小众需求,我们应该怎么做呢? 一、前提准备 在

额外说明

==和equals的区别

String本身是final类 字符串是不可变的对象     == 比较的是值 比较基本的数据类型,比较的是数值 ,基本数据类型就在栈 比较引用类型:比较引用指向的值(地址) ,   equals 默认比较也是地址,因为这个方法的最初定义在Object上

额外说明

MFC 单选按钮控制使用

1. 设置 把2个Radio-Button Control放在Group Box。将Group Box的Group属性设置为True。同时对组合框内的控件的group属性设置为False。使之用户在同一时刻只能选择一个按钮。 2. 初始化 BOOL Cx

额外说明

几分钟带你掌握Spring的那些注解使用

-作者简介:大家好,我是卷心菜~~,在校大二学生一枚,Java领域新星创作者。 -个人主页:卷心菜的CSDN博客 -系列专栏:本文写在Java设计模式专栏:Spring5知识记录 -如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步- -如果感

额外说明

Ubuntu18.04安装OpenCV4.3.0和环境配置(支持编译CUDA并安装配置python-opencv)

Ubuntu18.04安装OpenCV4.3.0和环境配置 下载源文件 安装依赖 编译安装 环境配置 动态库配置 配置OpenCV的`PKG-CONFIG`环境 Python-OpenCV环境[如果安装python支持,否则可以跳过此步] 测试OpenC

额外说明

[项目实战] 使用Idea构建单页面Vue3项目(不使用node、npm)

前言 某天张三对小花说,我需要在一台新电脑上实现一个前端的漂亮页面:比如京东手机首页(m.jd.com)。 小花这时吭哧吭哧的去新电脑上安装nodejs、npm,然后在本地使用npm构建vue3项目,在项目里下载安装element-plus、axios。

额外说明

newstyles项目实战(二十)jedis与Spring整合

Spring和Jedis结合配置: Jedis连接池的配置: <!-- 连接池配置 --> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <!-- 最

额外说明

机器学习算法评价指标之group auc(gauc)

 在机器学习算法中,很多情况我们都是把auc当成最常用的一个评价指标,而auc反映整体样本间的排序能力,但是有时候auc这个指标可能并不能完全说明问题,有可能auc并不能真正反映模型的好坏,以CTR预估算法(推荐算法一般把这个作为一个很重要的指标)为例,

额外说明

五、表的关联关系

五、表的关联关系 一对多关系为关系数据库中两个表之间的一种关系,该关系中第一个表中的单个行可以与第二个表中的一个或多个行相关,但第二个表中的一个行只可以与第一个表中的一个行相关。 -- 书籍表 CREATE TABLE book( id INT PRIM

ads via 小工具