最近项目中需要写爬虫,需要爬openrice,其中有一些tips需要记录一下。

tor and polipo

Tor

tor是一个socks5代理工具,可以实现匿名访问网页,本质其实是利用了分布在世界各地的一些肉机做请求转发。

tor有两部分,tor和ControlPort,他们都需要在tor/config下手动配置:

  • tor,一般绑定在9050端口,socks5代理服务器,如果在mac下,可以通过brew下载并通过brew services进行管理
  • ControlPort,一般绑定在9051端口,用来管理本地的tor,在python下用TorCtl包来操作。开启前要通过tor –keygen设置passphrase

在linux下可以用lsof -i:port-num来查看有没有正确开启这两个服务。

可以通过Control向tor发送不同的signal的方式来实现对tor的管理,例如获取新ip可以

1
2
3
def getNewIp():
conn = TorCtl.connect(controlAddr="127.0.0.1", controlPort=9051, passphrase="my password")
conn.send_signal("NEWNYM")

Polipo

由于tor是通过sock5代理的,但实际使用的很多python库只支持http/https代理,例如requests、urllib3等,这样需要一个web服务器来进行转化。polipo就是这样的工具。

mac端可以通过brew来下载和管理polipo,但polipo的config不会自动生成,需要我手动去/usr/local/etc下mkdir polipo文件并自己写config,我的config如下

1
2
3
4
5
proxyAddress = "::0"
allowedClients = 127.0.0.1, 192.168.1.0/24
proxyAddress = "0.0.0.0"
socksParentProxy = "localhost:9050"
socksProxyType = socks5

这里一个坑是我刚开始在polipo的config里没有写proxyaddress = “0.0.0.0”,会有很多问题

polipo默认绑定端口是8123,如果成功开启,在python可以通过

1
2
3
4
5
6
proxy_manager = urllib3.ProxyManager(
'http://127.0.0.1:8123',
timeout=urllib3.Timeout(connect=10, read=10),
retries=urllib3.Retry(5),
maxsize=5
)

proxy_manager可以正常访问web页面,但是速度较慢。

Pyhusky

可以通过husky的map来运行下载任务,提高分布式效率。

首先需要在本地启动husky的master和daemon任务(目前遗留了一个问题:每个任务只能跑一次,第二次跑不了?),然后在python通过

1
2
3
env.pyhusky_start('127.0.0.1', 20000)
pages = env.parallelize(url_list)
tuple = pages.map(lambda url: mapper_process(url)).collect()

来运行的,注意这里有一个坑是parallelize分成几份会由master config的 [worker] 下的配置决定的,所以如果发现本机只跑了所有任务的一半或三分之一,就去check一下husky的master config有无问题。