博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
还没被玩坏的robobrowser(8)——robobrowser的实现原理
阅读量:6713 次
发布时间:2019-06-25

本文共 1012 字,大约阅读时间需要 3 分钟。

背景

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

多读代码,读好代码。很不错,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的源码很适合新人去读,相信读过之后会很有收获。

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

全文完。

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

你可能感兴趣的文章
IntelliJ IDEA 2017.3.1 使用手册
查看>>
互联网协议入门(2)
查看>>
DataSource的可配参数有哪些,有哪些DataSource可以用
查看>>
免费的后台管理界面框架
查看>>
本地文件共享服务(nfs samba ftp)
查看>>
scp通过代理proxy传输文件
查看>>
excel 打开时报“发现不可读的内容...”
查看>>
pandas-利用python进行数据分析
查看>>
数据段、代码段、堆栈段、BSS段的区别
查看>>
Apache Bench
查看>>
WebService之Axis2快速入门(5): 管理会话(Session)
查看>>
以太坊RPC接口使用
查看>>
普通html标签<form>和struts2<s:form>的区别
查看>>
安装NTFS For Mac时显示文件已损坏怎么办
查看>>
-webkit-line-clamp实现多行文字溢出隐藏显示省略号
查看>>
Sublime Text 3 - 设置自动换行
查看>>
nil / Nil / NULL / NSNull in Objective-C
查看>>
iphone系统架构以及各层提供的主要服务
查看>>
配置sunspot tomcat结合sunspot_rails
查看>>
数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 执行
查看>>