Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/07/2008, à 16:09

tiky

Un bot pour les stats du topic "Votre âge?"

Bonjour,
       J'ai écrit un bot pour le topic "votre âge?" en python et BeautifulSoup. Il met à jour automatiquement les âges en fonction de l'année du post. Il gère les doublons. Les résultats sont bogués car il n'est pas simple de déterminer si la personne parle effectivement de son âge. Il faudrait modifier les posts...

#!/usr/bin/python
#-*- coding: utf-8 -*-
# Copyright 2008 Pierre Villemot <tiky.halbaroth AT gmail DOT com>
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA					    
import urllib2
from BeautifulSoup import BeautifulSoup
from time import gmtime, strftime, sleep
import re, sys, math

url_format = "http://forum.ubuntu-fr.org/viewtopic.php?id=%s&p=%s"

class agebot:
	def __init__( self, url, topic_id ):
		self.url = url
		self.topic_id = topic_id
		self.last_page = 0
		self.users = {}
	def url_open( self, url ):
		try:
			file = urllib2.urlopen( url )
		except urllib2.HTTPError, e:
			if e.code == 404:
				print "%s 404 Not Found !"%( url )
			else:
				print "%s %d:%s"%( url, e.code, e.msg )
		except urllib2.URLError, e:
			print "%s %s"%( url, e.reason[1] )
		else:
			return file
	def count_page( self ):
		file = self.url_open( self.url%( self.topic_id, 1 ) )
		html = file.read()
		soup = BeautifulSoup( html )
		links = soup.findAll( attrs={ "href": re.compile(r"viewtopic.php\?id=%s"%( self.topic_id ) ) } )
		self.last_page = sorted( [ link.string for link in links if re.match( "\d+", link.string ) ] )[-1]
		print u"%s page(s) trouvée(s)"%( self.last_page )
	def parser( self ):
		self.count_page()
		for page in range( int(self.last_page)+1 ):
			file = self.url_open( self.url%( self.topic_id, page ) )
			soup = BeautifulSoup( file.read() )
			self.search_users( soup )
			file.close()
			sys.stdout.write("\rPage %s/%s"%( page, self.last_page ))
			sys.stdout.flush()
		print ""
	def search_users( self, soup ):
		posts = soup.findAll( name="div", attrs={ "id": re.compile( r"p\d+" ) } )
		for post in posts:
			current_year = strftime("%Y", gmtime() )
			date = post.find( name="a", attrs={ "href": re.compile(r"viewtopic.php\?pid=\d+#p\d+" ) } )
			if date:
				year = re.match( "Le [\d]{2}/[\d]{2}/([\d]{4})", date.string )
				if not year and re.match( "[Hier|Aujourd'hui]", date.string ):
					year = current_year
				else:
					year = year.group( 1 )
				offset = int(current_year) - int(year)
				user = post.find( name="a", attrs={ "href": re.compile( r"profile.php\?id=\d+") } )
				msg = post.find( name="div", attrs={ "class": "postmsg" } )
				if msg != None and user:
					age = re.search( "([\d]{1,3}) ?ans", msg.contents[1].__str__() )
					if age:
						self.users[ user.string ] = int(age.group( 1 )) + offset
	def stats( self ):
		users = sorted( self.users.values() )
		freqs = {}
		total = 0.0
		for age in users:
			total += age
			if freqs.has_key( age ):
				freqs[ age ] += 1
			else:
				freqs[ age ] = 1
		average = total/len( self.users )
		esperance = 0
		for key, value in freqs.items():
			esperance += key * value / len( self.users )
		deviation = 0
		for key, value in freqs.items():
			deviation += value/total*( key - esperance )**2
		deviation = math.sqrt( deviation )
		extremums = users[0::len(users)-1]
		print "Total %s réponse(s)"%( total ) 
		print "Moyenne %s ans"%( average )
		print "Espérance %s ans"%( esperance )
		print "Écart-type %s ans"%( deviation )
		print "Le plus jeune a %s ans, le plus âgé %s ans"%( extremums[0], extremums[1] )
		for user, age in self.users.items():
			print "%s: %s ans"%( user, age )

if __name__ == "__main__":
	ab = agebot( url_format, 4002 )
	ab.parser()
	ab.stats()

Le résultat obtenu:

