Précédent   Forum des professionnels en informatique > PHP > Scripts
Scripts Forum d'entraide sur les scripts PHP téléchargés. Les meilleurs scripts PHP, la FAQ scripts PHP, toutes les FAQ PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/07/2011, 12h56   #1
Invité de passage
 
Inscription : mars 2004
Messages : 25
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 25
Points : 4
Points : 4
Envoyer un message via MSN à thelover2fr
Par défaut Un script d'extraction

Bonjour à vous,

je me confronte à un nouveau sujet et j'ai pas vraiment de piste à explorer alors si vous pouvez m'aider je vous serais très reconnaissant.
je m'explique:
je veux créer un script qui parse des pages web d'un site spécifié au départ (type site d'annonces par exemple), me parcours ses pages et m'extrait les données qui s'y trouve et me les injecte dans un une base MySQL.
Est ce qu'une âme charitable peut m'aider à résoudre ce problème: est ce que quelqu'un a déjà rencontré ce problème? y'a t il des scripts en open source qui abordent le sujet? y'a t il des pistes à explorer en prioritaire?

Milles merci par avance pour votre aide.
thelover2fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 13h08   #2
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Hello

Coincidence, j'ai réalisé un script qui fait globalement la même chose pour extraire des données d'un site qui références toutes les auto-écoles française.
J'ai pondu rapidos un algo en 1h mais ça peut te donner des idées.

Code :
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
 
<?php
set_time_limit(0);
error_reporting(0);
echo "<pre>";
 
$url = 'http://www.permisecole.com/annuaire-auto-ecoles/';
echo "Process Started: $url\n"; flush();
 
$doc = new DOMDocument('1.0', 'iso-8859-15');
$doc->strictErrorChecking = false;
if (!$doc->loadHTMLFile($url))
	die("Cannot open $url");
 
$xpath = new DOMXPath($doc);
 
$departments = array();
foreach ($xpath->query('//td[@width="33%"]') as $node) {
	$anchor = $node->firstChild;
	if ($anchor->hasAttributes())
		$departments[$anchor->nodeValue] = $anchor->getAttribute('href');
}
 
echo "Department List Created\n"; flush();
 
foreach ($departments as $department_name => $department_url) {
 
	echo "> Processing department $department_name... "; flush();
 
	$department_doc = new DOMDocument('1.0', 'iso-8859-15');
	$department_doc->strictErrorChecking = false;
	if ($department_doc->loadHTMLFile("http://www.permisecole.com" . $department_url)) {
		$department_xpath = new DOMXpath($department_doc);
 
		$towns = array();
		foreach ($department_xpath->query('//td[@width="33%"]') as $node) {
			$dpt_anchor = $node->firstChild;
			if ($dpt_anchor->hasAttributes())
				$towns[$dpt_anchor->nodeValue] = $dpt_anchor->getAttribute('href');
		}
 
		echo count($towns) . " towns found\n"; flush();
 
		foreach ($towns as $town_name => $town_url) {
 
			echo ">> Processing town $town_name... "; flush();
 
			$town_doc = new DOMDocument('1.0', 'iso-8859-15');
			$town_doc->strictErrorChecking = false;
			if ($town_doc->loadHTMLFile("http://www.permisecole.com" . $town_url)) {
				$town_xpath = new DOMXpath($town_doc);
 
				$agencies = array();
				foreach ($town_xpath->query('//td[@width="33%"]') as $node) {
					$list = $node->childNodes;
					$name = trim($town_xpath->query('a/b', $node)->item(0)->nodeValue);
					$address = trim(($list->item(2) ? $list->item(2)->wholeText : '') . ' ' . ($list->item(4) ? $list->item(4)->wholeText : ''));
					$address = str_replace(array("\r","\n","\t"), '', $address);
					$tel = trim($list->item(6) ? $list->item(6)->wholeText : '');
					if (!empty($tel))
						$agencies[] = array('name' => $name, 'address' => $address, 'tel' => $tel);
				}
 
				echo count($agencies) . " agencies found\n"; flush();
				foreach ($agencies as $a) { echo ">>> {$a['name']} - {$a['address']} - {$a['tel']}\n"; } 
 
				$towns[$town_name] = $agencies;
			}
		}
 
		$departments[$department_name] = $towns;
	}
}
 
$filename = "auto_ecoles." . date('Ymd') . '.json';
echo "Writing $filename ...";
file_put_contents($filename, json_encode($departments));
 
echo "--------------------------------------------------\n";
echo "DONE"; flush();
echo "<pre>";
ça génère un fichier JSon une fois que tout le site à été exploré.
La solution que j'ai utilisé consiste à utiliser DOMDocument pour parser les pages du site, trouver les liens et explorer reccursivement toutes les sections qui m'intéresse.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 13h14   #3
Invité de passage
 
Inscription : mars 2004
Messages : 25
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 25
Points : 4
Points : 4
Envoyer un message via MSN à thelover2fr
Milles merci Benjamin, tu es magique. j'essaerais avec ça.
Encore merci.
thelover2fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 13h17   #4
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Gaffe quand même, je l'ai mis à titre d'exemple mais les XPath que j'utilise pour lire / extraire les informations sont spécifiques au site en question. A toi de trouver la logique qui va bien dans ton cas.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 13h49   #5
Invité de passage
 
Inscription : mars 2004
Messages : 25
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 25
Points : 4
Points : 4
Envoyer un message via MSN à thelover2fr
Oui j'ai bien pris note de ça, je te tiens de l'avancement de mon travail.
tu m'épargne un temps fous, un grand merci à toi grand chef.
thelover2fr est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h04.


 
 
 
 
Partenaires

Hébergement Web