#!/usr/bin/env python #------------------------------------------------------------- # # # Copyright (C) anpe.py gnunux@2004 (gnunux chez laposte point net) # # Ce programme est un logiciel libre ; vous pouvez le # redistribuer et/ou le modifier conformement aux dispositions # de la Licence Publique Generale GNU, telle que publiee par la # Free Software Foundation ; version 2 de la licence, ou encore # (a votre choix) toute version ulterieure. # # Ce programme est distribue dans l'espoir qu'il sera utile, # mais SANS AUCUNE GARANTIE ; sans meme la garantie implicite # de COMMERCIALISATION ou D'ADAPTATION A UN OBJET PARTICULIER. # Pour plus de detail, voir la Licence Publique Generale GNU . # # Vous devez avoir recu un exemplaire de la Licence Publique # Generale GNU en meme temps que ce programme ; si ce n'est # pas le cas, ecrivez a la Free Software Foundation Inc., 675 # Mass Ave, Cambridge, MA 02139, Etats-Unis. # #------------------------------------------------------------- #------->Bogue<-------- #Attention la date n'est pas pris en compte dans l'interface #les modifications dans les preferences ne sont pas sauvegarder. #visiblement il faut au moins 2 comptes :/ import string import urllib2 import re import time import os global compte global compte2 global tempsattente fichier = "/tmp/anpe.rss" #attention, le repertoire doit exister !!!" repannonce = "/tmp/anpe/" lien = "http://gnunux/anpe/anpe.rss" # La duree de la session est de 600 secds. Il vaut mieux mettre moins donc ;) tempsattente = 550 ##option possible pour la variable compte2, voir descriptif en dessous #niveauEffectif=&\ #affichageRome=&\ #libelleAppellation=&\ #libelleRome=&\ #appellationCodeOgr=&\ #codeRomeId=&\ #listeLieuxTravail=&\ #dureeEmissionId=&\ #secteurActivite1Id=&\ #secteurActivite2Id=&\ #typeContratId=&\ #qualificationId=&\ #fourchetteSalaireId=&\ #natureOffreId=&\ #dureeTravailHebdo=&\ #experience=false&\ #dureeExperience=&\ #uniteDureeExperienceId=&\ #typeFormationId=&\ #domaineFormationId=&\ #motsCles=" #exemple : tous les emplois en cote d'or compte2 = "listeLieuxTravail=21D" ##option de la variable compte #profilId=&\ #type=&\ #nature=&\ #gtc=&\ #exemple : tous les cdi compte = "profilId=type=Public&nature=E1>c=1&nombreOffreParPage=50" ##nombreOffreParPage #Correspond au nombre d'offre possible #valeur du site : 20, 30, 50 (a tester exactement) ##Duree # Tout #1 Hier #2 3 jours #3 1 semaine #4 2 semaines #5 1 mois #6 3 mois #------------------------------------------- ##secteurActivite1Id et secteurActivite2Id # Tout #95 Activ. menage pour employeur personnel domestique #91 Activites associatives #99 Activites extra-territoriales #70 Activites immobilieres #72 Activites informatiques #92 Activites recreatives, culturelles et sportives #75 Administration publique #01 Agriculture, chasse, services annexes #90 Assainissement, voirie et gestion des dechets #66 Assurance #14 Autres industries extractives #67 Auxiliaires financiers et d'assurance #41 Captage, traitement et distribution d'eau #23 Cokefaction, raffinage, industries nucleaires #52 Commerce de detail reparation articles domestiques #51 Commerce de gros et intermediaires du commerce #50 Commerce et reparation automobile #45 Construction #22 Edition, imprimerie, reproduction #80 Education #10 Extraction de houille, de lignite et de tourbe #12 Extraction de minerais d'uranium #13 Extraction de minerais metalliques #11 Extraction d'hydrocarbures ; services annexes #35 Fabrication d'autres materiels de transport #31 Fabrication de machines et appareils electriques #29 Fabrication de machines et d'equipements #36 Fabrication de meubles ; industries diverses #32 Fabrication equipements radio, TV et communication #30 Fabrication machines bureau, materiel informatique #26 Fabrications produits mineraux non metalliques #33 Fabri.instru.medicaux,precision,optique,horlogerie #55 Hotels et restaurants #34 Industrie automobile #24 Industrie chimique #18 Industrie de l'habillement et des fourrures #25 Industrie du caoutchouc et des plastiques #19 Industrie du cuir et de la chaussure #21 Industrie du papier et du carton #16 Industrie du tabac #17 Industrie textile #15 Industries alimentaires #65 Intermediation financiere #71 Location sans operateur #27 Metallurgie #05 Peche, aquaculture, services annexes #64 Postes et telecommunications #40 Production.distrib.d'electricite de gaz et chaleur #73 Recherche et developpement #37 Recuperation #85 Sante et action sociale #63 Services auxiliaires des transports #74 Services fournis principalement aux entreprises #93 Services personnels #02 Sylviculture exploitation forestieres servi.annex. #62 Transports aeriens #61 Transports par eau #60 Transports terrestres #28 Travail des metaux #20 Travail du bois et fabrication d'articles en bois #96 Ttes.Activ.menage:producteur biens a usage propre #97 Ttes.Activ.menage:producteur servi.a usage propre #----------------------------- ##typeContratId (Tout type de contrat) #CDD Contrat a duree eterminee #CDI Contrat a duree indeterminee #INT Contrat travail intermittent #SAI Contrat travail saisonnier #FRA Franchise #CCE Profession commerciale #LIB Profession liberale #REP Reprise d'entreprise #MIS Travail interimaire #--------------------- ##qualificationId (Qualification) #1 Manoeuvre #2 Ouvrier specialise #3 Ouvrier qualifie (P1,P2) #4 Ouvrier qualifie (P3,P4,OHQ) #5 Employe non qualifie #6 Employe qualifie #7 Technicien ou dessinateur #8 Agent de maitrise #9 Cadre #-------------------------------- ##fourchetteSalaireId (Tout salaire annuel) #1 Moins de 13000 Euros #2 Superieur ou egal a 13 000 Euros #3 Superieur ou egal a 15 000 Euros #4 Superieur ou egal a 18 000 Euros #5 Superieur ou egal a 23 000 Euros #6 Superieur ou egal a 30 000 Euros #7 Superieur ou egal a 45 000 Euros #-------------------------- ##natureOffreId (Toute nature d'offre) #FA A.F.P.E. #F8 Aide Degressive Employeur #I3 CES/CEC Insertion Economique #E8 Contrat d'Acces a l'Emploi #E6 Contrat d'Adaptation #E2 Contrat d'Apprentissage #E5 Contrat de Qualification #F7 Contrat de Qualification Adulte #I1 Contrat d'Insertion #E0 Contrat d'Insertion par l'Activite (DOM) #E4 Contrat d'Orientation #F6 Contrat Emploi Consolide (C.E.C) #F5 Contrat Emploi Jeune #E9 Contrat Emploi Solidarite (C.E.S) #F2 Contrat Initiative Emploi (C.I.E) #F9 Contrats Jeunes en Entreprise #E1 Contrats tout public #NS Emploi Non Salarie #E7 Emploi Saisonnier #I2 G.E.I.Q. #FC Revenu Minimum Activite #FB Stage d'Acces a l'Entreprise (S.A.E.) #----------------------------- ##dureeTravailHebdo (heures par semaine max.) #----------------------------- ##experience # #expérience de #--- #\n''' output = output + ' \n' % self.URI output = output + ' Quiston RSS $Revision: 1.7 $\n' output = output + ' %s\n' % self.title output = output + ' %s\n' % self.link output = output + ' %s\n' % self.description output = output + ' \n' output = output + ' \n' for item in self.items: output = output + ' \n' % item['URI'] output = output + ' \n' output = output + ' \n' output = output + ' \n' return output def content(self): output = '' for item in self.items: output = output + ' \n' % item['URI'] output = output + ' %s\n' % item['title'] output = output + ' %s\n' % item['URI'] output = output + ' %s\n' % item['description'] output = output + ' \n' % self.URI output = output + ' %s\n' % item['date'] output = output + ' \n' return output def footer(self): return '\n' def add_item(self,entryid,title='',desc='',date='',charset='iso-8859-2'): 'Date in ISO (util.isodate() format), entryid in ASCII, the rest in specified encoding.' ### add removing of tags from input (additional namespaces in future?) if '<' in title or '<' in desc: raise ValueError,'Illegal - tags in input, no sanitization yet, sorry!' ### This assumes a lot. Needs expanding in case Web items are not in the same HTML. self.items.append({'URI':self.link + entryid, 'title': unicode(title,charset), 'description': unicode(desc,charset), 'date' :date }) def output(self): result = startxml result = result + self.header() + self.content() + self.footer() self.items = [] return result.encode('utf-8') #------------------------------------------------------------- # Classe retournant les offres. A l'initialisation, # recuperation de la session # # offres() # # code_recherche(text) -> la syntaxe des options : # code_anpe - intitule, recupere donc le code_anpe # affiche_toi(compte) -> lance la recherche #------------------------------------------------------------- class offres: def option(self): print "Paramettrage" url = "http://www.anpe.fr/consultationoffres/InitialiserRecherche.do;jsessionid=" + self.jsession[0] InitialiserRecherche = urllib2.urlopen(url, compte2).read() def affiche_toi(self): print "Recherche des nouvelles offres" feed = RSSFeed(lien, 'Annonce anpe', 'http://www.anpe.fr/consultationoffres/AfficherOffre.do;jsessionid=' + self.jsession[0] + '?reference=', 'Les annonces de l\'anpe') url = 'http://www.anpe.fr/consultationoffres/ConsulterToutesLesOffres.do;jsessionid=' + self.jsession[0] htmlSource = urllib2.urlopen(url, compte).read() # print htmlSource #Test si le nombre d'offre ne depasse pas 100 (limite du site de l'anpe) # if htmlSource.rfind('passe 100 offres.') != -1: # nbre_offre = re.findall('(.*?)<',htmlSource) # print 'Le nombre d\'offres est trop important : ' + nbre_offre[0] + ' Veuillez affiner les criteres' # #faut arrete tout ca # # listeDeLiens = re.findall('window.parent.center.location="(.*?)"',htmlSource) # print listeDeLiens # # offre = 'http://www.anpe.fr' + listeDeLiens[0] # htmlSource = urllib2.urlopen(offre).read() # # numero_offre = re.findall('AfficherOffre.do;jsessionid=' + self.jsession[0] + '?reference=(.*?)" class="liste">',htmlSource) numero_offre = re.findall('reference=(.*?)"',htmlSource) intitule_offre = re.findall('class="liste">(.*?)<',htmlSource) # lieu_offre = re.findall('
(.*?)<',htmlSource) # resultat = "" i = 0 for intitule in intitule_offre: # entryid,title='',desc='',date='',charset='iso-8859-2'): lefichier = repannonce + numero_offre[i] if os.path.exists(lefichier): fileobject = open(lefichier, 'r') corpsoffre = fileobject.read() fileobject.close() else: print "Recherche de la description de l'offre " + numero_offre[i] offreSource = urllib2.urlopen('http://www.anpe.fr/consultationoffres/AfficherOffre.do;jsessionid=' + self.jsession[0] + '?reference=' + numero_offre[i]).read() #contenuoffre = re.findall('"0" class="textecourant">(.*?)',offreSource) contenuoffre = re.findall('(.*?)
',offreSource) corpsoffre = contenuoffre[0].replace("
", " ") corpsoffre = corpsoffre.replace("&", "et") fileobject = open(lefichier, 'w') fileobject.write(corpsoffre) fileobject.close() feed.add_item(numero_offre[i], intitule, corpsoffre, '', 'iso-8859-15') i= i+2 print "Ecriture dans le fichier " + fichier fileobject = open(fichier, 'w') fileobject.write(feed.output()) fileobject.close() # fenetrePrincipale.afficher_resultat(principale, # compte, # numero, # intitule_offre[i], # lieu_offre[i]) # def __init__(self): print "Recuperation de la session" page_accueil = urllib2.urlopen("http://www.anpe.fr/consultationoffres/InitialiserCriteres.do").read() self.jsession = re.findall('fleche_bas.gif;jsessionid=(.*?)"',page_accueil) if __name__ == "__main__": anpe = offres() anpe.option() while 9 <= 10 : anpe.affiche_toi() print "Fait" print "Attente" time.sleep(tempsattente)