Makina Corpus 开发的 zope.testbrowser 扩展,具有用户代理伪造和代理功能
项目描述
简介
这个 Yet-Another-Mechanize 实现旨在为开发者提供以下新功能
它可以被代理
它可以进行代理均衡
它默认伪造用户代理
它默认不处理机器人
有一个“真实”的修改,它使用底层的 moz repl 服务器来控制一个远程 firefox 实例
它使用 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
此文件在首次运行且没有代理的情况下生成。您可以自己提供一些公开代理。
当然,它可以取另一个配置文件,请参阅 __init__ 方法。
致谢
待办事项
lxml 集成,可能复制 z3c.etestbrowser
测试和手册
首先,我们需要实例化我们来源的地方
>>> from collective.anonymousbrowser.browser import Browser, FF2_USERAGENT
用户代理
哦,我的天哪,我们有一个全新的默认用户代理
>>> br = Browser() >>> br.open('https://#:45678') >>> FF2_USERAGENT in br.contents True >>> br2 = Browser('https://#:45678') >>> FF2_USERAGENT in br2.contents True
代理模式
但是,我们想要匿名,我们将设置一个代理。要定义这些代理,只需一个 config.ini 文件,例如
[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('https://#: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
接下来要验证的是我们有一个伪随机循环正在运行。首先,我们将选择第二个代理,然后是第三个。当然,我们将设置模拟器在每个行上更改代理。
>>> 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('https://#:45678', config=config, proxy_max_use=3) >>> b.open('https://#:45678') >>> b._lastproxy {'count': 1, 'proxy': 2} >>> b.open('https://#:45678') >>> b._lastproxy {'count': 2, 'proxy': 2} >>> b.open('https://#:45678') >>> b._lastproxy {'count': 3, 'proxy': 2} >>> b.open('https://#:45678') >>> b._lastproxy {'count': 1, 'proxy': 0} >>> b.open('https://#:45678') >>> b._lastproxy {'count': 1, 'proxy': 3} >>> b.open('https://#:45678') >>> b._lastproxy {'count': 1, 'proxy': 4} >>> b.open('https://#:45678') >>> b._lastproxy {'count': 1, 'proxy': 2} >>> b.open('https://#: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('https://#:45678') >>> mybrowser.proxies ['127.0.0.1:45678'] >>> mybrowser.proxies = ['127.0.0.1:34785'] >>> mybrowser.open('https://#: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实现真实浏览器功能
待办事项
使用mozrunner处理配置
用户代理伪装
代理管理
首先,我们需要实例化我们来源的地方
>>> from collective.anonymousbrowser.real import *
在您的配置文件中的[collective.anonymousbrowser]部分,您可以添加以下参数
主机:firefox mozrepl实例的主机
端口:firefox mozrepl实例的端口
firefox:firefox二进制文件的路径
firefox-profile:要使用的firefox配置文件路径
开始在我们的小型http服务器上使用它
>>> b = Browser('https://#:45675') >>> b.contents '<html>...<pre>...localhost:45675...</pre>...</html>' >>> b.open('https://#: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的bug修复
0.9
修复二进制分发,现在使用示例装饰器,mozrunner在firefox目录中执行其命令
0.8
js执行bug修复
0.7
bug修复:当您调用open…时启动firefox,这更好。
0.6
文档+bug修复
使用testrunner处理firefox实例
强化代理代码
添加测试
0.4
文档+bug修复
0.3
添加错误消息
0.2
添加代理回退功能
0.1
初始发布
项目详情
collective.anonymousbrowser-0.11.zip的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 7bdb3e830e579bae31abf235b718fbd509dde5282c205001eeb0b857f55e7dd4 |
|
MD5 | 25796a3db8c6032add7ce309019801a9 |
|
BLAKE2b-256 | 43818219cef6ca8ec60d7b463e0ec8409bc10fe3bfbf3e1b3bf871ffe226ebd2 |