• 12
  • 12
分享
  • 爬虫的基本原理?爬虫需要掌握哪些东西?——软件测试圈
  • 饭团🍙 2021-12-15 14:02:50 字数 2445 阅读 1562 收藏 12

什么是网络爬虫?相信刚接触爬虫这个词的人都有这样的疑问,网络爬虫可以做什么?它是基于什么样的原理,如果想要学习爬虫,需要掌握什么知识。本文将会对这些问题做一个解释和说明,希望可以帮助正在爬虫入门阶段的朋友。

网络爬虫是捜索引擎抓取系统的重要组成部分,爬虫的主要目的是将互联网上的网页下载到本地形成一个互联网内容的镜像备份

那么网络爬虫的基本结构和工作流程是什么样的呢?

基本的工作流程如下:

  1. 首先可以选择一部分精心挑选的种子url;

  2. 将这些URL放入待抓取URL系列;

  3. 从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中。此外,将这些URL放进已抓取URL队列;

  4. 分析已抓取URL队列中的URL,分析其中的其他URL,并且将URL放入待抓取URL队列,从而进入下一个循环。如此反复进行,直到遍历了整个网络或者满足某种条件后,才会停止下来。

1.png

对应的,可以将互联网的所有页面分为五个部分:

  • 已下载未过期网页。

  • 已下载已过期网页。

  • 待下载网页:待抓取URL队列中的网页。

  • 可知网页:还没有抓取下来,也没有在待抓取URL队列中,但是可以通过对已抓取页面或者待抓取URL对应页面进行分析获取到的URL。

不可知网页:爬虫无法直接抓取下载的网页。

2.png

通过以上内容,我们可以了解到:网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本,被广泛用于互联网搜索引擎或其他类似网站,具有一套基本的工作流程。

如果想要学习爬虫,要如何如入门呢?在入门阶段,了解下面基础的理论可以达到更好的学习效果

第一、明确抓取目的

我们需要抓取的网站内容一般来讲可以分为非结构化和结构化两种

1、非结构化的数据,

HTML文本

HTML其实理应属于结构化的文本组织,但是又因为一般我们需要的关键信息并非直接可以得到,需要进行对HTML的解析查找,甚至一些字符串操作才能得到,所以还是归类于非结构化的数据处理中。

对于HTML文本,常见解析方式有CSS选择器、XPATH、正则表达式。

一段文本

例如一篇文章,或者一句话,我们的初衷是提取有效信息,所以如果是滞后处理,可以直接存储,如果是需要实时提取有用信息,常见的处理方式如下

分词

根据抓取的网站类型,使用不同词库,进行基本的分词,然后变成词频统计,类似于向量的表示,词为方向,词频为长度。

NLP

自然语言处理,进行语义分析,用结果表示,例如正负面等。

2、关于结构化的数据

结构化的数据是最好处理,一般都是类似JSON格式的字符串,直接解析JSON数据就可以了,提取JSON的关键字段即可。

第二、知道内容从何而来

  • 网页包含内容

这种情况是最容易解决的,一般来讲基本上是静态网页已经写死的内容,或者动态网页,采用模板渲染,浏览器获取到HTML的时候已经是包含所有的关键信息,所以直接在网页上看到的内容都可以通过特定的HTML标签得到。

  • Java Script代码加载内容

这种情况是由于虽然网页显示时,内容在HTML标签里面,但是其实是由于执行js代码加到标签里面的,所以这个时候内容在js代码里面的,而js的执行是在浏览器端的操作,所以用程序去请求网页地址的时候,得到的response是网页代码和js的代码,所以自己在浏览器端能看到内容,解析时由于js未执行,肯定找到指定HTML标签下内容肯定为空,这个时候的处理办法,一般来讲主要是要找到包含内容的js代码串,然后通过正则表达式获得相应的内容,而不是解析HTML标签。

  • Ajax异步请求

这种情况是现在很常见的,尤其是在内容以分页形式显示在网页上,并且页面无刷新,或者是对网页进行某个交互操作后,得到内容。那我们该如何分析这些请求呢?这里我以Chrome的操作为例,进行说明:

所以当我们开始刷新页面的时候就要开始跟踪所有的请求,观察数据到底是在哪一步加载进来的。然后当我们找到核心的异步请求的时候,就只用抓取这个异步请求就可以了,如果原始网页没有任何有用信息,也没必要去抓取原始网页了。

第三、了解网络请求

我们常说爬虫其实就是一堆的HTTP请求,找到待爬取的链接,不管是网页链接还是App抓包得到的API链接,然后发送一个请求包,得到一个返回包(也有HTTP长连接,或者Streaming的情况,这里不考虑),所以核心的几个要素就是:

  1. URL;

  2. 请求方法(POST, GET);

  3. 请求包headers;

  4. 请求包内容;

  5. 返回包headers。

第四、如何突破常见的限制方式

  • Basic Auth

一般会有用户授权的限制,会在headers的Autheration字段里要求加入;

  • Referer

通常是在访问链接时,必须要带上Referer字段,服务器会进行验证,例如抓取京东的评论;

  • User-Agent

会要求真是的设备,如果不加会用编程语言包里自有User-Agent,可以被辨别出来;

  • Cookie

