还没被玩坏的robobrowser(8)——robobrowser的实现原理
背景
学习使用工具实际上不难,不过我们应该通过阅读工具源码来提升自己的水平。
多读代码,读好代码。很不错,robobrowser的代码简单易懂,值得学习。
预备知识
- 源码地址
- 一起其实是从browser.py开始的
要点
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的实现原理的更多相关文章
- 还没被玩坏的robobrowser(7)——表单操作
背景 有一些站点是需要登录之后才能抓取内容的,另外做web测试的时候登录是家常便饭. 这一节里我们就以登陆testerhome为例,讲解一下robobrowser中form的操作. 预备知识 get_ ...
- 还没被玩坏的robobrowser(6)——follow_link
背景 在做spider的时候,我们经常会有点击链接的需求. 考虑这样的一个简单spider:获取qq.com主页上的今日话题中的内容. 一般思路是先去qq.com首页上找到今日话题的链接,然后点击这个 ...
- 还没被玩坏的robobrowser(4)——从页面上抓取感兴趣的内容
背景 本节的知识实际上是属于Beautiful Soup的内容. robobrowser支持Beautiful Soup,一般来说通过下面3个方法获取页面上感兴趣的内容 find find_all s ...
- 还没被玩坏的robobrowser(3)——简单的spider
背景 做一个简单的spider用来获取python selenium实战教程的一些基本信息.因为python selenium每年滚动开课,所以做这样一个爬虫随时更新最新的开课信息是很有必要的. 预备 ...
- 还没被玩坏的robobrowser(2)——安装及快速开始
安装robobrowser 注意:这里假设你知道如何使用pip安装python的库的知识,如果你不了解这一块的话,点这里获取帮助. 强烈推荐使用pip安装. pip install robobrows ...
- 还没被玩坏的robobrowser(1)-简介
今天偶然发现了一个很有意思的python库——robobrowser.简单的看了一下,觉得这个东东作为轻量的爬虫还是很适合的.另外这个做一些简单的web测试也未尝不可. 好了,那么问题来了. 什么是r ...
- 还没被玩坏的robobrowser(5)——Beautiful Soup的过滤器
背景 本节的知识还是属于Beautiful Soup的内容. Beautiful Soup的find和find_all方法非常强大,他们支持下面一些类型的过滤器. 字符串 最简单的过滤器是字符串.在搜 ...
- 漫谈可视化Prefuse(四)---被玩坏的Prefuse API
这个双12,别人都在抢红包.逛淘宝.上京东,我选择再续我的“漫谈可视化”系列(好了,不装了,其实是郎中羞涩...) 上篇<漫谈可视化Prefuse(三)---Prefuse API数据结构阅读有 ...
- .CO域名快被这帮搞IT的玩坏了……
鉴于近来国内访问Google的服务受阻,greatfire.org于前天推出了其基于亚马逊AWS的Google搜索镜像网站,地址是sinaapp.co.该网站随后因多家海外媒体的报道和众多微博大V的转 ...
随机推荐
- linux curl工具
http://www.linuxidc.com/Linux/2008-01/10891.htm http://www.cnblogs.com/-clq/archive/2012/01/29/23308 ...
- Mysql删除所有表
SELECT CONCAT('DROP TABLE IF EXISTS ', table_name, ';') FROM information_schema.tables WHERE table_s ...
- sqlmap检测sql注入漏洞
sqlmap是一款非常强大的开源sql自动化注入工具,可以用来检测和利用sql注入漏洞.它由python语言开发而成,因此运行需要安装python环境. 官网:http://sqlmap.org/ 乌 ...
- SSH协议
SSH是一种协议,实现计算机之间的加密登录,即使被截获,截获的也只是加密后的密文,不会泄密. 如果每次登录另外一台计算机,都需要输入密码,就显得太麻烦,所以SSH协议实现了无密码登录,即公钥登录.所谓 ...
- PC版收音机—龙卷风收音机
龙卷风收音机-龙卷风 文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论
- 《Unix&Linux大学教程》学习笔记二:指令常识
1:指令的本质——调用可执行程序 在Shell输入命令时,其实就是根据名称运行相应的程序. 2:在系统中查找程序 which 指令名 type 指令名 3:时间与日历 date [-选项] 参数 ca ...
- Cocos2d-js 3.0 颜色变换(调整sprite/图片的色调)
Flash在滤镜方面做得比较成熟,starling也有很多现成的办法. 但Cocos2D这里就显得比较单薄,百度/谷歌很少相关资料. 后续如果有时间,再慢慢整理各种滤镜效果. 这里先介绍一下颜 ...
- ORA-01950: no privileges on tablespace xxx ORA-01950: 对表空间 'xxx'无权限
场景: 创建用户,在用户scheme下新建了一张表,插入数据时报错 ORA-01950: 对表空间 'xxx'无权限 创建用户 /*第1步:创建临时表空间 */ create temporary ta ...
- V-rep学习笔记:机器人逆运动学解算
IK groups and IK elements VREP中使用IK groups和IK elements来进行正/逆运动学计算,一个IK group可以包含一个或者多个IK elements: I ...
- 在xpage上怎么用jdbc去连接sql server呀
你去http://www.openntf.org/Internal/home.nsf 下載以下對應版本最新控件 XPages Extension Library 這裏面已經包括OSGI功能 OSGI在 ...