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 130 131 132 133 134 135 136 137 138 139 140 141
| #!/usr/bin/python
"""capture des pages jaunes de l'annuaire avec mechanize et Beautiful soup"""
"""détecte les agences ayant une adresse mail et pas de site"""
import re
import codecs
from mechanize import Browser
from BeautifulSoup import BeautifulSoup
#la rubrique cherchée
rubrique = "Agences immobilieres"
"""Liste des codes des 97 departements francais"""
Depts=[str(i) for i in range(1,98)]
br = Browser()
for dep in Depts[61:62]:
"""Dans ce cas on ne traite que le departement du Pas de Calais=62
Pour la France entiere Depts[0:]"""
page=1
print "page en traitement =",page
csv_file = open(dep+'.csv', 'w') #ouverture d'un fichier pour stocker les resultats
csv_file.write( codecs.BOM_UTF8 )
br.open("http://www.pagesjaunes.fr") # ouverture du site des pages jaunes
forms=br.forms() #recherche de tous les formulaires
form2=[forms.next() for i in range(0,3)][2] #celui qui nous interesse (firebug)
form2.name="any" #on le nomme pour selection
c1=form2.find_control(type="text",id="quoiqui") #rubrique professionnelle
c1.value=rubrique # ce qu'on cherche (la variable globale rubrique)
c2=form2.find_control(type="text",id="PJ_ou")
c2.value=dep #le numero du departement
br.select_form(name="any")
response2 = br.submit() #renvoyer le questionnaire rempli
"""Traitement de la premiere page"""
soup=BeautifulSoup(response2.read()) #appel du parser sur la reponse
List=soup.findAll("li","N2_bloc_parution") # recherche sur style CSS des resultats
ListPossiblesWeb=br.links(url_regex="Redirection") #recherche des liens cryptes
CandidatsWeb=[link for link in ListPossiblesWeb if ('title','Site Web') in link.attrs] #ceux qui correspondent aux sites cryptes
indexweb=0
for liste in List:
raison=unicode(liste.find("h5","N4_bloc_parution_raison sclear").contents[2][6:]) #le nom de l'agence
adresse=unicode(liste.find('p',"N5_bloc_parution_adresse").contents[0][3:]) #son adresse
telephones=liste.find("ul","N6_bloc_parution_communication_div") #la liste de tous les numeros
telephone=unicode(telephones.find("strong").contents[0][1:])#le telephone
try:
blocsite=liste.find("ul","N4_bloc_parution_produits_pub") #recherche de l'annonce d'un site
anchor=blocsite.find("a")
siteweb=CandidatsWeb[indexweb] #OK il y a bien un site
indexweb+=1 #incrementer l'index
try:
br.follow_link(siteweb) #suivre le lien crypte
ressweb=br.response()
adweb=ressweb.geturl() #on recupere l'adresse decryptee du site
except:
adweb=u""
br.back() #retour a la page precedente
except: #en cas d'echec
adweb=u""
try:
blocmail=liste.find("p","N5_bloc_parution_mail")
mail=blocmail.find("a").contents[0]
except:
mail=u""
"""Ecriture des resultats extraits"""
raison=u'"'+raison+u'"'
adresse=u'"'+adresse+u'"'
telephone=u'"'+telephone+u'"'
adweb=u'"'+adweb+u'"'
mail=u'"'+mail+u'"'
if mail!=u'""' and adweb==u'""':
csv_file.write( raison.encode('utf-8') )
csv_file.write(u";".encode('utf-8'))
csv_file.write( adresse.encode('utf-8') )
csv_file.write(u";".encode('utf-8'))
csv_file.write( telephone.encode('utf-8') )
csv_file.write(u";".encode('utf-8'))
csv_file.write( mail.encode('utf-8') )
csv_file.write(u";".encode('utf-8'))
csv_file.write( adweb.encode('utf-8') )
csv_file.write(u"\n".encode('utf-8'))
"""Traitement des autres pages (pages suivantes)jusqu'a epuisement"""
while True:
page+=1
print "page en traitement =",page #pour voir l'avancement du travail
try:
Liens=[link for link in br.links() if ('class','page_suivante') in link.attrs]
next=Liens[0]
br.follow_link(next)
response3=br.response()
soup=BeautifulSoup(response3.read())
List=soup.findAll("li","N2_bloc_parution")
ListPossiblesWeb=br.links(url_regex="Redirection") #recherche des liens cryptes
CandidatsWeb=[link for link in ListPossiblesWeb if ('title','Site Web') in link.attrs] #ceux qui correspondent aux sites cryptes
indexweb=0
for liste in List:
raison=unicode(liste.find("h5","N4_bloc_parution_raison sclear").contents[2][6:]) #le nom de l'agence
adresse=unicode(liste.find('p',"N5_bloc_parution_adresse").contents[0][3:]) #son adresse
telephones=liste.find("ul","N6_bloc_parution_communication_div") #la liste de tous les numeros
telephone=unicode(telephones.find("strong").contents[0][1:])#le telephone
try:
blocsite=liste.find("ul","N4_bloc_parution_produits_pub") #recherche de l'annonce d'un site
anchor=blocsite.find("a")
siteweb=CandidatsWeb[indexweb] #OK il y a bien un site
indexweb+=1 #incrementer l'index
try:
br.follow_link(siteweb) #suivre le lien crypte
ressweb=br.response()
adweb=ressweb.geturl() #on recupere l'adresse decryptee du site
except:
adweb=u""
br.back() #retour a la page precedente
except: #en cas d'echec
adweb=u""
try:
blocmail=liste.find("p","N5_bloc_parution_mail")
mail=blocmail.find("a").contents[0]
except:
mail=u""
"""Ecriture des resultats extraits"""
raison=u'"'+raison+u'"'
adresse=u'"'+adresse+u'"'
telephone=u'"'+telephone+u'"'
adweb=u'"'+adweb+u'"'
mail=u'"'+mail+u'"'
if mail!=u'""' and adweb==u'""':
csv_file.write( raison.encode('utf-8') )
csv_file.write(u";".encode('utf-8'))
csv_file.write( adresse.encode('utf-8') )
csv_file.write(u";".encode('utf-8'))
csv_file.write( telephone.encode('utf-8') )
csv_file.write(u";".encode('utf-8'))
csv_file.write( mail.encode('utf-8') )
csv_file.write(u";".encode('utf-8'))
csv_file.write( adweb.encode('utf-8') )
csv_file.write(u"\n".encode('utf-8'))
except IndexError:#sortie de boucle quand le lien 'suivant' n'existe plus
break
csv_file.close() #fermeture du fichier des résultats avant de boucler |
Partager