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