pythonでプロキシのリストを取得する
CyberSyndromeからプロキシのリストを取得します。カテゴリを指定すると
- ホスト名
- カントリーコード
- ポート番号
- ランク
を要素に持つ辞書のリストを返します。
使い方:proxy_list関数にカテゴリを渡す。それだけ。
from proxy_list import proxy_list category = ["speed", "anonymous", "nonanonymous", "squid"] for cat in category: print "categoty:",cat for x in proxy_list(cat): print "\t","\t".join([x[n] for n in x.keys()])
以下、コード本体
#! /usr/bin/env python # coding: utf-8 import re import urllib2 pattern = "<li><a title=\"(?P<countrycode>..)\" onmouseover=\"s\('..'\)\" onmouseout=\"d\(\)\" class=\"(?P<rank>.)\">(?P<host>[^:]*):(?P<port>[^>]+)</a></li>" def url_mapper(category): host = "http://www.cybersyndrome.net" speed = "/plr4.html" anonymous = "/pla4.html" nonanonymous = "/pld4.html" squid = "/pls4.html" req_dict = { "speed":speed, "anonymous":anonymous, "nonanonymous":nonanonymous, "squid":squid, } return host + req_dict[category] def proxy_list(category): """プロキシリストを返す proxylist::{host, port, rank, countrycode} data rank = A | B | C | D A:環境変数を付加しない B:環境変数を付加する C:クライアントと無関係なIPアドレスを付加する D:クライアントのIPアドレスを付加するプロキシ """ opener = urllib2.build_opener() url = url_mapper(category) lines = opener.open(url).readlines() x = 0 for num,line in enumerate(lines): if line == "<ol>\n": x = num break lst = re.findall(pattern, lines[x+1], re.I) # ignore case d = ["host", "port", "rank", "countrycode"] lst = [dict(zip(d, [x[2],x[3],x[1],x[0]]))for x in lst] return lst def pp_list(proxy_lst): """pretty print proxy list""" print "-"*70 print "host\tport\trank\tcountrycode" print "-"*70 for x in proxy_lst: print "\t".join([x["host"], x["port"], x["rank"], x["countrycode"]]) def test_all(): """test all""" lst = ["speed", "anonymous", "nonanonymous", "squid"] def p(x): print x map(lambda x:p(x) or pp_list(proxy_list(x)), lst) def main(): #test_all() pp_list(proxy_list("anonymous")) if __name__ == '__main__': main()
実行例)anonymousのランクAを表示する
なぜかワンライナー
$ python -c "import proxy_list; proxy_list.pp_list([x for x in proxy_list.proxy_list('anonymous') if x['rank']=='A'])" ---------------------------------------------------------------------- host port rank countrycode ---------------------------------------------------------------------- 212.110.124.68 80 A DE proxy.cjb.net 8118 A CA n3.hu 6588 A HU 161.132.144.66 808 A PE se01.se.live.cds.dr.dk 80 A DK se01.se.livedr1qt.cds.dr.dk 80 A DK