510 lines
15 KiB
Python
510 lines
15 KiB
Python
|
#!/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.)
|
||
|
#----------------------------- </table>
|
||
|
##experience
|
||
|
#<input type="checkbox" name="experience" value="false" onclick="javascript:initExperience()"/>
|
||
|
#expérience de
|
||
|
#---
|
||
|
#<input type="text" name="dureeExperience" maxlength="2" size="3" value="
|
||
|
#---
|
||
|
#<select name="uniteDureeExperienceId (Duree)
|
||
|
#A Ans
|
||
|
#M Mois
|
||
|
#---------------------------------
|
||
|
##typeFormationId (Tout type de formation)
|
||
|
#ES BAC Economique et Social
|
||
|
#STI BAC Industriel
|
||
|
#STL BAC Laboratoire
|
||
|
#L BAC Litteraire
|
||
|
#SMS BAC Medico-Social
|
||
|
#PRO BAC Professionnel
|
||
|
#S BAC Scientifique
|
||
|
#STT BAC Tertiaire
|
||
|
#BEP BEP
|
||
|
#C3A BEPC / 3ieme achevee
|
||
|
#BT Brevet de Technicien
|
||
|
#BM Brevet Maitrise
|
||
|
#BP Brevet Professionnel
|
||
|
#BTS BTS
|
||
|
#CAP CAP
|
||
|
#DCF DECF / DESCF
|
||
|
#DES DESS - DEA
|
||
|
#DEU DEUG / DEUST
|
||
|
#DCO Diplome Commercial / Gestion
|
||
|
#AU3 Diplome niveau BAC + 2
|
||
|
#AU2 Diplome niveau BAC + 3
|
||
|
#AU1 Diplome niveau BAC + 5
|
||
|
#DO Doctorat
|
||
|
#DUT DUT
|
||
|
#DEC Expert Comptable
|
||
|
#IGE Ingenieur Grande Ecole
|
||
|
#IEP Institut Etudes Politique
|
||
|
#LIC Licence
|
||
|
#MAI Maitrise
|
||
|
#MA Mastere / Magistere
|
||
|
#MIA MIAGE
|
||
|
#CP4 Primaire a 4ieme
|
||
|
#C12 Seconde / 1ere acheve
|
||
|
#---------------------
|
||
|
##domaineFormationId (Tout domaine de formation)
|
||
|
#21054 agriculture
|
||
|
#21554 agro-alimentaire
|
||
|
#21277 amenagement paysager
|
||
|
#12534 amenagement territoire
|
||
|
#22223 architecture
|
||
|
#45054 art
|
||
|
#41036 assurance
|
||
|
#24472 automatisation
|
||
|
#41062 banque/finance
|
||
|
#22354 batiment gros oeuvre
|
||
|
#22454 batiment second oeuvre
|
||
|
#12046 biologie
|
||
|
#21599 boucherie/charcuterie
|
||
|
#21538 boulangerie/patissier
|
||
|
#11554 chimie
|
||
|
#42050 coiffure
|
||
|
#34254 commerce international
|
||
|
#34532 commerce/vente
|
||
|
#32554 comptabilite
|
||
|
#21742 confection textile
|
||
|
#23662 construction mecanique
|
||
|
#13254 droit
|
||
|
#13154 economie
|
||
|
#24099 electricite equipement industrie
|
||
|
#24354 electronique
|
||
|
#12554 environnement
|
||
|
#42032 esthetique soin corporel
|
||
|
#10054 formation generale
|
||
|
#32076 gestion entreprise
|
||
|
#42754 hotellerie restauration
|
||
|
#42037 immobilier
|
||
|
#46072 industries et arts graphiques
|
||
|
#46454 information communication
|
||
|
#31054 informatique
|
||
|
#15254 langues
|
||
|
#14261 lettres
|
||
|
#31571 logistique
|
||
|
#31051 maintenance informatique
|
||
|
#34052 marketing
|
||
|
#11054 mathematique
|
||
|
#46457 multimedia
|
||
|
#21354 peche/aquaculture
|
||
|
#11454 physique
|
||
|
#34074 publicite
|
||
|
#31354 qualite
|
||
|
#23637 reparation automobile/moto
|
||
|
#33054 ressources humaines
|
||
|
#43454 sante
|
||
|
#13054 science politique
|
||
|
#12254 sciences de la terre
|
||
|
#14254 sciences humaines/sociales
|
||
|
#35054 secretariat
|
||
|
#42854 securite
|
||
|
#44054 social
|
||
|
#15454 sport
|
||
|
#45042 technique du spectacle
|
||
|
#24254 telecommunication
|
||
|
#42654 tourisme
|
||
|
#31854 transport
|
||
|
#23054 travail materiau
|
||
|
#22054 travaux publics
|
||
|
#12512 urbanisme
|
||
|
print "Initialisation"
|
||
|
|
||
|
startxml = '<?xml version="1.0" encoding="utf-8"?>\n'
|
||
|
|
||
|
class RSSFeed:
|
||
|
version = "1.0"
|
||
|
items = []
|
||
|
|
||
|
def __init__(self, URI, title, link, desc):
|
||
|
|
||
|
self.items = []
|
||
|
self.title = title
|
||
|
self.URI = URI
|
||
|
self.link = link
|
||
|
self.description = desc
|
||
|
|
||
|
def header(self):
|
||
|
|
||
|
output = '''<rdf:RDF xmlns="http://purl.org/rss/1.0/"
|
||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">\n'''
|
||
|
|
||
|
output = output + ' <channel rdf:about="%s">\n' % self.URI
|
||
|
output = output + ' <generator>Quiston RSS $Revision: 1.7 $</generator>\n'
|
||
|
output = output + ' <title>%s</title>\n' % self.title
|
||
|
output = output + ' <link>%s</link>\n' % self.link
|
||
|
output = output + ' <description>%s</description>\n' % self.description
|
||
|
output = output + ' <items>\n'
|
||
|
output = output + ' <rdf:Seq>\n'
|
||
|
|
||
|
for item in self.items:
|
||
|
output = output + ' <rdf:li rdf:resource="%s" />\n' % item['URI']
|
||
|
|
||
|
output = output + ' </rdf:Seq>\n'
|
||
|
output = output + ' </items>\n'
|
||
|
output = output + ' </channel>\n'
|
||
|
return output
|
||
|
|
||
|
def content(self):
|
||
|
output = ''
|
||
|
for item in self.items:
|
||
|
output = output + ' <item rdf:about="%s">\n' % item['URI']
|
||
|
output = output + ' <title>%s</title>\n' % item['title']
|
||
|
output = output + ' <link>%s</link>\n' % item['URI']
|
||
|
output = output + ' <description>%s</description>\n' % item['description']
|
||
|
output = output + ' <dc:source rdf:resource="%s" />\n' % self.URI
|
||
|
output = output + ' <dc:date>%s</dc:date>\n' % item['date']
|
||
|
output = output + ' </item>\n'
|
||
|
|
||
|
return output
|
||
|
def footer(self):
|
||
|
|
||
|
return '</rdf:RDF>\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('<font color="#FF0033">(.*?)<',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('</b><br>(.*?)<',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">(.*?)</td>',offreSource)
|
||
|
contenuoffre = re.findall('<td>(.*?)<BR></td>',offreSource)
|
||
|
corpsoffre = contenuoffre[0].replace("<BR>", " ")
|
||
|
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)
|