基于makina语料库的具有用户代理伪造和代理能力的zope.testbrowser扩展
collective.anonymousbrowser的Python项目详细描述
简介
这是另一个机械化实现,旨在为开发人员提供 功能:
- It can be proxified
- It does proxy balancing
- It fakes user agent ^{tt1}$
- It does not handle robots ^{tt1}$
- There is a ‘real” modification which uses an underlying moz repl server to control a distance firefox instance
它使用sys.prefix/etc/config.ini和部分[collective.anonymousbrowser]进行设置:
[collective.anonymousbrowser] proxies= ; for a mozrepl server host = localhost port = 4242 firefox = /path/To/Firefox ff-profile = /path/to/FFprofile
此文件是在第一次运行时生成的,没有代理。这是你自己的饲料与一些开放的代理。
当然,它可能需要另一个配置文件,请参阅uuinit_uuu方法。
待办事项
- lxml集成,可能窃取z3c.etestbrowser
测试和手册
首先,我们需要实例化我们来自的源:
>>> from collective.anonymousbrowser.browser import Browser, FF2_USERAGENT
用户代理
哦,天哪,我们默认有一个全新的用户代理:
>>> br = Browser() >>> br.open('http://localhost:45678') >>> FF2_USERAGENT in br.contents True >>> br2 = Browser('http://localhost:45678') >>> FF2_USERAGENT in br2.contents True
代理模式
但是,我们想匿名,我们会设置一个代理 定义这些代理,只不过是一个配置文件,比如:
[collective.anonymousbrowser] proxies = host1:port host2:port
当浏览器有很多代理定义时,它会很快地通过这些代理。 但是,它不会不确定地使用同一个主机,只需设置proxy_max_use参数:
>>> from StringIO import StringIO >>> from tempfile import mkstemp >>> __, config = mkstemp() >>> open(config, 'w').write("""[collective.anonymousbrowser] ... proxies = ... 127.0.0.1:45675 ... 127.0.0.1:45676 ... 127.0.0.1:45677 ... 127.0.0.1:45678 ... 127.0.0.1:45679 ... """) >>> b = Browser(config=config, proxy_max_use=3) >>> b._config._sections {'collective.anonymousbrowser': {'__name__': 'collective.anonymousbrowser', 'proxies': '\n127.0.0.1:45675\n127.0.0.1:45676\n127.0.0.1:45677\n127.0.0.1:45678\n127.0.0.1:45679'}} >>> b.proxies ['127.0.0.1:45675', '127.0.0.1:45676', '127.0.0.1:45677', '127.0.0.1:45678', '127.0.0.1:45679'] >>> b.proxified True >>> b.open('http://localhost:45678') >>> 'Host: localhost:45678' in b.contents True >>> b._lastproxy['count'] == 1 and b._lastproxy['proxy'] in [0,1,2,3,4] True
我们也可以有一个普通的未经授权的浏览器
>>> b1 = Browser(proxify=False) >>> b1.proxified False
接下来要验证的是我们的伪随机循环是否在运行 第一件事是我们将选择第二个代理的2倍,然后选择第三个 当然,我们将设置mocker来更改每行的代理。
>>> import mocker >>> import random >>> mocked = mocker.Mocker() >>> custom_random_int = mocked.replace('random.randint') >>> custom_random_int(0, 4) <mocker.Mock ... >>> mocked.result(2) >>> custom_random_int(0,1) <mocker.Mock ... >>> mocked.result(0) >>> custom_random_int(0, 4) <mocker.Mock ... >>> mocked.result(2) >>> custom_random_int(0,1) <mocker.Mock ... >>> mocked.result(0) >>> custom_random_int(0, 4) <mocker.Mock ... >>> mocked.result(2) >>> custom_random_int(0,1) <mocker.Mock ... >>> mocked.result(0) >>> custom_random_int(0, 4) <mocker.Mock ... >>> mocked.result(3) >>> custom_random_int(0,1) <mocker.Mock ... >>> mocked.result(0) >>> custom_random_int(0, 4) <mocker.Mock ... >>> mocked.result(4) >>> custom_random_int(0,1) <mocker.Mock ... >>> mocked.result(0) >>> custom_random_int(0, 4) <mocker.Mock ... >>> mocked.result(2) >>> custom_random_int(0,1) <mocker.Mock ... >>> mocked.result(0) >>> custom_random_int(0, 4) <mocker.Mock ... >>> mocked.result(1) >>> custom_random_int(0,1) <mocker.Mock ... >>> mocked.result(0) >>> mocked.replay() >>> b = Browser('http://localhost:45678', config=config, proxy_max_use=3) >>> b.open('http://localhost:45678') >>> b._lastproxy {'count': 1, 'proxy': 2} >>> b.open('http://localhost:45678') >>> b._lastproxy {'count': 2, 'proxy': 2} >>> b.open('http://localhost:45678') >>> b._lastproxy {'count': 3, 'proxy': 2} >>> b.open('http://localhost:45678') >>> b._lastproxy {'count': 1, 'proxy': 0} >>> b.open('http://localhost:45678') >>> b._lastproxy {'count': 1, 'proxy': 3} >>> b.open('http://localhost:45678') >>> b._lastproxy {'count': 1, 'proxy': 4} >>> b.open('http://localhost:45678') >>> b._lastproxy {'count': 1, 'proxy': 2} >>> b.open('http://localhost:45678') >>> b._lastproxy {'count': 1, 'proxy': 1} >>> mocked.restore()
如果代理死了,我们将它们从列表中删除:
>>> __, config = mkstemp() >>> open(config, 'w').write("""[collective.anonymousbrowser] ... proxies = ... 127.0.0.1:35675 ... 127.0.0.1:35676 ... 127.0.0.1:35677 ... 127.0.0.1:45678 ... """) >>> mybrowser = Browser(config=config, proxy_max_use=3) >>> mybrowser.proxies ['127.0.0.1:35675', '127.0.0.1:35676', '127.0.0.1:35677', '127.0.0.1:45678'] >>> mybrowser.open('http://localhost:45678') >>> mybrowser.proxies ['127.0.0.1:45678'] >>> mybrowser.proxies = ['127.0.0.1:34785'] >>> mybrowser.open('http://localhost:45678') Traceback (most recent call last): ... Exception: There are no valid proxies left
循环受递归保护。如果我们总是返回同一个主机,则选择器不能选择任何其他主机。 它将循环,直到崩溃或处理递归:
>>> def randomint(a,b): ... return 2 >>> import random; random.randint = randomint >>> b2 = Browser(config=config, proxy_max_use=3) >>> b2.proxy_max_use 3 >>> b2._lastproxy['count'] 0 >>> b2.chooseProxy() '... >>> b2._lastproxy['count'] 1 >>> b2.chooseProxy() '... >>> b2._lastproxy['count'] 2 >>> b2.chooseProxy() '... >>> b2._lastproxy['count'] 3 >>> b2.chooseProxy() '... >>> b2.chooseProxy() Ho, seems we got the max wills to choose, something has gone wrong '127.0.0.1:35675'
通过mozrepl实现真正的浏览器
待办事项:
Handle configuration with mozrunner for:
- user agent faking
- proxies management
首先,我们需要实例化我们来自的源:
>>> from collective.anonymousbrowser.real import *
在配置文件的[Collective.AnonymousBrowser]部分中 可以添加这些参数:
- ^{tt4}$ : host of firefox mozrepl instance
- ^{tt5}$ : port of firefox mozrepl instance
- ^{tt6}$ : path to the firefox binary
- ^{tt7}$ : path to the firefox profile to use
开始在我们的小http服务器上使用它:
>>> b = Browser('http://localhost:45675') >>> b.contents '<html>...<pre>...localhost:45675...</pre>...</html>' >>> b.open('http://localhost:45675') >>> b.contents '<html>...<pre>...localhost:45675...</pre>...</html>'
用它的配置从浏览器实例中杀死任何已启动的firefox 设置:
>>> b.stop_ff() >>> b.start_ff() <mozrunner.runner.Firefox object at ...> >>> b.restart_ff() <mozrunner.runner.Firefox object at ...>
清理:
>>> b.stop_ff()
历史记录
0.10-<;0.11
- 0.9的错误修复
0.9
- 修复二进制发行版,现在使用一个示例decorator,mozrunner执行 它在firefox目录中的命令
0.8
- js执行错误修复
0.7
- 修正:当你调用open时,firefox就启动了…这更好。
0.6
- 文档+错误修复
- 使用TestRunner处理Firefox实例
- 验证代理代码
- 添加测试
0.4
- 文档+错误修复
0.3
- 添加错误消息
0.2
- 添加代理回退功能
0.1
- 初始版本