home
products
contribute
download
documentation
forum
Home
Forums
New posts
Search forums
What's new
New posts
All posts
Latest activity
Members
Registered members
Current visitors
Donate
Log in
Register
What's new
Search
Search
Search titles only
By:
New posts
Search forums
Search titles only
By:
Menu
Log in
Register
Navigation
Install the app
Install
More options
Contact us
Close Menu
Forums
Language specific support
MediaPortal Forums Francais
MediaPortal 1 - Développement
Les plugins
[Projet commun]EPGfr
Contact us
RSS
JavaScript is disabled. For a better experience, please enable JavaScript in your browser before proceeding.
You are using an out of date browser. It may not display this or other websites correctly.
You should upgrade or use an
alternative browser
.
Reply to thread
Message
<blockquote data-quote="cordwin" data-source="post: 440256"><p>En fait le principe de base d'un grabber est relativement simple :</p><p></p><p>1 - ou recuperes le le fichier source de la page.</p><p>2 - on analyse le fichier avec des expressions regulieres</p><p>3 - on formate le fichier en sortie.</p><p></p><p>un exemple de code : </p><p></p><p>[code] </p><p>using System;</p><p>using System.Collections.Generic;</p><p>using System.Text;</p><p>using System.Xml;</p><p>using System.Web;</p><p>using System.IO;</p><p>using System.Text.RegularExpressions;</p><p>using System.Net;</p><p>using System.Collections;</p><p></p><p></p><p>namespace Namespacedugrabber</p><p>{</p><p> class Program</p><p> {</p><p></p><p> public static string LoadWebPageFromURL(String szURL)</p><p> {</p><p> // Chargement de la pages Web en se faisant passer pour un browser</p><p> // On recuperes le contenu dans la chaine returnBuf</p><p> String returnBuf = "";</p><p> HttpWebRequest request = (HttpWebRequest)WebRequest.Create(szURL);</p><p> try</p><p> {</p><p> HttpWebResponse response = (HttpWebResponse)request.GetResponse();</p><p> Encoding encode = Encoding.UTF8;</p><p> Stream receiveStream = response.GetResponseStream();</p><p> StreamReader readStream = new StreamReader(receiveStream, encode);</p><p> returnBuf = readStream.ReadToEnd();</p><p> response.Close();</p><p> readStream.Close();</p><p> }</p><p> catch { }</p><p> // nettoyage de caractères inutiles</p><p> returnBuf = Regex.Replace(returnBuf, "(\r)+", "", RegexOptions.IgnoreCase); // on enleves les \r</p><p> returnBuf = Regex.Replace(returnBuf, "(\n)+", "\n", RegexOptions.IgnoreCase); // on enleves les newline multiples</p><p> returnBuf = Regex.Replace(returnBuf, "&(.*?);", "", RegexOptions.IgnoreCase);</p><p> returnBuf = Regex.Replace(returnBuf, "<(/|)b>", "", RegexOptions.IgnoreCase);</p><p> returnBuf = Regex.Replace(returnBuf, "<script(?:[^<^>]*?)>((?:.|\n)*?)</script(?:[^<^>]*?)>", "", RegexOptions.IgnoreCase);</p><p> returnBuf = Regex.Replace(returnBuf, "<style(?:[^<^>]*?)>((?:.|\n)*?)</style(?:[^<^>]*?)>", "", RegexOptions.IgnoreCase);</p><p> returnBuf = Regex.Replace(returnBuf, "<noscript(?:[^<^>]*?)>((?:.|\n)*?)</noscript(?:[^<^>]*?)>", "", RegexOptions.IgnoreCase);</p><p> returnBuf = Regex.Replace(returnBuf, "<(meta)(?:[^<^>]*?)>", "", RegexOptions.IgnoreCase);</p><p> return returnBuf;</p><p> }</p><p></p><p> public static void LoadSalle(String Salle)</p><p> {</p><p> String szPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);</p><p> String URL = String.Format("http://www.allocine.fr/seance/salle_gen_csalle={0}.html", Salle);</p><p> WebClient HTTPClient = new WebClient();</p><p> string result = LoadWebPageFromURL(URL);</p><p> // Get MovieTheater name from Page</p><p> String Pattern = "<title>(.*?)</title>";</p><p> if (bVerbose) Console.Out.WriteLine(CleanHTMLTag(GetValue(result, Pattern)));</p><p> XMLmovie_theater += String.Format("\t<where-to type=\"movie-theater\" id=\"{0}\" name=\"{1}\" />\n", Salle,CleanHTMLTag(GetValue(result, Pattern)));</p><p> // On recupere la liste des films</p><p> Pattern = @"<a class=""link1"" href=""/film/fichefilm_gen_cfilm=(\d*).ht"</p><p> + @"ml"">[img][/img]])*?/(\d*?).jpg)""(?:[^<^>]*?)alt="""</p><p> + @"([^<^>]*?)""(?:[^<^>]*?)/></a></td>(?:(?:.|\n)*?)<h5>([^<^>]"</p><p> + @"*?)</h5>((?:.|\n)*?)((?:(?:\s|\n*?)<tr><td(?:[^<^>]*?)""#F4F"</p><p> + @"4F4"">(?:(?:.|\n)*?)</table></td></tr>(?:\s|\n*?))+)";</p><p></p><p> MatchCollection ListFilms = Regex.Matches(result, Pattern, </p><p> // A l issue de cette RegExp on a :</p><p> // Champ 1 = ID du film</p><p> // Champ 2 = Image du film</p><p> // Champ 3 = ID de l'image du film</p><p> // Champ 4 = Titre du film</p><p> // Champ 5 = Catégorie et durée du film format : xxxxx (duree)</p><p> // Champ 6 = Zone contenant les notations et le casting, les recuperer dans la premiere RegEx serait trop couteux.</p><p> // Champ 7 = Le reste, contenant les horaires a Parser.</p><p>RegexOptions.IgnoreCase );</p><p> foreach (Match tmpMatch in ListFilms)</p><p> {</p><p> String szTmpMovie="";</p><p> String szTmpShow = "";</p><p> String FilmID = CleanHTMLTag(tmpMatch.Groups[1].Value);</p><p> String FilmIMAGEURL = CleanHTMLTag(tmpMatch.Groups[2].Value);</p><p> String FilmIMAGELocal = @"\covert-art\" + CleanHTMLTag(tmpMatch.Groups[3].Value)+".jpg";</p><p> String FilmTITRE = CleanHTMLTag(tmpMatch.Groups[4].Value);</p><p> String FilmCAT_DUREE = CleanHTMLTag(tmpMatch.Groups[5].Value);</p><p> String FilmNOTATION = tmpMatch.Groups[6].Value;</p><p> String FilmHORAIRES = tmpMatch.Groups[7].Value;</p><p>// formatter l'output ici ...</p><p> }</p><p> }</p><p> static void Main(string[] args)</p><p> {</p><p> LoadSalle("C12345");</p><p> }[/code]</p><p></p><p>Le problème en gros consiste a trouver la bonne expression reguliere pour capturer ce qui nous interesse.</p><p>Ca demandes de la patience et beaucoup de travail pour certains sites.</p><p></p><p>Et des que le site changes sont HTML : on ré ecrit ...</p><p></p><p>Maintenant on a peut être une autre piste de recherche. Qui est interessé par le fait que l'on regardes une emission TV : la chaine elle même. Quelqu'un a essayé de contacter les chaines officielles voir si elle ne pourraient pas tout simplement nous fournir un flux XML des programmes de la semaine ?</p><p></p><p>edit : tiens, vais envoyer un mail a TF1 pour voir !</p></blockquote><p></p>
[QUOTE="cordwin, post: 440256"] En fait le principe de base d'un grabber est relativement simple : 1 - ou recuperes le le fichier source de la page. 2 - on analyse le fichier avec des expressions regulieres 3 - on formate le fichier en sortie. un exemple de code : [code] using System; using System.Collections.Generic; using System.Text; using System.Xml; using System.Web; using System.IO; using System.Text.RegularExpressions; using System.Net; using System.Collections; namespace Namespacedugrabber { class Program { public static string LoadWebPageFromURL(String szURL) { // Chargement de la pages Web en se faisant passer pour un browser // On recuperes le contenu dans la chaine returnBuf String returnBuf = ""; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(szURL); try { HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Encoding encode = Encoding.UTF8; Stream receiveStream = response.GetResponseStream(); StreamReader readStream = new StreamReader(receiveStream, encode); returnBuf = readStream.ReadToEnd(); response.Close(); readStream.Close(); } catch { } // nettoyage de caractères inutiles returnBuf = Regex.Replace(returnBuf, "(\r)+", "", RegexOptions.IgnoreCase); // on enleves les \r returnBuf = Regex.Replace(returnBuf, "(\n)+", "\n", RegexOptions.IgnoreCase); // on enleves les newline multiples returnBuf = Regex.Replace(returnBuf, "&(.*?);", "", RegexOptions.IgnoreCase); returnBuf = Regex.Replace(returnBuf, "<(/|)b>", "", RegexOptions.IgnoreCase); returnBuf = Regex.Replace(returnBuf, "<script(?:[^<^>]*?)>((?:.|\n)*?)</script(?:[^<^>]*?)>", "", RegexOptions.IgnoreCase); returnBuf = Regex.Replace(returnBuf, "<style(?:[^<^>]*?)>((?:.|\n)*?)</style(?:[^<^>]*?)>", "", RegexOptions.IgnoreCase); returnBuf = Regex.Replace(returnBuf, "<noscript(?:[^<^>]*?)>((?:.|\n)*?)</noscript(?:[^<^>]*?)>", "", RegexOptions.IgnoreCase); returnBuf = Regex.Replace(returnBuf, "<(meta)(?:[^<^>]*?)>", "", RegexOptions.IgnoreCase); return returnBuf; } public static void LoadSalle(String Salle) { String szPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location); String URL = String.Format("http://www.allocine.fr/seance/salle_gen_csalle={0}.html", Salle); WebClient HTTPClient = new WebClient(); string result = LoadWebPageFromURL(URL); // Get MovieTheater name from Page String Pattern = "<title>(.*?)</title>"; if (bVerbose) Console.Out.WriteLine(CleanHTMLTag(GetValue(result, Pattern))); XMLmovie_theater += String.Format("\t<where-to type=\"movie-theater\" id=\"{0}\" name=\"{1}\" />\n", Salle,CleanHTMLTag(GetValue(result, Pattern))); // On recupere la liste des films Pattern = @"<a class=""link1"" href=""/film/fichefilm_gen_cfilm=(\d*).ht" + @"ml"">[img][/img]])*?/(\d*?).jpg)""(?:[^<^>]*?)alt=""" + @"([^<^>]*?)""(?:[^<^>]*?)/></a></td>(?:(?:.|\n)*?)<h5>([^<^>]" + @"*?)</h5>((?:.|\n)*?)((?:(?:\s|\n*?)<tr><td(?:[^<^>]*?)""#F4F" + @"4F4"">(?:(?:.|\n)*?)</table></td></tr>(?:\s|\n*?))+)"; MatchCollection ListFilms = Regex.Matches(result, Pattern, // A l issue de cette RegExp on a : // Champ 1 = ID du film // Champ 2 = Image du film // Champ 3 = ID de l'image du film // Champ 4 = Titre du film // Champ 5 = Catégorie et durée du film format : xxxxx (duree) // Champ 6 = Zone contenant les notations et le casting, les recuperer dans la premiere RegEx serait trop couteux. // Champ 7 = Le reste, contenant les horaires a Parser. RegexOptions.IgnoreCase ); foreach (Match tmpMatch in ListFilms) { String szTmpMovie=""; String szTmpShow = ""; String FilmID = CleanHTMLTag(tmpMatch.Groups[1].Value); String FilmIMAGEURL = CleanHTMLTag(tmpMatch.Groups[2].Value); String FilmIMAGELocal = @"\covert-art\" + CleanHTMLTag(tmpMatch.Groups[3].Value)+".jpg"; String FilmTITRE = CleanHTMLTag(tmpMatch.Groups[4].Value); String FilmCAT_DUREE = CleanHTMLTag(tmpMatch.Groups[5].Value); String FilmNOTATION = tmpMatch.Groups[6].Value; String FilmHORAIRES = tmpMatch.Groups[7].Value; // formatter l'output ici ... } } static void Main(string[] args) { LoadSalle("C12345"); }[/code] Le problème en gros consiste a trouver la bonne expression reguliere pour capturer ce qui nous interesse. Ca demandes de la patience et beaucoup de travail pour certains sites. Et des que le site changes sont HTML : on ré ecrit ... Maintenant on a peut être une autre piste de recherche. Qui est interessé par le fait que l'on regardes une emission TV : la chaine elle même. Quelqu'un a essayé de contacter les chaines officielles voir si elle ne pourraient pas tout simplement nous fournir un flux XML des programmes de la semaine ? edit : tiens, vais envoyer un mail a TF1 pour voir ! [/QUOTE]
Insert quotes…
Verification
Post reply
Forums
Language specific support
MediaPortal Forums Francais
MediaPortal 1 - Développement
Les plugins
[Projet commun]EPGfr
Contact us
RSS
Top
Bottom