· 7 years ago · Nov 23, 2018, 06:58 PM
1# -*- coding: utf-8 -*-
2from bs4 import BeautifulSoup
3from math import *
4import requests
5import sqlite3
6import time
7import re
8
9def contientNombres(inpute):
10 return any(char.isdigit() for char in inpute)
11
12URL = "https://www.kebab-frites.com"
13
14print("Création et/ou ouverture de la base de données kebabs.db...")
15
16databaise = sqlite3.connect("kebabs.db")
17curseur = databaise.cursor()
18
19print("Récupération du code de la page d'accueil de kebab-frites.com...")
20
21soupe = BeautifulSoup(requests.get("https://www.kebab-frites.com/kebab/france-p1.html").content, "html.parser")
22
23departements = []
24
25for i in range(3,6):
26 for colonne in soupe.findAll("div", {"class": "colonne3"})[i].select("a"):
27 departements.append([str(colonne.text[7:]), str(URL + colonne["href"])])
28
29for departement in departements:
30
31 print("Création de la table pour le département : " + departement[0] + " dans la base de données...")
32
33 curseur.execute("""
34 CREATE TABLE IF NOT EXISTS """ + ''.join(e for e in departement[0] if e.isalnum()).upper() + """(
35 id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
36 nom TEXT,
37 adresse TEXT,
38 priorite TEXT,
39 note INTEGER,
40 nbr_commentaires INTEGER,
41 validay TEXT
42 )
43 """)
44
45 databaise.commit()
46
47 print("Récupération des kebabs par villes du département : " + departement[0] + "...")
48
49 soupe = BeautifulSoup(requests.get(departement[1]).content, "html.parser")
50
51 villes = []
52
53 for lplace_ville in soupe.find_all("a", {"class": "lplace"}):
54 villes.append([str(lplace_ville.text), str(URL + soupe.find("a", {"id": str("v_" + lplace_ville['name'])})['href'])])
55
56 for ville in villes:
57
58 soupe = BeautifulSoup(requests.get(ville[1]).content, "html.parser")
59 nbr_kebabs = int(soupe.find("div", {"class": "results"}).text[-3:])
60 id = str("".join(list(filter(str.isdigit, re.search("-v(.*).html", ville[1]).group(1)))))
61
62 print("Récupération des kebabs de la ville : " + ville[0] + " (ID : " + str(id) + ")...")
63
64
65
66 if nbr_kebabs <= 20:
67 for kebab in soupe.findAll("a", {"class": "title"})[:nbr_kebabs]:
68 soupe_k = BeautifulSoup(requests.get(str(URL + kebab["href"])).content, "html.parser")
69 nom = str(kebab.select("strong")[0].text)
70 adresse = str(soupe_k.find("span", {"property":"v:street-address"}).text) + " - " + str(soupe_k.find("span", {"property":"v:postal-code"}).text) + " " + str(soupe_k.find("span", {"property":"v:locality"}).text)
71 note = int(soupe_k.find("span", {"class": "bg_note_big"}).find("span")["class"][0][1:]) / 10
72 if "Carte de fidélité" in str(soupe_k.findAll("div", {"class": "info-desc"})[-1]):
73 priorite = "OUI"
74 else:
75 priorite = "NON"
76 if contientNombres(str(soupe_k.find("p", {"class":"avis"}).find("strong").text)) == True:
77 nbr_commentaires = int("".join(list(filter(str.isdigit, str(soupe_k.find("p", {"class":"avis"}).find("strong").text)))))
78 else:
79 nbr_commentaires = 0
80 print("Ajout d'une nouvelle entrée de la base de données : " + nom + " (Priorité : " + priorite + ")")
81 curseur.execute("""
82 INSERT INTO """ + ''.join(e for e in departement[0] if e.isalnum()).upper() + """(nom, adresse, priorite, note, nbr_commentaires, validay) VALUES(?, ?, ?, ?, ?, ?)""", (nom, adresse, priorite, note, nbr_commentaires, "NON"))
83 databaise.commit()
84 time.sleep(0.25)
85 else:
86 nbr_pages = floor(nbr_kebabs / 20)
87 for i in range(0, nbr_kebabs - 1):
88 params = {'tab_search': 'a:5:{s:9:"city_name";s:'+ str(len(ville[0])) + ':"' + str(ville[0].replace(" ", "+")) + '";s:2:"sp";s:12:"kebab-frites";s:8:"id_ville";s:' + str(len(id)) + ':"' + str(id) + '";s:7:"orderby";s:4:"rank";s:8:"deb_page";i:'+ str(i * 20) +';}'}
89 sp = requests.post("https://www.kebab-frites.com/lib/getPlacesList.php", data=params)
90 soupe_sp = BeautifulSoup(sp.content, "html.parser")
91 for kebab in soupe_sp.findAll("a", {"class": "title"})[:20]:
92 soupe_k = BeautifulSoup(requests.get(str(URL + kebab["href"])).content, "html.parser")
93 nom = str(kebab.select("strong")[0].text)
94 adresse = str(soupe_k.find("span", {"property":"v:street-address"}).text) + " - " + str(soupe_k.find("span", {"property":"v:postal-code"}).text) + " " + str(soupe_k.find("span", {"property":"v:locality"}).text)
95 note = int(soupe_k.find("span", {"class": "bg_note_big"}).find("span")["class"][0][1:]) / 10
96 if "Carte de fidélité" in str(soupe_k.findAll("div", {"class": "info-desc"})[-1]):
97 priorite = "OUI"
98 else:
99 priorite = "NON"
100 if contientNombres(str(soupe_k.find("p", {"class":"avis"}).find("strong").text)) == True:
101 nbr_commentaires = int("".join(list(filter(str.isdigit, str(soupe_k.find("p", {"class":"avis"}).find("strong").text)))))
102 else:
103 nbr_commentaires = 0
104 print("Ajout d'une nouvelle entrée de la base de données : " + nom + " (Priorité : " + priorite + ")")
105 curseur.execute("""
106 INSERT INTO """ + ''.join(e for e in departement[0] if e.isalnum()).upper() + """(nom, adresse, priorite, note, nbr_commentaires, validay) VALUES(?, ?, ?, ?, ?, ?)""", (nom, adresse, priorite, note, nbr_commentaires, "NON"))
107 databaise.commit()
108 time.sleep(0.25)
109
110databaise.close()