背景

学习使用工具实际上不难,不过我们应该通过阅读工具源码来提升自己的水平。

多读代码,读好代码。很不错,robobrowser的代码简单易懂,值得学习。

预备知识

要点

  • RoboState类里,页面上内容的抓取和处理实际上委托给了BeautifulSoup。RoboState类的_parsed对象实际上就是BeautifulSoup的实例;

  • RoboState类中保存了每个请求的响应内容——response.content;

  • RoboBrowser类里,发送请求的方法实际上委托给了requests类——session;

  • RoboBrowser类里比较复杂就是保存每次访问的状态,以及实现back和forward功能。其主要思想是把所有的访问历史都放在内存里,然后通过游标去访问;

  • 每次页面发生变化,也就是open和submit_form之后都会调用_update_state方法去更新当前状态;

流程梳理

  • RoboBrowser()实例化的时候,会new 1个requests的session用于发送http请求,同时初始化游标为-1并且当前的status列表初始化为空;

  • RoboBrowser.open(url)方法调用时,session对象会访问具体的url,然后更新游标和status列表。基本思想是往status列表里append 1个新new出来的RoboState对象;

  • RoboBrowser.find()方法调用时,使用当前游标处的state对象的_parsed对象的find方法去抓取页面内容,实际上就是BeautifulSoup的find方法;

讨论

从robobrowser的代码里我们可以看出来,对于测试框架或者具体的业务来说,发明轮子实际上是不太可取的。用最好的第三方库去做它们最擅长的事情才是王道。robobrowser里请求的发送归requests负责,页面的解析由BeautifulSoup去管理,相得益彰。

另外RoboBrowser类中使用了委托模式,请求的发送委托给requests对象,页面解析委托给BeautifulSoup对象。

写在最后

新人往往纠结于读什么代码可以让自己进步。robobrowser的源码很适合新人去读,相信读过之后会很有收获。

本教程旨在抛砖引玉,错误的地方还请多多指正。

全文完。

文本版权归乙醇所有,欢迎转载,但请标明出处。

还没被玩坏的robobrowser(8)——robobrowser的实现原理的更多相关文章

  1. 还没被玩坏的robobrowser(7)——表单操作

    背景 有一些站点是需要登录之后才能抓取内容的,另外做web测试的时候登录是家常便饭. 这一节里我们就以登陆testerhome为例,讲解一下robobrowser中form的操作. 预备知识 get_ ...

  2. 还没被玩坏的robobrowser(6)——follow_link

    背景 在做spider的时候,我们经常会有点击链接的需求. 考虑这样的一个简单spider:获取qq.com主页上的今日话题中的内容. 一般思路是先去qq.com首页上找到今日话题的链接,然后点击这个 ...

  3. 还没被玩坏的robobrowser(4)——从页面上抓取感兴趣的内容

    背景 本节的知识实际上是属于Beautiful Soup的内容. robobrowser支持Beautiful Soup,一般来说通过下面3个方法获取页面上感兴趣的内容 find find_all s ...

  4. 还没被玩坏的robobrowser(3)——简单的spider

    背景 做一个简单的spider用来获取python selenium实战教程的一些基本信息.因为python selenium每年滚动开课,所以做这样一个爬虫随时更新最新的开课信息是很有必要的. 预备 ...

  5. 还没被玩坏的robobrowser(2)——安装及快速开始

    安装robobrowser 注意:这里假设你知道如何使用pip安装python的库的知识,如果你不了解这一块的话,点这里获取帮助. 强烈推荐使用pip安装. pip install robobrows ...

  6. 还没被玩坏的robobrowser(1)-简介

    今天偶然发现了一个很有意思的python库——robobrowser.简单的看了一下,觉得这个东东作为轻量的爬虫还是很适合的.另外这个做一些简单的web测试也未尝不可. 好了,那么问题来了. 什么是r ...

  7. 还没被玩坏的robobrowser(5)——Beautiful Soup的过滤器

    背景 本节的知识还是属于Beautiful Soup的内容. Beautiful Soup的find和find_all方法非常强大,他们支持下面一些类型的过滤器. 字符串 最简单的过滤器是字符串.在搜 ...

  8. 漫谈可视化Prefuse(四)---被玩坏的Prefuse API

    这个双12,别人都在抢红包.逛淘宝.上京东,我选择再续我的“漫谈可视化”系列(好了,不装了,其实是郎中羞涩...) 上篇<漫谈可视化Prefuse(三)---Prefuse API数据结构阅读有 ...

  9. .CO域名快被这帮搞IT的玩坏了……

    鉴于近来国内访问Google的服务受阻,greatfire.org于前天推出了其基于亚马逊AWS的Google搜索镜像网站,地址是sinaapp.co.该网站随后因多家海外媒体的报道和众多微博大V的转 ...

随机推荐

  1. Android 演示 ViewPager

    本文内容 环境 项目结构 演示 1:PagerTitleStrip 演示 2:PagerTabStrip 演示 3:ViewPager 和动态 Fragment 下载 Demo 环境 Windows ...

  2. Mybatis特殊值Enum类型转换器-ValuedEnumTypeHandler

    引言 typeHandlers 阅读官方文档 typeHandlers 一节 {:target="_blank"} MyBatis 在预处理语句(PreparedStatement ...

  3. C#.NET常见问题(FAQ)-如何让文本框textbox内容靠右显示

    对于TextBox,我可以设置Text-Align属性为right,就可以让文字靠右了   对于Label而言,需要修改AutoSize为False,并修改TextAlign为MiddleRight, ...

  4. bootstrap自适应栅格系统布局

  5. kibana 显示 @timestamp 时间问题(utc or browser当前时间)自动转换显示

    https://github.com/elasticsearch/kibana/issues/95

  6. QTP Test ,VAPI-XP Test,LR Test 和ALM 集成远程分布式执行遇到的“access is denied ” “unspecified error”问题

    大家都知道QTP与ALM (QC的升级版)集成是最好的一个分布式执行的结合.因为毕竟QTP是一个商业软件,HP当然不会让你去跟其他的open source的工具去集成,要不他到哪里去挣钱. 有时候服务 ...

  7. excel如何快速实现数据区域的框选

    这里会存在2个情况,一个是快速的选择一行或者一列的数据,另外一个是快速的选择一块的数据(数据区域) 1.当有上万条数据时,怎么快速的选择一行或一列的数据? 方法:将鼠标放在需要选择的数据区域的开头位置 ...

  8. POJ 2676 Sudoku (数独 DFS)

      Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14368   Accepted: 7102   Special Judg ...

  9. 加了moment.js和中文语言包,那么其它时间控件的中文包就可以不引用

    <script src="//cdn.bootcss.com/moment.js/2.13.0/moment.min.js"></script> <s ...

  10. js截取相应的域名----正则匹配法 和校验Url 正则表达式

    js截取相应的域名----正则匹配法 和校验Url 正则表达式 用javascript截取相应的域名方法两种,供大家参考 1.方法1: [javascript] view plain copy fun ...