起因
Selenium本身是不支持HTTP请求抓取的,因为其团队认为这个不是selenium要解决的问题(确实也是)。所以推荐使用一个相关联的项目 -- BrowserMobProxy。
具体项目首页见:https://github.com/lightbody/browsermob-proxy
尝试
因为项目需要,所以就研究了下BrowserMobProxy。它其实是一个java实现的开源代理项目,它与普通的代理不同之处在于:
- 它支持REST API接口(可以通过http请求来动态创建代理服务)
- 默认启动的是一个代理Manager,它会管理N多个代理服务(我们真正使用的就是这个代理服务)
- 可以支持动态的代理配置
一张图看懂BrowserMobProxy的业务逻辑。
即在使用代理之前,需要先启动代理Manager;而这个Manager提供了REST API接口,支持动态创建代理服务。(它会维护一批申请过的代理服务)之后我们使用的其实都是新申请的代理服务。(所以它并不是一个代理实例,而是一个代理管理服务)
使用
要使用BrowserMobProxy首先你需要启动它的代理Manager。有3种方式:
- 直接通过bin目录下的脚本文件启动(如:browsermob-proxy.bat)
- 在程序中动态执行脚本文件
- JAVA项目可以导入到项目中通过SDK启动
BrowserMobProxy的代理Manager启动后,就可以向它申请具体的代理服务了。主要有2种方式:
- REST API方式
- JAVA的SDK方式
由于这里是讲Python相关的,所以后面只讲REST API方式。启动代理Manager和申请代理服务的代码如下:
BROWSERMOBPROXY = r"D:\browsermob-proxy-2.1.1\bin\browsermob-proxy.bat"
server = browsermobproxy.Server(BROWSERMOBPROXY, {'port': 8080}) # 初始化一个代理Manager服务,并监听8080端口
server.start() # 启动代理Manager服务
proxy = server.create_proxy() # 向代理Manager服务申请一个代理服务,会使用默认端口8081
print(proxy.port)
上述代码是在程序中执行了BrowserMobProxy的启动脚本,然后申请了一个代理服务。当然,你还可以先手动启动Bro