入門:用Python抓取網頁上的免費賬號(一)

現在用socks的人應該是越來越多了,最近一年來,這個優秀的工具有更多的人fork新的開源項目,其設計思想也影響了很多類似的工具。現在網上的免費賬號也好像是越來越多了,有一小部分是服務商提供的免費體驗賬號,有些是一些不知名的雷鋒分享的。

我用了一年多免費賬號了,感覺還可以,我很少有看1080P視頻直播或下載大文件,只是看看非死不可,看看youtube上480P圍棋講解視頻也夠清晰了,訪問gmail更不是問題。實際上,不繁忙的時候,看1080P也是可以的。

使用免費賬號有一些小煩惱,主要是一般是3天或1天就需要更新一次,有些網頁上賬號甚至6小時更新一次。有些網頁上有多達50多個免費賬號,經過測試,70%可用。

所以,我希望有程序自動從指定的網頁上抓取幾十個賬號信息,然後測試可用性,找出時延較小的前5個賬號,更新到ss的配置文件gui-config.json中,然後重啟ss.exe進程,讓新的配置生效。這樣一來,我就無需手動測試賬號的可用性,手動配置或掃二維碼,每天運行一個Python腳本,幾分鐘內就刷新好配置,隨時可以訪問Google了。這個願望已經實現了,為此寫了幾百行Python代碼。

這個系列的文章將分享一些相關的經驗和代碼,寫代碼過程中參考了一些網上分享的文章,當然最重要的是有Google搜索。

轉入正題

分享免費賬號的網頁有很多,格式也多種多樣,其實將精力集中在那些包含ss://... 或ssr://...這種url的網頁就好了,服務商提供的免費體驗賬號訪問速度往往還不如雷鋒分享出來的賬號,服務商的網頁Page source往往不含ss://... 或ssr://...這樣的url。

ss://... 或ssr://...這樣的url是可以直接用來生成QR code的,socks客戶端只要不是非常老的版本都支持掃碼添加賬號配置。SS QR Code Scheme可以參見以下鏈接。

我另一篇文章提供了一個生成QR Code的Python腳本。

如果你還沒安裝Python,可以到以下鏈接下載安裝Python 2.7.xx for Windows

Python Releases for Windows

在Windows上安裝Python 2.7過程中所有安裝選項都選上,包括Add python.exe to Path這個選項。安裝好Python後,還需要安裝lxml和requests這兩個Python Module

在命令行窗口執行

python -m pip install requestspython -m pip install lxml

如果沒有報錯,Module應該就是安裝成功了

然後你可以在CMD.exe命令行窗口執行 python,進入python提示符>>>後嘗試import requests, lxml這兩個模塊,Ctrl+z然後加回車就可以退出python提示符狀態。

編輯Python程序我喜歡用Sublime Text 2,免費版在這 https://sublimetext.com/2

Sublime Text 2編輯效果是這樣的

最後,再次在命令行窗口執行python命令,然後敲入以下命令,就可以觀察到ss://...這樣的鏈接已經獲取到了。

# Coding = UTF-8import requestsfrom lxml import htmlpage = requests.get(http://gdmi.weebly.com/31185233981997832593.html)webpage = html.fromstring(page.content)#上面這一行是用lxml.html.fromstring解析網頁link_list=webpage.xpath(//a/@href) #上面這一行就是抓出所有links,xpath這個方法還可以抓其他內容,很強大type(link_list) #可以看到link_list的數據類型就是列表link_list #最後查看抓取到的Links,其中有一些links不是我們需要的ss url或ssr url

不是所有的網頁用這個方法得到的list成員都是這樣的字元串格式,不同的網頁是不一樣的,所以後續處理這些字元串需要略有不同的。

如果你認真看了上面提到的QR Code Scheme鏈接,就知道這些字元串實際上是base64編碼的,解碼也很簡單,解碼和編碼的實際例子就可以參考我另一篇文章。

用Python自帶的base64模塊解碼後就可以看到明文的賬號信息了,包括server地址、埠、加密方式、密碼,如果是ssr的URL,還有協議和混淆這兩項信息。

比如說,對於以下這個ssr url

ssr://MTA3LjE3Mi4xNDUuMTU1OjIzMzM6YXV0aF9jaGFpbl9hOm5vbmU6cGxhaW46Wkc5MVlpNXBiekl6TXpNPS8/cmVtYXJrcz01cHlzNVlXTjZMUzVVMU12VTFOUzZMU201WSszNXAybDZJZXFPbVJ2ZFdJdWFXOHZjM042YUdaNENnPT0=

需要解碼的是去除了"ssr://"之後的字元串:

MTA3LjE3Mi4xNDUuMTU1OjIzMzM6YXV0aF9jaGFpbl9hOm5vbmU6cGxhaW46Wkc5MVlpNXBiekl6TXpNPS8/cmVtYXJrcz01cHlzNVlXTjZMUzVVMU12VTFOUzZMU201WSszNXAybDZJZXFPbVJ2ZFdJdWFXOHZjM042YUdaNENnPT0=

實際上"/"後面的用不上,因為據我觀察,免費賬號從來不會包含obfs parameter、protocol parameter這樣的參數,這樣的參數在免費賬號中從來都是空字元串""。

所以真正需要解碼的字元串僅僅是:

MTA3LjE3Mi4xNDUuMTU1OjIzMzM6YXV0aF9jaGFpbl9hOm5vbmU6cGxhaW46Wkc5MVlpNXBiekl6TXpNPS8

如果你有Unix或cygwin環境,用base64命令就可以解碼,base64命令有可能顯示出解碼結果但同時報錯 "輸入無效" ,可以嘗試在字元串後增加一到三個 "=" 字元,那是base64編碼規範中的Padding(填充字元)。效果見下圖

請注意,ssr url中Password是需要二次解碼的,ss url中Password就沒這個需要,下圖中doub.io2333才是真正的密碼。

字元串第一次解碼結果:

107.172.145.155:2333:auth_chain_a:none:plain:ZG91Yi5pbzIzMzM=/

對密碼部分做第二次base64解碼,結果變成如下:

107.172.145.155:2333:auth_chain_a:none:plain:doub.io2333

這個明文,以 ":" 為分隔符,各個欄位以server:server_port:protocol:method:obfs:password這樣的次序出現。如果是ss url,只需一次base64解碼就得到method:password@server:server_port這樣的結果。其中server是指server ip address,method是加密方式encryption method,obfs是混淆,protocol是協議。

如果用Python來實現base64解碼,雖然我另一篇文章已經有示例,這裡還是給出一個示範代碼:

ssurl=ssr://MTA3LjE3Mi4xNDUuMTU1OjIzMzM6YXV0aF9jaGFpbl9hOm5vbmU6cGxhaW46Wkc5MVlpNXBiekl6TXpNPS8/cmVtYXJrcz01cHlzNVlXTjZMUzVVMU12VTFOUzZMU201WSszNXAybDZJZXFPbVJ2ZFdJdWFXOHZjM042YUdaNENnPT0=ssurl_string=ssurl[6:]import base64decoded_string=base64.urlsafe_b64decode(ssurl_string)password_string=ZG91Yi5pbzIzMzM=decoded_password=base64.urlsafe_b64decode(password_string)

至此,我們已經得到了正確上網的賬號信息,只是這些賬號信息未經連通性測試證實可用。

未完待續

免費賬號信息ssr url的解碼

入門:用Python抓取網頁上的免費賬號(一) - 知乎專欄

AutoSs開源項目介紹

入門:用Python抓取網頁上的免費賬號(二) - 知乎專欄

ssa.py程序運行效果

入門:用Python抓取網頁上的免費賬號(三) - 知乎專欄

ssa.py自動測試免費賬號程序的起源

入門:用Python抓取網頁上的免費賬號(四) - 知乎專欄

update_config.py的使用示例

入門:用Python抓取網頁上的免費賬號(五) - 知乎專欄

讀寫gui-config.json,重啟Shadowsocks客戶端的示例代碼

入門:用Python抓取網頁上的免費賬號(六) - 知乎專欄

獲取免費賬號、測試免費賬號、分發免費賬號的完整方案

入門:用Python抓取網頁上的免費賬號(七) - 知乎專欄

update_config.py自動更新免費賬腳本的介紹

入門:用Python抓取網頁上的免費賬號(八) - 知乎專欄

Mac OS X上的客戶端Shad0ws0cksX-NG使用plist格式的配置文件,而不是json格式的,能用腳本自動化更新賬號信息嗎?

入門:用Python抓取網頁上的免費賬號(九) - 知乎專欄

如何將含有免費賬號的json文件快速合併到當前ss客戶端的gui-config.json配置文件中

入門:用Python抓取網頁上的免費賬號(十) - 知乎專欄

使用update_config.pyc腳本你需要滿足的條件以及軟體安裝指南

入門:用Python抓取網頁上的免費賬號(A) - 知乎專欄

Mac OS X Shad0ws0cks客戶端plist配置文件轉換出來的json文件長這樣

入門:用Python抓取網頁上的免費賬號(B) - 知乎專欄

update_config.pyc整體方案介紹

入門:用Python抓取網頁上的免費賬號(C) - 知乎專欄
推薦閱讀:

ruby和python該學那一個?
使用文本挖掘實現站點個性化推薦
使用django開發一個上線標準的mooc網站(十一)
【量化基礎】Python獲取金融數據之Tushare

TAG:Python入門 | Python |