53 page(s) trouvée(s)
Page 53/53
Total 17740.0 réponse(s)
Moyenne 30.3247863248 ans
Espérance 5 ans
Écart-type 8.28562480167 ans
Le plus jeune a 2 ans, le plus âgé 656 ans
benoitldr: 13 ans
Franec: 55 ans
gl0be: 24 ans
aimak: 18 ans
jerome33: 35 ans
ironcliff: 24 ans
tecjas: 15 ans
Grandblack: 20 ans
MrZeroo00: 16 ans
taraniys: 4 ans
deconnect: 25 ans
mitch46000: 26 ans
Cricket: 29 ans
johnkaffee: 32 ans
necroluckyboy: 24 ans
skateinmars: 21 ans
Sallé: 24 ans
la 'tite gogole: 43 ans
petertosh: 24 ans
Weib: 22 ans
david2b: 12 ans
Didier-35: 436 ans
pld1: 80 ans
Delleck: 15 ans
bubu8941: 22 ans
prudence: 13 ans
Loïc: 24 ans
tuxik: 27 ans
Sunnywisd: 26 ans
jpaul: 16 ans
biginoz: 24 ans
manu_98: 15 ans
j1100: 24 ans
Markimarca: 22 ans
paul92: 18 ans
Xinox: 63 ans
Necro: 25 ans
Mr. FX: 19 ans
salingue: 59 ans
umcisou: 25 ans
Sanvean: 25 ans
did: 29 ans
michael: 23 ans
ertomian: 18 ans
Valère: 31 ans
jorkar: 22 ans
Snot92: 27 ans
BoBoL: 21 ans
Flapidouille: 62 ans
Berti8: 35 ans
amwus: 20 ans
Rei: 18 ans
guimo: 8 ans
Pirrote: 26 ans
Heliox: 15 ans
CHUCKYCHUCK: 16 ans
Gloubiboulga: 28 ans
J0siane: 27 ans
Benharper: 22 ans
Ifzenels: 35 ans
Zeuf: 38 ans
Ago: 22 ans
Kiosuki: 16 ans
geantick: 30 ans
ydb: 13 ans
Norge: 23 ans
darkagonik: 18 ans
109: 26 ans
Mori: 8 ans
tux_54: 3 ans
xabilon: 36 ans
MarcelPentium: 30 ans
blackdream: 18 ans
stopher: 25 ans
k1k0u[fr]: 17 ans
zubuntu: 23 ans
Grummfy: 23 ans
yafoo: 21 ans
michas: 16 ans
boardingman: 21 ans
vdemeester: 24 ans
TraGiKomiK: 25 ans
ipo: 40 ans
nilux: 22 ans
BlueTak: 45 ans
jp_lebrol: 21 ans
phlinux: 52 ans
Jem: 6 ans
k0s: 31 ans
Hagakure.denseo: 22 ans
bubble_cat: 18 ans
jaywax: 27 ans
Stemp: 14 ans
Esska: 19 ans
Niaphron: 26 ans
Guinux: 23 ans
Lmartin76: 34 ans
SlowBrain: 22 ans
clodomi: 11 ans
Alphea: 6 ans
saintraph: 36 ans
madabouttolkien: 41 ans
naughtyjah: 34 ans
Paulrem: 46 ans
gartrog: 22 ans
Bobbybionic: 22 ans
marcanto: 18 ans
ng72: 13 ans
lolpop: 41 ans
$ianur391: 121 ans
K -Lune noire: 26 ans
StK: 21 ans
Jean Lussier: 47 ans
xorg62: 15 ans
siick: 24 ans
Eric P.: 28 ans
Dagrut: 16 ans
mcs30: 58 ans
Yellow_evil: 18 ans
DamienUb: 19 ans
Kanor: 23 ans
XGouchet: 23 ans
YS: 20 ans
Louis XVI with a gun: 22 ans
Maeda: 27 ans
helium: 23 ans
Keoden: 28 ans
Enjoy Aspirin: 32 ans
LR: 29 ans
oussamadj: 13 ans
Milouse: 21 ans
Renault: 17 ans
windu.2b: 24 ans
Unikity: 23 ans
milambert: 20 ans
Tournesol: 55 ans
freestyle: 16 ans
Toumeno: 17 ans
poupoul2: 39 ans
CeReAl KiLLeR Du 77: 24 ans
Sakproubel: 33 ans
LeVulcain: 37 ans
Zorro56: 17 ans
Hibountu: 28 ans
kuri: 25 ans
TnjiZ: 22 ans
ubinux: 63 ans
Kous-Kous!: 16 ans
nanolight: 21 ans
hassan: 23 ans
Apoc: 22 ans
Jinroh: 18 ans
spook: 24 ans
Jonk_: 26 ans
short-answer: 15 ans
Desintegr: 22 ans
misteraph: 22 ans
simon91: 17 ans
dedesite: 21 ans
Wapush: 20 ans
zorigaman: 21 ans
ld: 27 ans
Smarter: 14 ans
CARNIBAL: 18 ans
netsuai: 40 ans
jluc: 37 ans
babastutz: 37 ans
Nosselrahc: 46 ans
jmd83: 51 ans
samyfom: 16 ans
LacTeuS: 23 ans
Kyle: 23 ans
RavN: 16 ans
KaboOm: 18 ans
Ban: 18 ans
jpcipm: 54 ans
vilraleur: 35 ans
sandoliv: 31 ans
achtungbaby: 39 ans
Arkeos: 6 ans
stephaneguedon: 22 ans
Antoine59: 17 ans
Polo: 6 ans
Migoux: 17 ans
Zitoun: 11 ans
pbq59: 41 ans
Bud78: 41 ans
voxel: 26 ans
johnrébus: 36 ans
bieuzy: 25 ans
energy: 16 ans
Faibbus: 20 ans
AnT.: 29 ans
Mornagest: 23 ans
Archaon59: 18 ans
hairman: 25 ans
Guigui72: 3 ans
Louve60: 2 ans
franky: 17 ans
regback: 37 ans
Lisaraël: 23 ans
rpm13: 54 ans
MCpaul34: 19 ans
Ohax: 21 ans
NicoA380: 23 ans
billiaerts: 41 ans
ponsfrilus: 28 ans
CorNe: 18 ans
URUBU: 58 ans
phil le gnôme: 57 ans
Omnisilver: 24 ans
geekieornotgeekie: 27 ans
Nigo: 25 ans
Ctoutmoica: 26 ans
Julian: 28 ans
sylvain_81: 22 ans
poutchoulove: 22 ans
Nazebrock: 23 ans
Whiplash: 21 ans
coccobill: 33 ans
dde63a: 64 ans
momowac: 20 ans
xuxu: 33 ans
ubuntu972: 24 ans
Daedalus: 20 ans
Aldones: 25 ans
mézgue: 53 ans
guillaumeb.com: 29 ans
xilef: 15 ans
Rubika: 25 ans
Dadou: 34 ans
nico4731: 24 ans
dam2p: 42 ans
pufkine: 44 ans
AddiKT1ve: 3 ans
michel2652: 56 ans
metho: 26 ans
fmo: 35 ans
FOREST47: 52 ans
Vinceleneuski: 46 ans
michmdr: 26 ans
AmiantE: 22 ans
herberts: 24 ans
scog80: 46 ans
B@rtounet: 29 ans
TinFisch: 17 ans
alex.cyrilux: 19 ans
footware: 240 ans
XS: 15 ans
eyves: 57 ans
ludal: 29 ans
-Roma!n-: 20 ans
capucino: 39 ans
loictreyvaud: 23 ans
Aelor: 23 ans
Dvorak66: 8 ans
Ouranos999: 15 ans
Cassandre: 30 ans
minus: 36 ans
sidney_v: 27 ans
Kyro: 27 ans
stratos: 49 ans
amobile: 30 ans
nnaLex: 19 ans
Gou: 25 ans
Pololulix: 22 ans
mythrys: 20 ans
balounou: 16 ans
Idaho: 33 ans
raakhbaba: 57 ans
Enixos: 18 ans
Luzy: 17 ans
pmdzlineur: 47 ans
Alfy1109: 47 ans
tapioka: 3 ans
Sephirot314: 18 ans
philox47: 62 ans
ZiOns: 29 ans
eric42: 46 ans
Galileo: 15 ans
snoopkill: 16 ans
lellex: 17 ans
Lyght: 30 ans
Efhache84: 23 ans
nicky_larson9: 25 ans
Vell: 24 ans
laurent: 27 ans
coubi64: 31 ans
ceric: 31 ans
Zeo: 26 ans
Calysto: 42 ans
christelle23: 29 ans
Petsman: 22 ans
fredolerouge: 38 ans
MaThouX: 16 ans
kikinoubarca: 21 ans
zartche: 24 ans
PiTiLeZarD: 42 ans
Rogan77: 21 ans
mansonboy: 18 ans
WW: 20 ans
Micki-rennes-morlaix: 33 ans
Amalah: 27 ans
Tuxid: 16 ans
graouh: 39 ans
Rapass: 30 ans
Craft: 21 ans
gégé: 59 ans
josop: 55 ans
hardball: 32 ans
liliie: 21 ans
Qclinuxnw: 24 ans
danpe: 46 ans
goodluck: 73 ans
rastanax: 20 ans
Led Shark 24 kin 204: 23 ans
aganim07: 26 ans
darkangel6669: 20 ans
packard: 51 ans
tiky: 18 ans
Herios: 17 ans
yodalala: 21 ans
mortualdead: 14 ans
sonal: 91 ans
superlol: 37 ans
danychou56: 30 ans
azazawe: 25 ans
juju_teamp2p: 27 ans
Arschney: 27 ans
dilon: 13 ans
whoami: 21 ans
Bito: 24 ans
withor: 19 ans
cW@l: 14 ans
topgun: 36 ans
Dr4gOoN: 20 ans
vaur: 15 ans
parabellum: 30 ans
Boubuntu: 24 ans
FaC: 22 ans
tommy: 21 ans
Lunlun: 37 ans
scorp: 53 ans
Korben57: 48 ans
Sultan Rahi: 32 ans
jazzta: 51 ans
lexdu: 32 ans
Eupythal: 35 ans
jcl693: 39 ans
tiffettondus: 36 ans
Orni: 23 ans
Haritux: 33 ans
Styner: 19 ans
nigow: 25 ans
waraba: 22 ans
aooni: 28 ans
mithrandir79: 28 ans
SnakemaN: 15 ans
DragFall: 17 ans
Link WARD: 656 ans
LdK: 21 ans
jiceel: 56 ans
Craquos: 46 ans
joe: 20 ans
useless: 17 ans
lekokeliko: 19 ans
gwillerm: 21 ans
Pierre6020: 25 ans
bobjacques: 15 ans
jean_charles: 23 ans
asher256: 23 ans
utodeb: 25 ans
william97120: 52 ans
Cyman: 28 ans
Roger06: 71 ans
mani: 24 ans
darkodo: 16 ans
bartholomeus: 29 ans
manu (newbie): 30 ans
pepekeke: 31 ans
emixam: 16 ans
Chaton: 16 ans
jeanf: 35 ans
threexone: 31 ans
Cheezy: 36 ans
Mobman02: 20 ans
sebtof13: 19 ans
boris_33: 26 ans
sojoachim: 23 ans
Gillaume: 35 ans
Gem: 24 ans
trifyx: 17 ans
magicmerlin: 9 ans
ant1: 31 ans
richeanas: 17 ans
snipe: 23 ans
Zorg: 23 ans
Wwp: 21 ans
kao_chen: 24 ans
Imoreion: 21 ans
Petit Scarabé: 32 ans
Ju.: 31 ans
baalkor: 6 ans
tuxoli: 37 ans
PLA: 19 ans
Jef_Lord: 33 ans
DrDam: 24 ans
dimi_be: 21 ans
amkoolgarst: 23 ans
mekare: 29 ans
crypto178: 23 ans
dynamos: 36 ans
tshirtman: 23 ans
marc.53: 58 ans
Strash: 23 ans
malenki: 28 ans
loloemr: 27 ans
buriKett: 18 ans
Fuli Culi: 29 ans
Mountain Wild River: 17 ans
P'ti Génie: 25 ans
-Mätic-: 18 ans
tecknhub: 26 ans
djmaster13: 21 ans
X3n0n: 19 ans
reeth: 21 ans
scorpio810: 39 ans
thierry93: 43 ans
REBEL: 42 ans
Pololilo: 22 ans
el punish3r: 20 ans
louiss18: 55 ans
Azariel: 22 ans
cledesol: 56 ans
TTF77: 39 ans
samefab: 26 ans
mirmidon: 31 ans
Franzzzz: 30 ans
andeim_: 22 ans
Bjo: 20 ans
Julie: 19 ans
lolo21g: 39 ans
Plonk: 20 ans
sclement: 39 ans
Tib05: 15 ans
thegiant: 18 ans
skam: 24 ans
S3bulon: 24 ans
jojodanslalune: 30 ans
webatou: 33 ans
MoniCake: 16 ans
Surprise: 24 ans
Bloodshed: 19 ans
nicolas: 17 ans
Yumo: 15 ans
ebrain: 22 ans
BastNic: 22 ans
Keuz-Pon: 20 ans
CaMiX: 17 ans
iuchiban: 55 ans
clapico: 41 ans
toufalk: 30 ans
Dy: 21 ans
Nimoitu: 19 ans
Ayral: 62 ans
iskander84: 53 ans
pititjo: 21 ans
John5599: 21 ans
sephiroth2: 18 ans
rihegher: 28 ans
pinballyoda: 47 ans
Corentin38: 18 ans
Nasman: 46 ans
whiskykoka: 28 ans
Yaen: 38 ans
knuckles: 23 ans
beug: 390 ans
coffeedrinker: 42 ans
Geoffrey: 23 ans
max_naheulbeuk: 19 ans
Wok_: 22 ans
Fpmip21: 21 ans
just1: 15 ans
yohann: 77 ans
scalp: 23 ans
Keito: 26 ans
outremont: 22 ans
loutre: 7 ans
prsieux: 19 ans
fsail: 30 ans
Seve: 31 ans
zetotof: 23 ans
locutux: 29 ans
stgraber: 18 ans
Choulbaguy: 16 ans
Vénice: 50 ans
David: 37 ans
skull killer: 14 ans
esboy: 24 ans
gonzolero: 48 ans
doohan: 37 ans
carlux3: 22 ans
pierre-yves: 19 ans
gge: 58 ans
goic: 30 ans
Rody: 27 ans
Grogro: 17 ans
mesmento: 24 ans
Tartopom: 17 ans
alex63: 25 ans
nab14: 17 ans
titou: 48 ans
breizhat: 13 ans
alexises: 15 ans
David45: 35 ans
renaud.guilhou: 21 ans
doggyseb: 28 ans
inbox: 63 ans
Serge83: 63 ans
roidelapluie: 17 ans
Tinou...buntu: 32 ans
edhelas: 15 ans
bakabakabaka: 25 ans
wam: 24 ans
Stargaza: 20 ans
Infinity: 19 ans
garfunk: 23 ans
Michel38: 57 ans
marteo: 15 ans
dinOtrOniK: 31 ans
Ratur: 20 ans
Marduk: 26 ans
chris1952: 56 ans
paf le chiot: 19 ans
The_true_power: 13 ans
Gras_du_Bide: 32 ans
dbourrion: 15 ans
Uld: 7 ans
Leonux: 49 ans
MoxFulder: 25 ans
Jenny: 47 ans
tenshu: 23 ans
Gnondpom: 15 ans
Subite: 21 ans
NoFaF: 23 ans
kisscoolkiller: 32 ans
Ugrash the Hated: 32 ans
Fl0ri4n: 19 ans
fireblade: 58 ans
hind_flo: 16 ans
andredebaraque: 70 ans
Yodan: 20 ans
erix: 29 ans
nucle: 26 ans
nF: 19 ans
darkvince7: 26 ans
kougaro: 20 ans
Crashforburn: 16 ans
neeux: 28 ans
zarakaï: 18 ans
bishop: 56 ans
Tiede: 23 ans
saceirdoth: 27 ans
AsTeR: 3 ans
ryfe972: 27 ans
hells_dark: 20 ans
siden: 23 ans
Riwan et Mielaure: 31 ans
darky0505: 24 ans
Nizarus: 85 ans
legta: 37 ans
madslipknot: 16 ans
locoloco: 58 ans
d043sth: 40 ans
Jeom2: 25 ans
ralek: 22 ans
MayaLeChat: 29 ans
edriard: 16 ans
golgot200: 44 ans
Indoryl: 15 ans
iode: 27 ans
Piervit: 19 ans
The_eye: 27 ans
timbolchevik: 28 ans

