初识网络爬虫

得意时要看淡,失意时要看开。不论得意失意,切莫大意;不论成功失败,切莫止步。志得意满时,需要的是淡然,给自己留一条退路;失意落魄时,需要的是泰然,给自己觅一条出路初识网络爬虫,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

爬虫简介

网络爬虫又称网络蜘蛛、网络机器人,它是一种按照一定的规则自动浏览、检索网页信息的程序或者脚本。网络爬虫能够自动请求网页,并将所需要的数据抓取下来。通过对抓取的数据进行处理,从而提取出有价值的信息。

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

爬虫能做什么?

爬虫对于数据分析来说,可以从目标网站爬取有用的信息,不需要人工依次浏览拉取;爬虫用于搜索引擎咨询的收录,熟悉的一系列搜索引擎都是大型的网络爬虫,比如百度、搜狗、360浏览器、谷歌搜索等等。每个搜索引擎都拥有自己的爬虫程序,比如 360 浏览器的爬虫称作 360Spider,搜狗的爬虫叫做 Sogouspider。

爬虫分类

网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:通用网络爬虫(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,将网页分为变化网页和新网页两类,分别采用不同爬行策略。 为缓解对大量网页变化历史维护导致的性能瓶颈,它根据网页变化时间局部性规律,在短时期内直接爬行多次变化的网页,为尽快获取新网页,它利用索引型网页跟踪新出现网页。

Deep 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:请求载体的身份标识
  • Connection:请求完毕后,是断开连接还是保持连接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)新网站向搜索引擎主动提交网址:(如百度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基础语法

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/156208.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!