n/oldblog
Archived
1
0
Fork 0
This repository has been archived on 2024-02-13. You can view files and clone it, but cannot push or open issues or pull requests.
oldblog/scripts/dazibaweb/anpe-0.5.py

510 lines
15 KiB
Python
Raw Permalink Normal View History

2023-04-30 21:28:42 +02:00
#!/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&gtc=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&eacute;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)