我正在使用多处理编写Python脚本,这将产生多个进程。它使用mechanize模块访问网页。我想匿名这样做,所以我使用Tor浏览器作为代理。此外,每个进程应每隔十五秒对其IP进行加扰。
我找到了这个,这可能有用: http://blog.databigbang.com/distributed-scraping-with-multiple-tor-circuits/ 但是,这个问题的主要问题是它使用的是Urllib2,而不是机械化,而且它似乎不易于机械化。另外,这使用线程而不是进程,所以我不知道它是否会以相同的方式工作。
简而言之,我的Tor设置为具有多个具有不同IP的不同端口,我可以将其设置为每个进程使用特定端口,但是,我无法将其设置为每个进程使用不同的Tor端口(即通过Tor有自己的单独连接)。我需要找到一种不需要切换端口的切换IP的新方法,但是一旦我找出每个进程的各个连接,这将更容易找出。
我的简化代码:
from mechanize import Browser
import multiprocessing
basePort = 9048 #base port for Tor. I also have the following ports enabled: 9049, 9050, 9051, 9052.
class Worker(multiprocessing.Process):
def __init__(self):
multiprocessing.Process.__init__(self)
self.browser = Browser()
#somehow setup a unique connection to the Tor server? The port to use is stored in the name.
def Attempt(argument):
browser = multiprocessing.current_process().browser
#process argument using mechanize
#if some condition met:
#somehow scramble IP
def main():
global basePort
f = open(file, 'rb')
for i in range(5):
Worker(target=Attempt, args=f.read().split(), name=str(basePort + i)).start()
if __name__=="__main__":
main()
以下是我用于设置端口以供所有进程使用的代码,但我不知道如何使其特定于单个进程。
import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
socket.socket = socks.socksocket
from mechanize import Browser
b = Browser()
print b.open('http://icanhazip.com').read()
编辑:当我运行代码时,它说“TypeError: init ()得到一个意外的关键字参数'args'”。但是Process类将args作为关键字,为什么这不起作用呢?