跳转到主要内容

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__ 方法。

致谢

makinacom

待办事项

  • 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 (21.4 kB 查看散列)

上传时间

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面