py脚本走ss代理科学上网

246 查看

描述

目的: 实现脚本运行过程中的科学上网

目前速度相当快且开源又方便便宜的代理方案就是shadowsocks了, 它属于socks5代理

socks5代理属于会话层的代理协议, 理论上只要是TCP/IP协议簇的协议都是可以代理, 因此自然可以代理http

这里很非常有必要提一下http代理, http协议本身是可以实现http代理的功能, 弄个服务器, 实现http的CONNECT方法就能将其当代理使用了. 所以呢, 用socks5这个本质上是用下层协议(会话层)实现了http协议(应用层)的代理, 注意区分

步骤

前提: 提供ss服务的服务器, 自己搭或者买别人的都可以, 并确保服务端能正常工作

首先去github上下一份ss的代码, 配好服务端的地址端口什么的, 然后以本地模式运行, 也就是本地监听转发, 默认端口1080

sudo sslocal shadowsocks-master/debian/config.json

接着就是让http通过ss连接到一些方校长不让你连的网站
最早试了一下requests, 它有提供proxy

import requests

proxies = {"http": "127.0.0.1:1080", "https": "127.0.0.1:1080"}
m = requests.get('https://youtube.com', proxies=proxies)
print m

可惜不work, 查看端口发现连接建立了, 但是一直像没响应那样卡着, 好像因为urllib3的问题不支持socks5, 有个支持socks5的分支requesocks

import requesocks as requests

proxies = {"http": "socks5://127.0.0.1:1080", "https": "socks5://127.0.0.1:1080"}
session = requests.session()
session.proxies = proxies
m = session.get('https://twitter.com')
print m.content

用这个请求谷歌的时候会卡在握手阶段, 并且代码也很久没维护了, 不推荐

或使用支持socks代理的PySocks就ok, 请求谷歌也ok

import urllib2
import socks
from sockshandler import SocksiPyHandler

opener = urllib2.build_opener(SocksiPyHandler(socks.SOCKS5, "127.0.0.1", 1080))
x = opener.open("http://www.youtube.com/")
print x.read()

作用

比如你有一个博客用了Google analyticsDisqus或者类似的, 需要连到外面. 如果你把这改成异步的, 让后端去发, 这样别人访问你博客的时候就不会那么慢了. 但是相关的数据还是得发到这些网站, 或者从它们那儿取数据, 这时我们就可以走ss代理实现自己想要的功能了, 撒花~