Pour l'instant il cherche l'âge sous la forme: nombre ans ( avec ou sans espace et le nombre est compris entre 0 et 999 ).
Merci de pas exécuter le script pour pas déborder le forum avec des requêtes HTTP.
Voilà !

Dernière modification par tiky (Le 25/07/2010, à 22:35)


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#2 Le 27/07/2008, à 19:18

paul92

Re : Un bot pour les stats du topic "Votre âge?"

salut, bonne idée mais si tu avais la possibilité de mettre la marge entre 8 et 90 ans, ça réduirait assez bien la marge d'erreur...

Hors ligne

#3 Le 28/07/2008, à 12:14

tiky

Re : Un bot pour les stats du topic "Votre âge?"

Première correction:

#!/usr/bin/python
#-*- coding: utf-8 -*-
# Copyright 2008 Pierre Villemot <tiky.halbaroth AT gmail DOT com>
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA					    
import urllib2
from BeautifulSoup import BeautifulSoup
from time import gmtime, strftime, sleep
import re, sys, math

url_format = "http://forum.ubuntu-fr.org/viewtopic.php?id=%s&p=%s"

class agebot:
	def __init__( self, url, topic_id ):
		self.url = url
		self.topic_id = topic_id
		self.last_page = 0
		self.users = {}
	def url_open( self, url ):
		try:
			file = urllib2.urlopen( url )
		except urllib2.HTTPError, e:
			if e.code == 404:
				print "%s 404 Not Found !"%( url )
			else:
				print "%s %d:%s"%( url, e.code, e.msg )
		except urllib2.URLError, e:
			print "%s %s"%( url, e.reason[1] )
		else:
			return file
	def count_page( self ):
		file = self.url_open( self.url%( self.topic_id, 1 ) )
		html = file.read()
		soup = BeautifulSoup( html )
		links = soup.findAll( attrs={ "href": re.compile(r"viewtopic.php\?id=%s"%( self.topic_id ) ) } )
		self.last_page = sorted( [ link.string for link in links if re.match( "\d+", link.string ) ] )[-1]
		print u"%s page(s) trouvée(s)"%( self.last_page )
	def parser( self ):
		self.count_page()
		for page in range(1):#range( int(self.last_page)+1 ):
			file = self.url_open( self.url%( self.topic_id, page ) )
			soup = BeautifulSoup( file.read() )
			self.search_users( soup )
			file.close()
			sys.stdout.write("\rPage %s/%s"%( page, self.last_page ))
			sys.stdout.flush()
		print ""
	def search_users( self, soup ):
		posts = soup.findAll( name="div", attrs={ "id": re.compile( r"p\d+" ) } )
		for post in posts:
			current_year = strftime("%Y", gmtime() )
			date = post.find( name="a", attrs={ "href": re.compile(r"viewtopic.php\?pid=\d+#p\d+" ) } )
			if date:
				year = re.match( "Le [\d]{2}/[\d]{2}/([\d]{4})", date.string )
				if not year and re.match( "[Hier|Aujourd'hui]", date.string ):
					year = current_year
				else:
					year = year.group( 1 )
				offset = int(current_year) - int(year)
				user = post.find( name="a", attrs={ "href": re.compile( r"profile.php\?id=\d+") } )
				msg = post.find( name="div", attrs={ "class": "postmsg" } )
				if msg != None and user:
					try:
						age = re.search( "([\d]{1,3}) ?ans", msg.contents[1].__str__() ).group( 1 )
					except:
						pass
					else:
						age = int( age ) + offset
						if age >= 10 and age <= 90:
							self.users[ user.string ] = age
	def stats( self ):
		users = sorted( self.users.values() )
		freqs = {}
		total = 0.0
		for age in users:
			total += age
			if freqs.has_key( age ):
				freqs[ age ] += 1
			else:
				freqs[ age ] = 1
		average = total/len( self.users )
		esperance = 0
		for key, value in freqs.items():
			esperance += key * value / len( self.users )
		deviation = 0
		for key, value in freqs.items():
			deviation += value/total*( key - esperance )**2
		deviation = math.sqrt( deviation )
		extremums = users[0::len(users)-1]
		print "%s réponse(s)"%( len( self.users )
		print "Total %s ans"%( total ) 
		print "Moyenne %s ans"%( average )
		print "Espérance %s ans"%( esperance )
		print "Écart-type %s ans"%( deviation )
		print "Le plus jeune a %s ans, le plus âgé %s ans"%( extremums[0], extremums[1] )
		for user, age in self.users.items():
			print "%s: %s ans"%( user, age )

if __name__ == "__main__":
	ab = agebot( url_format, 4002 )
	ab.parser()
	ab.stats()

Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#4 Le 29/07/2008, à 23:40

alexises

Re : Un bot pour les stats du topic "Votre âge?"

perso j'ai fait le même projet mais j'ai penser à un truc beaucoup plus simple big_smile
pour que l'on puisse si on le shoutée frimer au anif j'ai pensé coder ca en php juste un tit scripte et une bdd qui retient le pseudo et la date de néssance big_smile
je pense que cela sera beaucoup plus stable big_smile
me reste plus que la partie qui affiche les stats et c'est impec
[edit] j'a mis mon code sous licence bsd cool mais je ne le fournis pas pour le moment tent que je n'ai pas finis une premiére version complette sauf si vous y tenez vrément

Dernière modification par alexises (Le 29/07/2008, à 23:41)


/!\ aveugle ne pas matraquer /!\
¨¨¨                                       ¨¨¨

il est ou le bouton poster ?

Hors ligne

#5 Le 29/07/2008, à 23:47

tiky

Re : Un bot pour les stats du topic "Votre âge?"

Uhm, oui mais tu veux la mettre où ta base de donnée, le plus simple reste d'attendre le nouveau forum, avec un peu de chance on pourra y laisser sa date de naissance et avec un script python ou php tout bête, se connecter à la base de donnée.


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#6 Le 30/07/2008, à 00:28

alexises

Re : Un bot pour les stats du topic "Votre âge?"

oui big_smile la c'est le top big_smile chez moi suffira donc de virer un bon de code de canger les logins et le tour est jouer


/!\ aveugle ne pas matraquer /!\
¨¨¨                                       ¨¨¨

il est ou le bouton poster ?

Hors ligne

#7 Le 31/07/2008, à 14:38

alexises

Re : Un bot pour les stats du topic "Votre âge?"

on a un facon différente de voir le truc big_smile
j'ai finis la version 1 de mon code

 <!--
 Copyright (c) 2008 Lameire Alexis
All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -->
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
   <head>
       <title>pendu adapter pour utilisation sur forum de discussion</title>
       <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
       <link rel="stylesheet" media="screen" type="text/css" title="Essai" href="essai.css" />
   </head>
   <body>
<?php
//connection et selection de la table
mysql_select_db('pendu');
/*
------------------------------------------------------------------------------------------------------------------------------------------------------------------
traitement des données récupées
------------------------------------------------------------------------------------------------------------------------------------------------------------------
*/
if (!empty($_POST['pseudo']) and  !empty($_POST['jour']) and !empty($_POST['mois']) and !empty($_POST['anne']))
{
	$_POST['pseudo'] = mysql_real_escape_string(htmlspecialchars($_POST['pseudo']));
	$_POST['jour'] = mysql_real_escape_string(htmlspecialchars($_POST['jour']));
	$_POST['mois'] = mysql_real_escape_string(htmlspecialchars($_POST['mois']));
	$_POST['anne'] = mysql_real_escape_string(htmlspecialchars($_POST['anne']));
	$requette = mysql_query("SELECT pseudo FROM age WHERE pseudo ='{$_POST['pseudo']}'");
	$pseudo_existent = mysql_num_rows($requette);
	if ($pseudo_existent == 1)
	{
		echo '<p>erreur : pseudo déjà utiliser, vous avrez peut étre déjà rentrer une info</p>';
	}
	else
	{
		$date = $_POST['anne'] . '/' . $_POST['mois'] . '/' . $_POST['jour'];
		mysql_query("INSERT INTO age VALUES('','{$_POST['pseudo']}','{$date}')");
	}
			
}
/*
------------------------------------------------------------------------------------------------------------------------------------------------------------------
affichage du formulaire
------------------------------------------------------------------------------------------------------------------------------------------------------------------
*/
?>
<form method="post" action="age.php">
	<p>pseudo :
		<input type="text" name="pseudo" /><br />
		date de naissance :
		<select name="jour">
<?php
for ($jour = 1; $jour  <= 31; $jour++)
{
	echo '<option value="'.$jour.'">'.$jour.'</option>';
}
?>
		</select>
		<select name="mois">
			<option value = "01">janvier</option>
			<option value = "02">fevrier</option>
			<option value = "03">mars</option>
			<option value = "04">avril</option>
			<option value = "05">mais</option>
			<option value = "06">juin</option>
			<option value = "07">juillet</option>
			<option value = "08">aout</option>
			<option value = "09">septembre</option>
			<option value = "10">octobre</option>
			<option value = "11">novembre</option>
			<option value = "12">décembre</option>
		</select>
		<input type="text" name="anne" size="4" maxlength="4" /> <br />
		<input type="submit" /> <br />
	<p/>
</form>
<?php
/*
------------------------------------------------------------------------------------------------------------------------------------------------------------------
calcul des stats
------------------------------------------------------------------------------------------------------------------------------------------------------------------
*/
$requette = mysql_query('SELECT date_de_nessance FROM age');
$date[0] = date('Y');
$date[1] = date('m');
$date[2] = date('d');
while ($date_a_traiter = mysql_fetch_array($requette))
{
	$date_a_traiter = date_parse($date_a_traiter[0]);
	$age_sans_anif = $date[0] - $date_a_traiter['year'];
	if ($date[1] < $date_a_traiter['month'] or $date[1] <= $date_a_traiter['month'] and $date[2] < $date_a_traiter['day'])
	{
		$age_sans_anif --;
	}
	$age[] = $age_sans_anif;	
}
foreach ($age as $age_une_personne)
{
	$age_total += $age_une_personne;
}
//calcul du total des ages 
echo '<p> les ubunteros cummulent à eux tous ' . $age_total .' ans <br />'; 
// calcul de la moyenne 
$nb_participent = count($age);
$moyenne = $age_total / $nb_participent;
echo 'la moyennes est de '. $moyenne . ' ans <br />';

/*
------------------------------------------------------------------------------------------------------------------------------------------------------------------
calcul  des différentes tranches
------------------------------------------------------------------------------------------------------------------------------------------------------------------
*/

foreach ($age as $age_une_personne)
{
	$i = 9; 
	$j = 0;
	while ($i <= 94)
	{
		if ($age_une_personne >= $i and $age_une_personne <= $i + 5)
		{
			$categorie[$j][0] ++;
		}
		$categorie[$j][2] = $i;
		$categorie[$j][3] = $i + 5; 
		$i += 5; 
		$j ++;
	}		
}
echo '<br /><strong>liste des catégorie d\'ubunteros</strong>';
for ($i = 0; $i <= 17; $i ++)
{
	if ($categorie[$i][0] == 0)
	{
		$categorie[$i][1] = 0;
	}
	else
	{
		$categorie[$i][1] = ($categorie[$i][0] * 100) / $nb_participent;
	}
	if (!isset($categorie[$i][0]))
	{
		$categorie[$i][0] = 0;
	}
	echo '<br /> entre '. $categorie[$i][2] . ' et ' . $categorie[$i][3] . ' il y a ' . $categorie[$i][0] . ' membres [' . $categorie[$i][1] . '%]';
}
?>
</form>
   </body>
</html>

j'ai enlever l fonction de connec à la bdd big_smile
je dois implementer encore le plus jeune et le plus vielle utilisateur big_smile
(cela sera pas trop dur une ou 2 variable et basta)
l'équart type et j'ai un ptit bug mineur à corriger (certainement un comflit de variable)

Dernière modification par alexises (Le 31/07/2008, à 16:05)


/!\ aveugle ne pas matraquer /!\
¨¨¨                                       ¨¨¨

il est ou le bouton poster ?

Hors ligne

#8 Le 31/07/2008, à 22:10

Sir Na Kraïou

Re : Un bot pour les stats du topic "Votre âge?"

O_o
Euh... j'ai pas 43 ans, moi ! tongue


Descendant de Charlemagne et de LUCA.
Bleu, en l'hommage d'un truc bleu. :'(
C'est pas du bleu.
C'est pas le lac de Genève, c'est le Lac Léman.

Hors ligne

#9 Le 01/08/2008, à 02:03

footware

Re : Un bot pour les stats du topic "Votre âge?"

Par contre moi, j'en ai bien 240... big_smile

Dernière modification par footware (Le 01/08/2008, à 02:04)


Mieux vaut porter sa croix que trainer son boulet : au bout du chemin la croix a son utilité.

Hors ligne

#10 Le 01/08/2008, à 02:12

tiky

Re : Un bot pour les stats du topic "Votre âge?"

@footware: Toi c'est normal, il a pris un des stats que tu as fait au début... Si je relance le bot, il  ne te donne plus 240 ans smile. Mais si tu dis que c'est bien le cas, alors le grand schtroumpf a du soucis à se faire car tu vas bientôt le rattraper.

Dernière modification par tiky (Le 01/08/2008, à 02:13)


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#11 Le 01/08/2008, à 09:17

®om

Re : Un bot pour les stats du topic "Votre âge?"

Il ne faut pas mettre que les âges, il faut, à partir de la date du post, calculer l'année de naissance, et refaire la différence jusqu'à l'année actuelle.
Quelqu'un qui a dit qu'il avait 15 ans en 2004, bah il n'a plus 15 ans smile

Hors ligne

#12 Le 01/08/2008, à 10:04

tiky

Re : Un bot pour les stats du topic "Votre âge?"

@om: c'est déjà le cas big_smile


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#13 Le 01/08/2008, à 10:06

®om

Re : Un bot pour les stats du topic "Votre âge?"

tiky a écrit :

@om: c'est déjà le cas big_smile

ok, j'ai pas lu big_smile

®om, avec un ® smile

Hors ligne

#14 Le 01/08/2008, à 13:19

alexises

Re : Un bot pour les stats du topic "Votre âge?"

bon le miens est assé mature pour étre mis sur le web big_smile
je vous laisse tester dans 5 pitite minutes

j'ai un tit prob hmm j'utilise une fonction php5 mais mon ebergeur aparament n'est pas a jour snif

Dernière modification par alexises (Le 01/08/2008, à 14:17)


/!\ aveugle ne pas matraquer /!\
¨¨¨                                       ¨¨¨

il est ou le bouton poster ?

Hors ligne

#15 Le 06/08/2008, à 19:48

footware

Re : Un bot pour les stats du topic "Votre âge?"

Est-ce que vous avez pris en compte que certains donnent leur âge sans rajouter " ans", d'autres le donnent en lettres et quelques uns par énigmes ?

Bon courage... tongue


Mieux vaut porter sa croix que trainer son boulet : au bout du chemin la croix a son utilité.

Hors ligne