首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Coding
V2EX  ›  Python

如何在 Python 中连接 SS 服务器进行网页抓取?

  •  
  •   eq06 · 27 天前 · 2083 次点击

    是这样,我订阅了一个 SS 服务商的服务,提供 10 个 SS 服务器节点供使用,但是 1 我要抓取的网站本身有反爬虫机制,有一定概率封 IP 2 这 10 个节点未必都能用 3 这 10 个 ss 服务器节点同一时间只能使用其中一个,不能同时用两个 我想用 Python 爬取某个网站的网页,希望走 ss 代理;每次脚本选其中一台 ss 服务器作为代理,抓取目标网站的网页;如果 10 秒钟未返回结果( ss 服务器被目标网站防火墙拦截,或 ss 服务器本身被墙不可用),则切换到另一台 ss 服务器作为代理,尝试抓取。 请问 python 中有什么库可以连 ss 服务器作为代理?

    40 回复  |  直到 2019-11-15 21:12:18 +08:00
        1
    rebeccaMyKid   27 天前
    不会谷歌?
    https://stackoverflow.com/questions/12601316/how-to-make-python-requests-work-via-socks-proxy

    keywords: python requests socks

    另外,在 ubuntu 下的 terminal 里面,我没记错的话,你 export xxxx 那个 terminal 环境变量,requests 库会自动走那个。 你可以发请求到 https://httpbin.org/ip,检查 response 是不是走了 ss 服务的 ip
        2
    eq06   27 天前
    @rebeccaMyKid Python 的 request 模块你用过的吧,只支持 http 和 socks 协议的代理,本身是不支持 ss 协议的。你开着人家编译好的 ss 客户端,提供 socks 代理给 python 用,当然也是一种思路,那么 python 发现连不上目标网站的时候,如何控制你电脑上的 SSR,V2rayN 切换 ss 服务器呢?
        3
    RickyHao   27 天前 via Android
    @eq06 你可以用 python 去控制 ss 啊,比如 python 版的 ss
        4
    eq06   27 天前
    @RickyHao 有吗?没找到这样的项目。
        5
    biu7   27 天前 via Android
    github 搜一下 python 版的 ss client,是有的
        6
    ik   27 天前 via iPhone
    先转成 socks5 或者 http 代理 再用, 如果可以用 windows 客户端,客户端自带负载均衡。

    另 10 条线路也太少了
        7
    eq06   27 天前
    @ik Windows 客户端只管你的 ss 服务器能连上,ss 服务器被目标网站防火墙拉黑了,它能检测出来吗?
        8
    eq06   27 天前
    @biu7 是有一个,进去 404 了
        9
    ClericPy   27 天前
    以前通用的做法是本地 SS client 启动以后, 再用个转 http 的工具做一层代理
    现在直接无脑挂不行吗
        10
    neteroster   27 天前
    Clash + API 控制节点切换
        11
    wangyzj   27 天前
    去淘宝买个可换 IP 的 vps
    然后挂 ss 开搞
        12
    eq06   27 天前
    @wangyzj 我要是有可换 IP 的 VPS 还需要 ss 干什么。无非是正好有 ss,顺道用来做爬虫
        13
    eq06   27 天前
    @ClericPy ss client 和转 http 工具都无法满足我切换节点的需要
        14
    wangyzj   27 天前
    @eq06 墙内的那就直接去淘宝吧,稳
        15
    ClericPy   27 天前
    @eq06 #13 我上班时候用别人旧代码, 就是这种方式, 无法想像我要做验活和自动切换加重启折腾了多少无用功......
    其实... 我更关心我现在用的 SSR 不能自动批量测速, 每次都要挨个点一下然后断开所有连接再去刷新网页试试... 找了挺久没轮子, 又不想自己撸
        16
    eq06   27 天前
    @neteroster 我做爬虫本身就会监视目标网站是否能访问,进而判别当前线路 ( python 到 ss 客户端到 ss 服务器再到目标网站)是否通。目前卡在如何控制 ss 客户端切换线路。windows 桌面版 ss 客户端好像没有这样的 API
        17
    lithiumii   27 天前 via Android
    装一个 SS 客户端,SS 的客户端就是在本地你配置的端口(比如 127.0.0.1:1080)建立一个 socks5 代理,然后你把这个地址填到需要填 socks5 参数的地方就行了
        18
    eq06   27 天前
    @lithiumii 比如,我要爬取伦伦敦证券交易所的行情,我购买了一个 ss 服务商的服务,给我 20 个节点,其中一半根本连不上;按你的方法,装一个 SS 客户端,SS 的客户端就是在本地你配置的端口(比如 127.0.0.1:1080)建立一个 socks5 代理,然后我把这个地址填到需要填 socks5 参数的地方,也就是 Python 的 requests 模块的连接函数中,发现连不上 ( ss 服务器本身不可用,或者 ss 服务器因为频繁访问伦交所网站,ss 服务器的 IP 被伦交所网站防火墙列入黑名单阻拦了),我的 Python 程序如何调用你说的“SS 客户端”的 API,让这个客户端切换到另一个 SS 服务器?
        19
    eq06   27 天前
    @wangyzj 做爬虫都会遇到反爬机制,被对方服务器防火墙拦截,比如银行间外汇交易中心的反爬一直很严格,上交所债券平台最近也加强了反爬机制。一旦被列入黑名单,IP 在短时间内就废了。我需要买多少台 VPS 切换来用呢?
        21
    neteroster   27 天前 via Android   ♥ 1
    @eq06 我说了 Clash,它提供了 API 切换节点,就是你想要的。
        22
    crysislinux   27 天前 via Android
    其实不复杂的,直接用 Python 用不同的参数启动一批 ss 进程,发现哪个慢就直接 kill 了就是。调度算法看你自己怎么写,但是这个跟 ss 本身关系不大
        23
    eq06   27 天前
    @neteroster 谢谢,我看了下,是提供 API 的,如果 ss 的各种加密混淆参数都支持的话,应该是能满足要求。 https://github.com/Dreamacro/clash
        24
    eq06   27 天前
    @wangyzj 谢谢,不过超预算了。公司给报销的话可以考虑。不知道他们开不开发票。
        25
    cepczkd   27 天前
    我们项目现在就是这么做的,用 sslocal 挂本地客户端,获得一个本地端口,支持 socks5 的话直接走 127.0.0.1:port 就能使用对应的代理了。一台机器支持多个 sslocal,给不同端口号即可。如果只能走 http 代理,就用 3proxy 之类的,转发 http 协议到本地对应的 socks5 端口即可。
        26
    ljpCN   27 天前 via Android
    https://github.com/imWildCat/scylla
    免费代理 ip
    docker 一行命令完事
    何必折腾 ss,总共才几个 IP
        27
    ljpCN   27 天前 via Android
    @ljpCN append
    如果你是要爬需要科学上网的网站,当我没说
        28
    imn1   27 天前
    我建议你用 ss 作为前置代理+洋葱,这样网站只能获取洋葱的 ip,封洋葱没用的
    不过如果对方用 cloudflare 做 cdn 就悲催了,cf 遇到洋葱要验证码
        29
    rebeccaMyKid   27 天前
    @eq06 我的,没看清楚问题 :(
        30
    rebeccaMyKid   27 天前
    那能不能这样,你服务器直接开 10 个 ss server,然后哪个通连哪个
        31
    lithiumii   27 天前
    @eq06 懂了。提供一点愚蠢的思路:
    思路一:有的 ss 客户端支持连多个代理到多个本地端口,比如你服务商给 20 个节点,本地就起 20 个端口,比如 1080~1099,剩下的你程序里自己判定。不支持的也没关系,ss 可以多开的。浪费一点内存和处理器资源而已。
    思路二:用命令行的 ss 客户端,用 python 的 subprocess 控制命令行
        32
    lukic   27 天前
    废这个力气,为什么不直接部署海外节点?
        33
    ik   27 天前 via iPhone
    @eq06 既然都开了负载均衡。还被反爬,那是不是应该考虑是不是代理太少了,或者是爬虫特征太明显了。

    当然也确实不能排除我前面给的方案有问题。
        34
    ik   27 天前 via iPhone
    或者每个代理对应一个本地端口, 找到反爬特征检测到被反爬就下一个端口呗
        35
    whwlsfb   27 天前 via Android
    使用 haproxy 前置配置好 TCP 负载均衡,只需要启动一个 sslocal 连接到 haproxy 的下联端口,python 里连接到 sslocal 就好了
        36
    easonHHH   27 天前
    win 下面支持多开 ss client,其它系统没试过,多开 client 来监听不同的端口,在端口 1 连接失败的情况下自动切换端口 2 的 sock5 监听,就是不知道 10 个 client 服务占用多少资源了
        37
    Latin   27 天前
    $ pip install requests[socks]
    安装好依赖以后,使用 SOCKS 代理和使用 HTTP 代理一样简单:

    proxies = {
    'http': 'socks5://user:[email protected]:port',
    'https': 'socks5://user:[email protected]:port'
    }
        38
    eq06   26 天前
    @ik 负载均衡对反爬是无效的,你访问目标网站,被防火墙拦截,会进入一个提示页面,而不是连接失败。在 SS 客户端看来你就是连接成功的,不需要切换 ss 节点。
        39
    eq06   26 天前
    @Latin 你见过哪个 ss 客户端,连 20 台 ss 服务器就在本地同时开 20 个端口的吗
        40
    snoopygao   26 天前
    1、自己买一个靠谱的 VPS 一劳永逸;
    2、在本地搭中转站,直接开 10 个 SS 连接,haproxy 负载均衡,python 检测端口可用性,不可用就杀掉
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4079 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 26ms · UTC 09:29 · PVG 17:29 · LAX 01:29 · JFK 04:29
    ♥ Do have faith in what you're doing.