[parser] un script allocine (en cours)

Autres projets et contributions
djipey
Chu Ko Nu
Messages : 437
Inscription : sam. 04 juin 2011, 10:13

[parser] un script allocine (en cours)

Message par djipey » ven. 12 août 2011, 20:15

Bonsoir.

Je me suis mis récemment à essayer de développer un petit script en python, pour m'entrainer et m'amuser. Je suis plutôt débutant dans ce langage, aussi je fais comme je peux. Il a pour but de récupérer les informations sur un film que le script reçoit en paramètre (enfin pour l'instant c'est harry potter d'office). Je voudrais vos avis et conseils sur le début du script.

Je l'ai fait avec python 2.7 et les modules beautifulSoup et requests. Je les ai choisis parce qu'ils sont faciles d'utilisation.

Mon code est pour l'instant procédural, je mettrai tout ça dans des fonctions plus tard. Ce que je voudrais savoir avant tout c'est si ma technique pour récupérer les informations est acceptable. J'ai regardé le code source de la page, et essayé de trouver des éléments pour récupérer les bonnes infos dans le code html. Voyez plutôt:

Code : Tout sélectionner

#!/usr/bin/python
# -*-coding:Utf-8 -* 



import requests
from BeautifulSoup import BeautifulSoup
import re


req = requests.get('http://www.allocine.fr/film/fichefilm_gen_cfilm=134925.html')
page = req.content

soup = BeautifulSoup(page)
#print soup.prettify()


# Renvoie le titre du film
titre=soup.findAll('title')
print "Titre du film: ", titre[0].renderContents()

# Renvoie le synopsis
#soup.findAll('p', limit=1)
synopsis=soup.findAll(property='v:summary')
print synopsis[0].renderContents()

# Renvoie le genre
genre=soup.findAll(href=re.compile(".?/film/tous/genre.?"))
print genre[0].renderContents()

# Renvoie la durée
duree=soup.findAll(text=re.compile(".?Dur.?e.?"))
duree=str(duree[0])
print duree[10:18]

# Renvoie l'année de production
annee=soup.findAll(href=re.compile(".?/film/tous/decennie.?"))
print annee[0].renderContents()

# Renvoie la compagnie qui produit le film
distributeur=soup.findAll(href=re.compile(".?/societe/fichesociete.?"))
print distributeur[0].renderContents()

# Renvoie les notes du film
notes=soup.findAll(attrs={"class" : "moreinfo"})
print notes[0].renderContents()
print notes[1].renderContents()
print notes[2].renderContents()

# Renvoie le réalisateur
realisateur=soup.findAll(rel='v:directedBy')
print realisateur[0].renderContents()

# Renvoie le titre original
titre_original=soup.findAll(attrs={"class" : "purehtml"})
titre_original=titre_original[0].renderContents()
titre_original=titre_original[4:]
titre_original=titre_original[:len(titre_original)-5]
print titre_original


# Renvoie le casting
acteurs=soup.findAll(rel='v:starring')
for case in acteurs:
	print case.renderContents()


Qu'en pensez vous? Qu'est ce que je devrais faire selon vous pour améliorer ce code?

benjarobin
Maître du Kyudo
Messages : 15446
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [parser] un script allocine (en cours)

Message par benjarobin » mar. 23 août 2011, 22:01

Pourquoi parser alors que l'on peut utiliser un service avec sortie en JSON :-) Mais je ne sais pas si son utilisation est légale (recherche allocine + JSON)
Zsh | KDE | PC fixe : core i7, carte nvidia | Portable : Asus ul80vt
Titre d'un sujet : [Thème] Sujet (état)

nonolapero
Daikyu
Messages : 68
Inscription : mar. 30 juin 2009, 19:26

Re: [parser] un script allocine (en cours)

Message par nonolapero » mar. 23 août 2011, 22:33


djipey
Chu Ko Nu
Messages : 437
Inscription : sam. 04 juin 2011, 10:13

Re: [parser] un script allocine (en cours)

Message par djipey » sam. 27 août 2011, 15:23

Merci.

J'ai donc recommencé à coder plus intelligemment. Je n'ai pas eu beaucoup le temps d'avancer, mais voilà grosso modo ce que donne une classe Film:

Code : Tout sélectionner

#!/usr/bin/python
# -*-coding:Utf-8 -* 


import requests
from BeautifulSoup import BeautifulSoup
import re



# On définit dans ce fichier les méthodes du modules film.
# But: créer une classe 'film', avec des attributs comme l'année de production, ou le réalisateur,
# et des méthodes, comme get_title().


class Film:
	"""classe définissant un film, caractérisé par:
	- un titre
	- une année de production
	- un producteur
	- un genre
	- etc
	"""



	def __init__(self, code):
		self.code = str(code)

		self.req = requests.get('http://api.allocine.fr/xml/movie?partner=3&profile=large&code='+self.code)
		self.page = self.req.content

		self.soup = BeautifulSoup(self.page)
		self.title = ""
		self.originalTitle = ""
		self.year = ""
		self.directors = ""
		self.genres = ""
		self.movieType = ""
		self.synopsis = ""
		self.actors = ""
		self.runtime = 0
		self.duree = ""
		self.releaseDate = ""
		self.releaseState = ""


	def return_page(self):
		return self.soup.prettify()

	def get_title(self):
		self.title = self.soup.findAll('title')
		self.title = self.title[0].renderContents()

	def get_originalTitle(self):
		self.originalTitle = self.soup.findAll('originaltitle')
		self.originalTitle = self.originalTitle[0].renderContents()

	def get_year(self):
		self.year = self.soup.findAll('productionyear')
		self.year = self.year[0].renderContents()

	def get_directors(self):
		self.liste = self.soup.findAll('directors')

		for case in self.liste:
			self.directors += case.renderContents()
			self.directors += " "

	def get_genres(self):
		self.liste = self.soup.findAll('genre')

		# Rajouter une condition pour supprimer le dernier espace de la boucle.
		for case in self.liste:
			self.genres += case.renderContents()
			self.genres += " "

	def get_movieType(self):
		self.movieType = self.soup.findAll('movietype')
		self.movieType = self.movieType[0].renderContents()

	def get_synopsis(self):
		self.synopsis = self.soup.findAll('synopsis')
		self.synopsis = self.synopsis[0].renderContents()

	def get_actors(self):
		self.actors = self.soup.findAll('actors')
		self.actors = self.actors[0].renderContents()

	def get_duree(self):
		self.runtime = self.soup.findAll('runtime')
		self.runtime = int(self.runtime[0].renderContents())

		hour = self.runtime / 3600
		minute = (self.runtime - 3600 * hour) / 60

		self.duree = str(hour) + " h " + str(minute) + " min"


	def get_releaseDate(self):
		lesMois = { "01":"Janvier", "02":"Février", "03":"Mars", "04":"Avril", "05":"Mai", "06":"Juin", "07":"Juillet", "08":"Août", "09":"Septembre", "10":"Octobre", "11":"Novembre", "12":"Décembre"}
		self.releaseDate = self.soup.findAll('releasedate')
		self.releaseDate = self.releaseDate[0].renderContents()
		self.releaseDate = self.releaseDate.split('-')
		self.releaseDate.reverse()
		self.releaseDate[1] = lesMois[self.releaseDate[1]]
		self.releaseDate = " ".join(self.releaseDate)

Répondre