[
  {
    "path": "README.md",
    "content": "# SoccerBet\n一个研究足球彩票购买策略的小项目\n\n## 数据源\n各博彩公司的赔率数据来自于500.com，在运行程序后，从500.com实时抓取近期比赛数据，以及各比赛的赔率数据。由于500.com对于国外博彩公司的数据有延迟，所以在实际购买时还应该参照国外博彩公司官方网站公布的实时赔率。\n\n## 博彩策略\n该项目采取的博彩策略是利用不同博彩公司的赔率差，通过建立一个购买彩票的portfolio，获得盈利的彩票组合。\n\n## 程序入口\n请使用python执行项目中的main.py\n即在安装好python环境，确保接入互联网，执行 python main.py\n\n## 程序输出\n程序输出，程序会输出每场比赛的比赛信息，盈利百分比，以及应购买的彩票组合。\n例子如下：\n\n\t642471                                              //比赛代号\n\thttp://odds.500.com/fenxi/ouzhi-642471.shtml        //比赛信息页面\n\tmatch name:\t17亚冠杯分组赛                        //比赛名称\n\tmatch members:\t西悉尼漫步者 VS 浦和红钻               //交战双方\n\tmatch time:\t比赛时间2017-02-21 16:00             //比赛时间\n\tprofit:\t109.88                                      //按照下面的比例购买彩票，能够获得的收益109.88%，即盈利9.88%\n\twin:\t168 Pinnbet\t4.2\t27                  //从Pinnbet下注 27%的资金押胜 (其中168是公司id，Pinnbet是公司名称，4.2是赔率，27是押27%的资金)\n\tdraw:\t168 Pinnbet\t3.5\t32                  //从Pinnbet下注 32%的资金押平\n\tlose:\t26 Leon\t2.68\t41                          //从Leon下注 41%的资金押负\n"
  },
  {
    "path": "companyrank.rtf",
    "content": "{\\rtf1\\ansi\\ansicpg1252\\cocoartf1187\\cocoasubrtf370\n{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;\\f1\\fnil\\fcharset134 STHeitiSC-Light;}\n{\\colortbl;\\red255\\green255\\blue255;}\n\\margl1440\\margr1440\\vieww10800\\viewh8400\\viewkind0\n\\pard\\tx720\\tx1440\\tx2160\\tx2880\\tx3600\\tx4320\\tx5040\\tx5760\\tx6480\\tx7200\\tx7920\\tx8640\\pardirnatural\n\n\\f0\\fs24 \\cf0 1 176 Kajotbet 75.0083333333\\\n2 181 Islenskar Getraunir 80.1645945946\\\n3 173 Iceland 80.1689189189\\\n4 261 Sporttip 80.7978947368\\\n5 270 Supermatch 82.9346428571\\\n6 94 Betpeople 83.1669230769\\\n7 174 Iddaa 83.377037037\\\n8 177 Inteltek 83.4179310345\\\n9 285 Tipp3 83.7673076923\\\n10 200 Miseojeu 84.3452272727\\\n11 232 PMU 84.5666666667\\\n12 225 Parionsweb 85.3918367347\\\n13 144 France-pari.fr 85.578\\\n14 211 Norsk Tipping 85.9234545455\\\n15 212 Norway 85.9803846154\\\n16 204 Norsk tipting 86.0715217391\\\n17 206 Netbet.fr 86.0929411765\\\n18 213 Oddsen 86.1608108108\\\n19 76 BetClic.fr 86.1987037037\\\n20 79 BetClick.fr 86.2878846154\\\n21 223 Pamestihima 86.6271153846\\\n22 10 Oddset (\n\\f1 \\'b0\\'c2\\'b5\\'c2\\'c8\\'fc\\'cc\\'d8\n\\f0 ) 86.6733333333\\\n23 237 SAjOO.fr 87.2183333333\\\n24 32 Bwin.fr 87.2183333333\\\n25 300 Unibet.fr 87.5094230769\\\n26 236 SAjOO 87.6429268293\\\n27 142 Evobet 87.7243478261\\\n28 69 Betbright 87.7931666667\\\n29 138 E-stave 87.8838961039\\\n30 254 Sportna loterija 88.0257142857\\\n31 245 Singapore pools 88.4616\\\n32 297 Toto 88.86390625\\\n33 259 Sporttery 89.0075\\\n34 304 Veikkaus 89.0660416667\\\n35 21 \n\\f1 \\'cf\\'e3\\'b8\\'db\\'c2\\'ed\\'bb\\'e1\n\\f0  89.0822666667\\\n36 73 BGT 89.196\\\n37 5 Interwetten (\n\\f1 \\'d3\\'a2\\'cc\\'d8\n\\f0 ) 89.4026666667\\\n38 3 Ladbrokes (\n\\f1 \\'c1\\'a2\\'b2\\'a9\n\\f0 ) 89.4048571429\\\n39 44 \n\\f1 \\'b0\\'c2\\'b5\\'d8\\'c0\\'fb\\'b2\\'a9\\'b2\\'ca\n\\f0  89.4062162162\\\n40 34 Interwetten.es 89.4236619718\\\n41 147 Fivebet.it 89.5043859649\\\n42 2 \n\\f1 \\'b0\\'c4\\'c3\\'c5\n\\f0  89.5380519481\\\n43 146 FiveBet 89.5895238095\\\n44 58 Balkanbet.rs 89.6095774648\\\n45 57 Balkan Bet 89.6211267606\\\n46 220 Paddy Power.it 89.70671875\\\n47 198 Milenium 89.8823214286\\\n48 50 STS 90.0\\\n49 60 Bet-at-home 90.0019736842\\\n50 308 Vierklee 90.020754717\\\n51 239 Sazkashop 90.0225\\\n52 235 Remi 90.0263829787\\\n53 78 BetClick 90.0279220779\\\n54 266 Startip 90.0597183099\\\n55 319 Youwin 90.1377631579\\\n56 282 TipKurz 90.147260274\\\n57 258 Sportsbook.com 90.1534666667\\\n58 177 Totolotek 90.1547727273\\\n59 284 Tipos 90.1854545455\\\n60 63 Bet2be 90.1981081081\\\n61 269 SuperSport 90.2030882353\\\n62 126 Chance 90.2294520548\\\n63 45 \n\\f1 \\'ba\\'cf\\'b6\\'d4\n\\f0  90.2320454545\\\n64 271 Sweden 90.2474074074\\\n65 313 Wettpunkt 90.2513207547\\\n66 270 Svenska Spel 90.2589090909\\\n67 157 Germania Sport 90.2650704225\\\n68 272 Synot TIP 90.2736986301\\\n69 283 TipKurz.sk 90.2896666667\\\n70 68 BetBoo 90.3447826087\\\n71 186 Kogler 90.375\\\n72 15 Coral 90.4173239437\\\n73 238 Sazka 90.417761194\\\n74 88 Etoto 90.4397619048\\\n75 250 Skybet 90.4737333333\\\n76 176 Instant Action Sports 90.5145833333\\\n77 39 \n\\f1 \\'b2\\'a9\\'cc\\'ec\\'cc\\'c3\n\\f0 .vu 90.5253333333\\\n78 278 TheBetArena 90.5407792208\\\n79 167 Gwbet 90.5635526316\\\n80 61 Betsafe 90.566\\\n81 62 Betsafe.DK 90.566\\\n82 241 Scandic Bookmakers 90.5687671233\\\n83 18 SportingBet (\n\\f1 \\'b2\\'a9\\'cc\\'ec\\'cc\\'c3\n\\f0 ) 90.5687671233\\\n84 127 Com-bet.com 90.5868292683\\\n85 65 Betsson Sportsbook 90.6048\\\n86 107 BetUS 90.6336956522\\\n87 199 Millenniumbet 90.6347457627\\\n88 177 Intertops 90.6447272727\\\n89 87 BetInternet (\n\\f1 \\'b7\\'a2\\'b4\\'ef\n\\f0 ) 90.6732467532\\\n90 132 Danske Spil 90.6764615385\\\n91 306 Victoriatip 90.6875\\\n92 137 DoxxBet 90.7003947368\\\n93 73 Betchance 90.7022222222\\\n94 75 BetClic 90.7026229508\\\n95 171 IACS 90.7033333333\\\n96 8 Easybets (\n\\f1 \\'d2\\'d7\\'ca\\'a4\\'b2\\'a9\n\\f0 ) 90.7077027027\\\n97 48 \n\\f1 \\'d2\\'d7\\'ca\\'a4\\'b2\\'a9\n\\f0 88 90.7122666667\\\n98 133 Denmark 90.7126984127\\\n99 51 ABCmanager 90.715\\\n100 88 BetISN(\n\\f1 \\'d6\\'c7\\'b2\\'a9\n\\f0 ) 90.7222535211\\\n101 56 As3388 90.7447945205\\\n102 170 Hrvatska Lutrija 90.7705555556\\\n103 182 Iziplay 90.7717241379\\\n104 86 Betin 90.8024\\\n105 113 Maxi-tip 90.8212\\\n106 147 888Sport 90.84\\\n107 233 Public Bet 90.8428571429\\\n108 160 Sportplus 90.8456097561\\\n109 149 Fortuna 90.8664864865\\\n110 208 Nike 90.8895890411\\\n111 52 Adabet 90.8982857143\\\n112 144 Expekt 90.9088\\\n113 77 BetClic.it 90.9097333333\\\n114 158 Giocodigitale 90.9105172414\\\n115 33 Bwin.it 90.9123728814\\\n116 168 Hattrick 90.9193617021\\\n117 217 Offsidebet 90.9233333333\\\n118 93 Betoto.com 90.9424657534\\\n119 145 Fantasticwin 90.9428378378\\\n120 175 IFortuna.eu 90.9613846154\\\n121 91 BetNGo 90.9648\\\n122 286 Tipsport 90.9828571429\\\n123 89 betitaly.it 90.9979166667\\\n124 11 Bwin (\n\\f1 \\'b1\\'d8\\'d3\\'ae\n\\f0 ) 91.0098648649\\\n125 103 Betsson 91.0164788732\\\n126 61 Bet-at-home.it 91.0304347826\\\n127 31 Bwin.es 91.0425675676\\\n128 169 Hititbet 91.045\\\n129 226 Parisport 91.0509375\\\n130 117 Boylesports 91.0544927536\\\n131 295 Tote 91.0802666667\\\n132 243 Seanie Mac 91.0803174603\\\n133 228 Pianeta Scommesse 91.0807142857\\\n134 178 IFortuna.sk 91.0845714286\\\n135 213 Novibet 91.087027027\\\n136 219 Paddy Power 91.0873684211\\\n137 99 Bets4all.com 91.0992957746\\\n138 108 Betway 91.1050666667\\\n139 257 sportsbetting.com.au 91.115106383\\\n140 84 Betfred (\n\\f1 \\'b2\\'a9\\'b7\\'a2\n\\f0 ) 91.1208108108\\\n141 201 Mozzart 91.1891025641\\\n142 261 SprotsTAB 91.2118181818\\\n143 307 Victory 91.2187837838\\\n144 273 Tabcorp 91.2218518519\\\n145 24 Betcruise 91.2226666667\\\n146 90 Betliner 91.2233333333\\\n147 96 Betpro.it 91.2675925926\\\n148 120 CashPoint 91.2698648649\\\n149 296 Totesport 91.2779166667\\\n150 22 Bovada 91.2940384615\\\n151 111 Bluebet.it 91.2998148148\\\n152 140 Europe-bet 91.3422368421\\\n153 154 GameLux.it 91.3471698113\\\n154 320 138sungame 91.3472413793\\\n155 72 Bovada.lv 91.3480701754\\\n156 70 Bodog.eu 91.3480701754\\\n157 105 Betting2000 91.3572413793\\\n158 321 18Bet 91.3605333333\\\n159 190 LUXBET 91.362\\\n160 227 PartyBets 91.3670666667\\\n161 12 Gamebookers 91.3762337662\\\n162 202 MyBet 91.3803947368\\\n163 53 Admiral 91.3811764706\\\n164 288 Tipsport.sk 91.3847916667\\\n165 194 Match Point 91.3853623188\\\n166 248 Sisal 91.4034782609\\\n167 104 Better.it 91.4118181818\\\n168 298 TotoSi 91.4205454545\\\n169 224 PariMatch 91.4502985075\\\n170 292 Topgoal 91.455\\\n171 87 Egobet 91.4618055556\\\n172 209 Nikebet 91.4753333333\\\n173 305 Victoria-Tip 91.4766666667\\\n174 260 SportYes.it 91.4781481481\\\n175 312 Wetten.de 91.492\\\n176 287 Tipsport.net 91.5002083333\\\n177 196 MeridianBet 91.5048\\\n178 135 Digibet 91.5052631579\\\n179 216 Offside 91.508125\\\n180 59 Ball2Win 91.5102816901\\\n181 20 188Bet (\n\\f1 \\'bd\\'f0\\'b1\\'a6\\'b2\\'a9\n\\f0 ) 91.5136842105\\\n182 197 Mobibet 91.5155555556\\\n183 249 Skiller.it 91.5287719298\\\n184 294 TopSportWetten 91.537826087\\\n185 55 Apollobet 91.5682978723\\\n186 264 StarPrice 91.5685714286\\\n187 7 Singbet (\n\\f1 \\'bb\\'ca\\'b9\\'da\n\\f0 ) 91.5721052632\\\n188 160 Gmatic 91.5737142857\\\n189 191 LUXBET.com 91.5791428571\\\n190 246 Singlebet (SB) 91.5793506494\\\n191 43 E\n\\f1 \\'c0\\'d6\\'b2\\'a9\n\\f0  91.5884415584\\\n192 314 Wewbet (\n\\f1 \\'d3\\'af\\'ba\\'cc\n\\f0 ) 91.5994736842\\\n193 54 Agile.it 91.6120833333\\\n194 83 Betflag.it 91.612173913\\\n195 302 Unitab 91.6520833333\\\n196 210 Nordicbet 91.6536986301\\\n197 30 \n\\f1 \\'b1\\'d8\\'b7\\'a2\n\\f0 .it 91.6572093023\\\n198 136 Domusbet.it 91.6664864865\\\n199 299 Triobet 91.6686111111\\\n200 28 Betsson Exchang 91.6791666667\\\n201 130 Completesportsbetting 91.68\\\n202 274 Tattsbet 91.7026530612\\\n203 17 Unibet (\n\\f1 \\'d3\\'c5\\'ca\\'a4\\'bf\\'cd\n\\f0 ) 91.7087012987\\\n204 203 MyBet.com 91.7115942029\\\n205 165 GSNetwork 91.7191304348\\\n206 98 BetRedKings 91.7236842105\\\n207 156 Gamenet.it 91.7352727273\\\n208 263 Stanleybet 91.7392307692\\\n209 22 Eurobet (\n\\f1 \\'c5\\'b7\\'b2\\'a9\n\\f0 ) 91.7404347826\\\n210 265 Starpricebet 91.7450724638\\\n211 109 BINGOAL 91.7556923077\\\n212 112 BoDog (\n\\f1 \\'b2\\'a9\\'b9\\'b7\n\\f0 ) 91.7680821918\\\n213 326 99Bet 91.7698214286\\\n214 16 Sbobet (\n\\f1 \\'c0\\'fb\\'bc\\'c7\n\\f0 ) 91.772027027\\\n215 221 PAF 91.7773684211\\\n216 155 Gamenet 91.7834482759\\\n217 153 Gamebookers.it 91.7971428571\\\n218 189 Luckia.es 91.8038028169\\\n219 19 Mansion88 (\n\\f1 \\'c3\\'f7\\'c9\\'fd\n\\f0 ) 91.8113333333\\\n220 80 CMD368.com 91.8131818182\\\n221 188 Leon 91.8132258065\\\n222 40 FUN88 (\n\\f1 \\'c0\\'d6\\'cc\\'ec\\'cc\\'c3\n\\f0 ) 91.8159210526\\\n223 322 1Bet 91.8164\\\n224 328 12BET (\n\\f1 \\'d2\\'bc\\'d9\\'45\\'b2\\'a9\n\\f0 ) 91.8172\\\n225 41 \n\\f1 \\'c0\\'d6\\'cc\\'ec\\'cc\\'c3\n\\f0 .au 91.8172\\\n226 85 BetGun.com 91.8214035088\\\n227 166 Guts 91.8323684211\\\n228 42 IBCBET (\n\\f1 \\'c9\\'b3\\'b0\\'cd\n\\f0 ) 91.8345333333\\\n229 179 Isibet 91.8370454545\\\n230 14 10BET 91.8622368421\\\n231 222 PAF.es 91.8742028986\\\n232 82 Betflag 91.8751851852\\\n233 290 Toals 91.8973684211\\\n234 67 Betaland 91.9126666667\\\n235 327 88asia88 91.9245714286\\\n236 123 Centrebet 91.9294666667\\\n237 66 BetAdria 91.9372972973\\\n238 47 \n\\f1 \\'c9\\'ea\\'b2\\'a9\n\\f0 138 91.9502739726\\\n239 280 Tipico 91.9668\\\n240 205 NetBet 91.9692105263\\\n241 251 Smart Live Sport 91.9868421053\\\n242 63 Bet16 (\n\\f1 \\'c8\\'f0\\'b7\\'e1\n\\f0 ) 91.9938461538\\\n243 316 Winner 91.997027027\\\n244 289 Titanbet 91.9989189189\\\n245 148 Flemington Sportsbet 92.0011111111\\\n246 27 Smarkets 92.0014705882\\\n247 184 Jetbull 92.0043421053\\\n248 214 Noxwin 92.0043421053\\\n249 101 Betsi 92.0109090909\\\n250 207 NGG 92.0169767442\\\n251 29 Eurobet.it 92.0221875\\\n252 6 SNAI 92.0328070175\\\n253 275 Teambet 92.0380821918\\\n254 128 ComeOn 92.0419736842\\\n255 141 Evebet (\n\\f1 \\'d2\\'f8\\'ba\\'d3\n\\f0 ) 92.0492063492\\\n256 309 Vwin 92.04921875\\\n257 301 Unibet.it 92.072962963\\\n258 197 Mermaidbet 92.0788888889\\\n259 326 888.it 92.08475\\\n260 131 Contorabet 92.0873972603\\\n261 113 Bookie Bob 92.0892537313\\\n262 323 24hBET 92.1015068493\\\n263 100 Betshop 92.103442623\\\n264 143 Evona 92.1097777778\\\n265 102 Betsonic 92.1186666667\\\n266 268 SuperLenny 92.1402739726\\\n267 38 \n\\f1 \\'b2\\'a9\\'cc\\'ec\\'cc\\'c3\n\\f0 .au 92.153\\\n268 121 CBM Bookmaker 92.2138157895\\\n269 49 Intralot (\n\\f1 \\'d2\\'f2\\'cc\\'d8\\'c0\\'ad\\'c2\\'e5\n\\f0 ) 92.2449090909\\\n270 122 CBMsport 92.2610294118\\\n271 324 24hPoker 92.2640425532\\\n272 178 Intralot.it 92.2772413793\\\n273 303 VBet 92.3023684211\\\n274 1 \n\\f1 \\'cd\\'fe\\'c1\\'ae\\'cf\\'a3\\'b6\\'fb\n\\f0  92.3031081081\\\n275 231 Playbet 92.3166666667\\\n276 95 BetPhoenix 92.3507407407\\\n277 254 Sports-1 92.3507407407\\\n278 65 Bet7days 92.36\\\n279 129 Comeon! 92.3616666667\\\n280 118 Carib Sports 92.3814285714\\\n281 50 Intralot Italia 92.3869767442\\\n282 62 Bet1128 92.3891891892\\\n283 35 UEDBET (UED\n\\f1 \\'d1\\'c7\\'d6\\'de\n\\f0 ) 92.4116326531\\\n284 92 BetOnline 92.4126190476\\\n285 253 Sportgewin 92.4168656716\\\n286 279 TheGreek.com 92.4470588235\\\n287 281 Tipico.it 92.4567241379\\\n288 37 \n\\f1 \\'cd\\'fe\\'c1\\'ae\\'cf\\'a3\\'b6\\'fb\n\\f0 .it 92.4696551724\\\n289 291 TonyBet 92.4871641791\\\n290 277 The Greek 92.505\\\n291 130 Optibet 92.5158823529\\\n292 106 BetuniQ 92.5205797101\\\n293 97 Betrally 92.5501315789\\\n294 81 Betfair SB 92.5531034483\\\n295 36 \n\\f1 \\'cd\\'fe\\'c1\\'ae\\'cf\\'a3\\'b6\\'fb\n\\f0 .es 92.5735714286\\\n296 286 Tomwaterhouse 92.5794117647\\\n297 110 BizonBet 92.6001388889\\\n298 172 IASbet.com 92.6034210526\\\n299 255 Sportsbet 92.6080263158\\\n300 64 Bet3000 92.6176315789\\\n301 242 Schwechat 92.6252083333\\\n302 150 Fubo (\n\\f1 \\'b8\\'bb\\'b2\\'a9\n\\f0 ) 92.6255813953\\\n303 162 Gobetgo 92.6293846154\\\n304 151 Fubo.com 92.6413953488\\\n305 124 Centurionbet 92.6436170213\\\n306 119 CaribSports 92.6871428571\\\n307 256 Sportsbet.com.au 92.7521428571\\\n308 315 Wilsonbet 92.7606666667\\\n309 234 Rebels 92.7721276596\\\n310 25 BETDAQ 92.7832\\\n311 183 Jenningsbet 92.7913333333\\\n312 229 Pinnbet 92.8056944444\\\n313 311 Wettbuero 92.8318604651\\\n314 318 YouWager 92.8771428571\\\n315 163 GoldBet 92.8886666667\\\n316 293 TopSport 92.9373469388\\\n317 262 Stan James (\n\\f1 \\'ca\\'b7\\'b5\\'a4\\'d5\\'b2\n\\f0 ) 92.9626086957\\\n318 164 Goldenpark 92.9626086957\\\n319 139 Efbet 93.0287012987\\\n320 125 Championsbet 93.1439189189\\\n321 230 PlanetWin365 93.1921621622\\\n322 159 GLB 93.195\\\n323 218 Olimpkz 93.2336206897\\\n324 74 Betcity 93.2505263158\\\n325 4 Bet365 93.5053424658\\\n326 215 OddsRing 93.5060810811\\\n327 70 Betbutler 93.6438888889\\\n328 185 JoinBet 93.6766666667\\\n329 247 Sirbobet 93.6822972973\\\n330 72 Betcenter.be 93.8234722222\\\n331 276 Tempobet 93.9002272727\\\n332 187 Leaderbet 93.9204615385\\\n333 161 Goalbet 93.9716438356\\\n334 267 Stoiximan 93.9993150685\\\n335 305 Victor Chandler 94.2515789474\\\n336 195 Mcbookie 94.3330555556\\\n337 180 Kashmobet 94.3722222222\\\n338 71 Betcenter 94.4366666667\\\n339 244 Setantabet 94.4393333333\\\n340 80 BetCRIS 94.488490566\\\n341 317 Yabet 94.488490566\\\n342 152 Gamblers Palace 94.4998076923\\\n343 134 Diamond Sportsbook Int. 94.5313207547\\\n344 9 BetVictor (\n\\f1 \\'ce\\'b0\\'b5\\'c2\n\\f0 ) 94.5641333333\\\n345 115 Bookmaker.com 94.5903846154\\\n346 114 Bookmaker.ag 94.7641176471\\\n347 240 SBG Global 95.0\\\n348 116 Bookmaker.eu 95.0641176471\\\n349 310 WagerWeb 95.0894117647\\\n350 23 \n\\f1 \\'b1\\'d8\\'b7\\'a2\n\\f0  95.6610810811\\\n351 192 Marathon 96.5362857143\\\n352 13 PinnacleSports (\n\\f1 \\'c6\\'bd\\'b2\\'a9\n\\f0 ) 96.5728767123\\\n353 193 Marathonbet 96.5860273973\\\n354 46 \n\\f1 \\'c6\\'bd\\'b2\\'a9\n\\f0  96.6658064516\\\n355 252 SportBet 97.0444230769\\\n356 325 5Dimes 97.0444230769\\\n357 180 Island Casino 97.0444230769\\\n358 26 Matchbook 98.9114285714}"
  },
  {
    "path": "findcompany.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\" find best return rate company \"\"\"\n\n__author__ = 'ggstar'\n\nimport spider\nimport time\nimport lottery\n\nmatch_all_ids = []\n\nfor day in range(13, 20, 1):\n    match_ids = spider.crawl_match_list_by_date(\"2014-07-\" + str(day))\n\n    match_all_ids += match_ids\n\nitem_list = []\n\nseq = 0\n\n\ncompany_map = {}\n\nfor match_id in match_all_ids:\n    seq += 1\n    print seq, match_id\n\n    match = spider.get_match(match_id)\n\n    for item in match.item_arr:\n        if item.company in company_map:\n            cur_company = company_map[item.company]\n            cur_company.back_ratio = \\\n                (cur_company.back_ratio * cur_company.count + item.back_ratio) / \\\n                (cur_company.count + 1)\n            cur_company.count += 1\n        else:\n            company_map[item.company] = item\n\n    time.sleep(5)\n\ncompanies = []\nfor company in company_map.values():\n    companies.append(company)\n\ncompanies.sort(lambda x, y: cmp(x.back_ratio, y.back_ratio))\n\nseq = 0\nfor company in companies:\n    seq += 1\n    print seq, company.id, company.company, company.back_ratio\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "lottery.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\" lottery related class \"\"\"\n\n__author__ = 'ggstar'\n\n\nclass LotteryItem(object):\n\n    def __init__(self):\n        self.company = \"\"\n        self.id = 0\n        self.w_odds = float(0)\n        self.d_odds = float(0)\n        self.l_odds = float(0)\n        self.cw_odds = float(0)\n        self.cd_odds = float(0)\n        self.cl_odds = float(0)\n        self.back_ratio = 0\n        self.count = 1\n\n    def display(self):\n        print \"%s\\t%s\\t%s\\t%s\\t%s\\t\" % (self.id, self.company, self.cw_odds, self.cd_odds, self.cl_odds)\n\n\nclass LotteryMatch(object):\n\n    def __init__(self, match_name, match_link,  match_time, host_team, guest_team, item_arr):\n        self.match_name = match_name\n        self.match_link = match_link\n        self.match_time = match_time\n        self.host_team = host_team\n        self.guest_team = guest_team\n        self.item_arr = item_arr\n\n    def display(self):\n        print \"match name:\\t%s\\nmatch members:\\t%s VS %s\\nmatch time:\\t%s\" % \\\n              (self.match_name, self.host_team, self.guest_team, self.match_time)\n\n    def display_items(self):\n        for item in self.item_arr:\n            item.display()\n\n\nclass LotteryPortfolio(object):\n\n    def __init__(self):\n        self.fund_count = 0\n\n        self.profit = 0\n\n        self.win_item = LotteryItem()\n        self.draw_item = LotteryItem()\n        self.lose_item = LotteryItem()\n\n        self.win_percentage = 0\n        self.draw_percentage = 0\n        self.lose_percentage = 0\n\n    def display(self):\n        print \"profit:\\t%s\\nwin:\\t%s %s\\t%s\\t%s\\ndraw:\\t%s %s\\t%s\\t%s\\nlose:\\t%s %s\\t%s\\t%s\" % \\\n              (self.profit,\n               self.win_item.id, self.win_item.company, self.win_item.cw_odds, self.win_percentage,\n               self.draw_item.id, self.draw_item.company, self.draw_item.cd_odds, self.draw_percentage,\n               self.lose_item.id, self.lose_item.company, self.lose_item.cl_odds, self.lose_percentage)"
  },
  {
    "path": "main.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\" soccer bet main function file \"\"\"\n\n__author__ = 'ggstar'\n\nimport spider\nimport portfoliomodel\nimport time\n\nimport sys\nreload(sys)\nsys.setdefaultencoding('utf8')\n\nm_match_ids = spider.crawl_match_list()\n\nfor m_match_id in m_match_ids:\n    print m_match_id\n    m_match = spider.get_match(m_match_id)\n\n    portfolio = portfoliomodel.best_portfolio(m_match)\n\n    m_match.display()\n    portfolio.display()\n    time.sleep(4)"
  },
  {
    "path": "portfoliomodel.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\" determine lottery portfolio model \"\"\"\n\n__author__ = 'ggstar'\n\nimport lottery\n\n\ndef get_best_profit(portfolio):\n\n    def min_pay(w, d, l, wp, dp, lp):\n        if w * wp <= d * dp and w * wp <= l * lp:\n            return w * wp\n        if d * dp <= w * wp and d * dp <= l * lp:\n            return d * dp\n        else:\n            return l * lp\n\n    for i in range(100):\n        for j in range(100-i):\n\n            profit = min_pay(portfolio.win_item.cw_odds,\n                             portfolio.draw_item.cd_odds,\n                             portfolio.lose_item.cl_odds,\n                             i, j, 100 - i -j)\n\n            if profit > portfolio.profit:\n                portfolio.profit = profit\n                portfolio.win_percentage = i\n                portfolio.draw_percentage = j\n                portfolio.lose_percentage = 100 - i - j\n\n    return portfolio\n\n\ndef best_portfolio(match):\n\n    portfolio = lottery.LotteryPortfolio()\n\n    for item in match.item_arr:\n\n        if portfolio.win_item.cw_odds < item.cw_odds:\n            portfolio.win_item = item\n\n        if portfolio.draw_item.cd_odds < item.cd_odds:\n            portfolio.draw_item = item\n\n        if portfolio.lose_item.cl_odds < item.cl_odds:\n            portfolio.lose_item = item\n\n    portfolio = get_best_profit(portfolio)\n\n    return portfolio"
  },
  {
    "path": "spider.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n\"\"\" lottery item class \"\"\"\n\n__author__ = 'ggstar'\n\nimport re\nimport lottery\nimport datetime\nimport requests\n\n\ndef url_get(url_str, decode):\n    r = requests.get(url_str)\n    return r.content.decode(decode, \"ignore\").encode('utf-8')\n\n\ndef crawl_match_info(match_id):\n    url_str = \"http://odds.500.com/fenxi/ouzhi-\" + str(match_id) + \".shtml\"\n    print url_str\n    content = url_get(url_str, \"gb2312\")\n    #print content\n\n    match = lottery.LotteryMatch(\"match_name\", \"match_link\",  \"match_time\", \"host_team\", \"guest_team\", \"item_arr\")\n\n    match_info_r = re.compile(r'<a class=\"hd_name\"[\\s\\S]*?>([\\s\\S]*?)<')\n\n    seq = 0\n    for m in match_info_r.finditer(content):\n        seq += 1\n        if seq == 1:\n            match.host_team = m.group(1)\n        elif seq == 2:\n            match.match_name = m.group(1)\n        elif seq == 3:\n            match.guest_team = m.group(1)\n\n    match_time_r = re.compile(r'<p class=\"game_time\">([\\s\\S]*?)</p>')\n\n    for m in match_time_r.finditer(content):\n        match.match_time = m.group(1)\n\n    return match\n\n\ndef crawl_lottery_items(match_id):\n\n    url_str = \"http://odds.500.com/fenxi1/ouzhi.php?id=\" + str(match_id) + \"&ctype=1&start=\"+str(1)+\"&r=1&style=0&last=1&guojia=0&chupan=0\"\n    content = url_get(url_str, \"utf-8\")\n\n    item_r = re.compile(r'(xls=\"row\"[\\s\\S]*?)<tr class=\"tr\\d\"')\n\n    lottery_items = []\n\n    item_seq = 0\n\n    for m in item_r.finditer(content):\n\n        item_seq += 1\n        lottery_item = lottery.LotteryItem()\n        lottery_item.id = item_seq\n\n        one_item = m.group(1)\n        company_pattern = re.compile(r'class=\"tb_plgs\" title=\"(.*?)\"')\n        company_match = company_pattern.search(one_item)\n\n        if company_match:\n            lottery_item.company = company_match.group(1)\n\n        odds_pattern = re.compile(r'style=\"cursor:pointer\" >(.*?)</td>')\n\n        seq = 0\n        for odd in odds_pattern.finditer(one_item):\n            seq += 1\n            odd_f = float(odd.group(1))\n            if seq == 1:\n                lottery_item.w_odds = odd_f\n            elif seq == 2:\n                lottery_item.d_odds = odd_f\n            elif seq == 3:\n                lottery_item.l_odds = odd_f\n            elif seq == 4:\n                lottery_item.cw_odds = odd_f\n            elif seq == 5:\n                lottery_item.cd_odds = odd_f\n            elif seq == 6:\n                lottery_item.cl_odds = odd_f\n\n        lottery_items.append(lottery_item)\n\n        return_pattern = re.compile(r'</tr>\\s*<tr>\\s*<td row=\"1\">(.*?)%</td>')\n\n        return_rate_match = return_pattern.search(one_item)\n\n        if return_rate_match:\n            lottery_item.back_ratio = float(return_rate_match.group(1))\n\n    return lottery_items\n\n\ndef get_match(match_id):\n    match = crawl_match_info(match_id)\n    match.item_arr = crawl_lottery_items(match_id)\n\n    return match\n\n\ndef crawl_match_list():\n\n    today = datetime.datetime.now()\n    return crawl_match_list_by_date(str(today.year) + \"-\" + str(today.month) + \"-\" + str(today.day))\n\n\ndef crawl_match_list_by_date(date):\n\n    url_str = \"http://trade.500.com/jczq/dgp.php?date=\"+ date +\"&playtype=both\"\n    content = url_get(url_str, \"gb2312\")\n    match_id_r = re.compile(r'http://odds.500.com/fenxi/ouzhi-(\\d+).shtml')\n\n    match_ids = []\n\n    for m in match_id_r.finditer(content):\n        match_ids.append(m.group(1))\n\n    return match_ids\n"
  }
]