1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
# verifica se ha um novo set verificando o total no banco e no csv
# se houve diferenca, descobre quais sao os sets novos e cadastra no banco
# para cada set verifica se ha diferenca do total de cards informado pelo set
# e o total de cards para aquele set cadastrado
# havendo diferenca, vai na internet e procura os novos cards para cadastrar
from BeautifulSoup import BeautifulSoup as bs
import sqlite3
import csv
import urllib2
import re
conn = sqlite3.connect('database.db')
c = conn.cursor()
reader = csv.reader(open('magic_sets.csv'), delimiter='\t')
conjuntos_arquivo = []
for i in reader:
conjuntos_arquivo.append(i)
c.execute("select count(*) from colecao")
total_banco = int( c.fetchone()[0] )
total_arquivo = len(conjuntos_arquivo)
print total_banco
print total_arquivo
# verifica se ha um novo set verificando o total no banco e no csv
# se houve diferenca, descobre quais sao os sets novos e cadastra no banco
if total_banco < total_arquivo:
# quais sao os conjuntos novos?
c.execute("select descricao from colecao")
conjuntos = []
for i in c.fetchall():
conjuntos.append(i[0])
for i in conjuntos_arquivo:
if i[0] not in conjuntos:
# cadastra set no banco
c.execute("insert into colecao (descricao, sigla, total, bloco) values (?,?,?,?)", i)
conn.commit()
# para cada set verifica se ha diferenca do total de cards informado pelo set
# e o total de cards para aquele set cadastrado
c.execute("select sigla, total from colecao")
colecoes = c.fetchall()
#print colecoes
localizadas = []
for i in colecoes:
c.execute("select count(*) from card where sigla = ?", [ i[0] ])
total = c.fetchone()
if int( i[1] ) <> int(total[0] ):
print i[1], total[0]
localizadas.append( i[0] )
print len(localizadas), 'colecoes para pesquisar'
for sigla in localizadas:
print 'Colecao', sigla
c.execute("select numero from card where sigla = ? ", [ sigla ])
cards_existentes = []
for card in c.fetchall():
cards_existentes.append( card[0])
conjunto_existents = set(cards_existentes)
c.execute("select total, descricao from colecao where sigla = ? ", [sigla])
resposta = c.fetchone()
total, colecao = resposta
total = int(total)
conjunto_total = set( map( str, range(1, total + 1)) )
conjunto_busca = conjunto_total - conjunto_existents
print conjunto_existents
print conjunto_busca
for numero in conjunto_busca:
print "http://www.magiccards.info/%s/en/%s.html" % (sigla, numero)
page = urllib2.urlopen("http://www.magiccards.info/%s/en/%s.html" % (sigla, numero))
texto = page.read()
page.close()
soup = bs(texto)
carta = soup.find('a',href="/%s/en/%s.html" % (sigla, numero))
if not carta:
continue
nome = soup.find('a',href="/%s/en/%s.html" % (sigla, numero)).contents[0]
ctext = soup.find('p',{'class':'ctext'})
tipo_e_mana = ctext.previousSibling.previousSibling.contents[0]
print tipo_e_mana
try:
tipo, mana = tipo_e_mana.split(',')
mana.replace('\n','')
mana = mana.split()[0]
except ValueError:
tipo, mana = tipo_e_mana, ''
print colecao
b = soup.findAll('b',text=re.compile(colecao))
#print b
encontrou = False
contador = 1
while not encontrou:
try:
raridade = b[-contador]
raridade = raridade[ raridade.index('(') + 1 : raridade.index(')') ]
encontrou = True
except IndexError:
raridade = b
encontrou = True
except ValueError:
contador += 1
try:
tamanho = len(ctext.contents[0].contents)
if tamanho > 1:
posicoes = range(0, tamanho, 3)
texto_da_carta = ""
for i in posicoes:
texto_da_carta += "%s\n" % ctext.contents[0].contents[i]
print texto_da_carta
else:
texto_da_carta = ctext.contents[0].contents[0]
except IndexError:
texto_da_carta = ""
tupla = nome, sigla, numero, tipo, mana, raridade, texto_da_carta
print tupla
if u"Missing!" in unicode(tupla[3]):
tupla = nome, sigla, numero, '', mana, raridade, texto_da_carta
print 'cadastrando'
c.execute("insert into card (nome, sigla, numero, tipo, mana, raridade, texto) values (?,?,?,?,?,?,?)", tupla)
conn.commit()
c.close()
|