基于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

  • 初始版本

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
多线程Java可运行接口解决方案   java指向这些方法的uri是什么样子的   java处理:一个对象忽略if语句   在DispatcherServlet中找不到URI为[***]的HTTP请求的java映射   java Weka未启动。只有黑屏消失了   java如何根据对象的一个属性对对象数组进行排序?   eclipse在Kotlin注释参数中使用java常量   用于截锥剔除的java截锥未正确创建   java如何让多个活动使用相同的跟踪活动?   通过安卓的woocommerce api中的java错误Url   来自另一个文件的JSTL中每个循环的java   java使用安卓应用程序中的数据库保存gps位置   Java中比较linkedHashMap值和字符串的类型转换   在java中,有没有一种方法可以从一开始就使用Kafka流(而不是通过KafkaConsumer)读取消息?   使用jmonkeyengine在安卓上运行basicgame的java疑难解答   java中的millis字符串格式   Java泛型、反射API和JDBC:无法映射Java。朗和爪哇。sql。类型的时间戳   java在DynamoDB中以历元格式自动填充时间