一般在用户登录或者某些操作后,服务端会在返回包中包含Cookie信息要求浏览器设置Cookie,没有Cookie会很容易被辨别出来是伪造请求;

也有本地通过JS,根据服务端返回的某个信息进行处理生成的加密信息,设置在Cookie里面;

  • Gzip

请求headers里面带了gzip,返回有时候会是gzip压缩,需要解压;

  • Java Script加密操作

一般都是在请求的数据包内容里面会包含一些被javascript进行加密限制的信息,例如新浪微博会进行SHA1和RSA加密,之前是两次SHA1加密,然后发送的密码和用户名都会被加密;

  • 其他字段

因为http的headers可以自定义地段,所以第三方可能会加入了一些自定义的字段名称或者字段值,这也是需要注意的。

真实的请求过程中,其实不止上面某一种限制,可能是几种限制组合在一次,比如如果是类似RSA加密的话,可能先请求服务器得到Cookie,然后再带着Cookie去请求服务器拿到公钥,然后再用js进行加密,再发送数据到服务器。所以弄清楚这其中的原理,并且耐心分析很重要。


文章来源:百度文库

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 做完测试后,都会编写一份测试报告,测试报告中最主要的就是呈现出测试结果,哪些用例通过了,哪些用例没有通过。像postman这么强大的功能也可以自动生成报告,供我们测试同学进行查看,显得更加有B格~~~newmanNewman是一款基于nodejs开发的可以运行postman脚本的工具,使用Newman,可以直接从命令运行和测试postman集合。1、安装nodejs:选择自己系统相对应的版本内容进行下载,然后傻瓜式安装查看是否安装成功,打开cmd输入node -v2、安装newman:注意:newman必须要跟nodejs处于一个文件当中,才可以安装成功,否则会报错的npm inst...
            14 14 3715
            分享
          • 一、背景漏测 Bug 是指产品逻辑缺陷在测试过程中没有被发现(尤其是测试环境可以重现的缺陷),上线版本发布后或者在用户使用体验后发现并反馈回来的缺陷。可能造成线上故障或者资损,在对产品测试过程中,自己也难免出现一些 Bug 的漏测,因此对 Bug 漏测进行一些思考,并进行总结。二、原因分析Bug 其实是任何应用产品都会有的一个问题,不是所有的 Bug 都能被发现,包括资深测试,或多或少的会出现线上缺陷,谁也不能把软件所有的功能操作、运用场景想周全。虽说不能做到完全零缺陷,但是每次发布的产品,我们需要追求缺陷越来越少,产品质量越来越高,减少线上问题的反馈。为什么会出现缺陷漏测,主要有以下几点:2...
            1 2 3781
            分享
          •   艺术家们起诉人工智能艺术生成器,在一场首开先河的诉讼中遇到了绊脚石,联邦法官驳回了大多数索赔要求,原告认为这些生成器未经授权使用从互联网上下载的数十亿张图片来训练人工智能系统,且未支付任何报酬。  美国联邦地区法官威廉-奥瑞克(William Orrick)周一认定,针对 Midjourney 和 DeviantArt 的版权侵权索赔无法继续进行,并认为这些指控"在许多方面存在缺陷"。其中的问题包括:它们所运行的人工智能系统是否真的包含用于创作侵权作品的受版权保护的图片副本,以及在人工智能工具没有创作出相同材料的情况下,艺术家们能否证实侵权行为。针对两家公司的侵权、公开...
            0 0 614
            分享
          • 一、项目上线质量指标你认为用什么质量指标可以反映项目上线的一个质量?你可能会想那不是有很多质量指标么?多数和BUG相关,例如BUG数量、重新打开BUG数、BUG解决时长等等,好像都能体现上线质量啊。可仔细想想,我们衡量上线质量,不能只看这些,质量不应该简简单单的关联上BUG就可以了。二、研发过程质量既然不能只看结果,那我们就从源头开始看起。首先是需求质量,想要最终的上线质量高,那么源头的需求质量就不能太低,否则后续的研发工作做的再优秀,也不算好,很有可能一开始就跑偏了。我们需要在需求评审的阶段,从用户使用场景的角度出发,通过提问,把需求逐步澄清,并形成验收条件(可以用思维导图的形式记录下来),...
            0 0 2074
            分享
          • 接口测试需要考虑的点/如何设计接口测试的用例?接口测试用例编写除了使用功能测试中最基本的等价类,边界值,因果图,错误推测,场景设计等方法外,还要考虑一些其他方面,首先我们要先进行冒烟测试,说白了就是传递正确的参数查看是否返回正确的结果然后还要考虑参数组合:因为参数有必填和非必填,参数的格式、长度,以及数据传输的业务流程中的一些限制,我们要考虑不同的参数组合的情况,以保证能够覆盖到所有的情况以及绕过验证、权限验证、参数是否加密最重要的是要考虑业务逻辑校验,请求的类型、格式,地址、参数,以及数据库的落地情况(比如测试新增更新的接口时,要看数据的返回是否完整,与数据库进行对比)。你做过接口测试吗,怎...
            9 9 2357
            分享
      • 51testing软件测试圈微信