Bonjour,

je ne suis pas un habitué de la POO
Mais j'ai décidé de m'y mettre, donc mon code n'est pas optimisé et je pense que j'ai bidouillé pour le faire fonctionner.

Mon objectif est de pouvoir parser différentes pages grâce à XPATH
et ensuite de stocker (CRUD) dans une BDD mysql

J'ai donc créé une classe abstraite Page
et 2 classes (une par type de page) qui hérites de la classe Page

Normalement j'ai une autre classe Image qui est stockée dans un tableau dans au niveau de mes pages mais je n'ai pas mis cela dans le code ci-dessous.

Idem , normalement j'ai une dizaine de champs xpath et data au niveau de ma classe abstraite et quelques champs spécifiques au niveau des classes filles.


L'ensemble doit pouvoir être utilisé avec PDO
J'ai mis tous mes champs à protected, alors que je pense qu'il est préférable de mettre private mais si je fais cela, je n'ai plus accès dans mes classes filles (je pense qu'il doit y avoir un moyen)

Merci de m'aider à améliorer mon code, tout en respectant au mieux la POO
Je pense qu'il y a aussi un travail d'amélioration au niveau de la partie PDO
sachant que normalement j'ai 2 tables (1 pour les pages et 1 pour les images avec un lien entre les 2 car une page à plusieurs images)

index.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
<?php
 
require_once('PDO2.class.php');
set_time_limit(0);
error_reporting(-1);
header('Content-Type: text/plain; charset=utf-8;');
 
 
function chargerClasse($classe)
{
  require $classe . '.class.php'; // On inclut la classe correspondante au paramètre passé.
}
 
spl_autoload_register('chargerClasse'); 
 
 
function analyse($website,$content, $url, $curl){
	$pdo = PDO2::getInstance();
	if ($website == 'JDN'){
		$page = new JDN($content,$curl,$url,$pdo);
		echo "statuscode : ".$page->data_status."\n"; 
		if($page->data_status == "200"){
			echo  "title: ".$page->data_title."\n";
		}
	}
	return;
}
 
 
 
$curl = curl_init();
 
 
curl_setopt($curl, CURLOPT_COOKIESESSION, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_USERAGENT, 'test');
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
 
if(1){
	$lien = "http://www.lesite.com/web-tech/"; 
	curl_setopt($curl, CURLOPT_URL, $lien);
	$content = curl_exec($curl);
	analyse('JDN',$content,$lien,$curl);
 
	}
else{
	$lien = "http://www.lesite.com/";
	curl_setopt($curl, CURLOPT_URL, $lien);
	$content = curl_exec($curl);
	analyse('01NET',$content,$lien,$curl);
}
 
curl_close($curl);
 
?>
PDO2.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
<?php
/**
 * Classe implémentant le singleton pour PDO
 * @author Savageman
 */
 
        // on definit les constantes :
        define("SQL_DSN", "mysql:host=localhost;dbname=crawler");
        define("SQL_USERNAME", "root");
        define("SQL_PASSWORD", "");
 
 
 
 
class PDO2 extends PDO {
 
 
        private static $_instance;
 
 
 
        /* Constructeur : héritage public obligatoire par héritage de PDO */
        public function __construct( ) {
 
 
        }
        // End of PDO2::__construct() */
 
        /* Singleton */
        public static function getInstance() {
 
                if (!isset(self::$_instance)) {
 
                        try {
 
                                self::$_instance = new PDO(SQL_DSN, SQL_USERNAME, SQL_PASSWORD);
 
                        } catch (PDOException $e) {
 
                                echo $e;
                        }
                } 
                return self::$_instance; 
        }
        // End of PDO2::getInstance() */
}
 
?>
Page.class.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
<?php
abstract class Page {
 
	protected $data_title="";
 
	protected $data_status= "";
	protected $url= "";
 
	private $doc;
	protected $xpath="";
	protected $xpath_title = "";
 
	CONST CONST_xpath_type_direct = "2";
	CONST CONST_xpath_type_indirect = "1"; //nécessite un retravail simple regex
	CONST CONST_xpath_type_indirectbis = "3"; //nécessite un retravail multi regex	
 
	protected $pdo;
 
	function __construct($content,$curl,$pdo) {
    	$this->pdo = $pdo;
		$this->httpCode($curl);
		if ($this->data_status == "200"){
			$this->domXpath($content);
		}
    }
 
	public function __set($attr,$value){
		if(isset($this->$attr)) $this->$attr = $value;
		else throw new Exception('Unknow attribute '.$attr);
	}
 
	public function __get($attr){
		if(isset($this->$attr)) return $this->$attr;
		else throw new Exception('Unknow attribute '.$attr);
	}
 
	function httpCode($curl){
		$httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); 
		$this->data_status = $httpcode;
	}
 
	function domXpath($content){
		$this->doc = new DOMDocument();
		@$this->doc->loadHTML($content);
 
		$this->xpath = new DOMXPath($this->doc);
	}
 
	function query_dom($xpath,$query_path,$type_out){
		$query = $xpath->query($query_path);
		$content ="";
 
		foreach($query as $node){
			$out = new DOMDocument();
			foreach($node->childNodes as $child){
				$inner = $out->importNode($child, true);
				$out->appendChild($inner);
			}
			if(($type_out == Page::CONST_xpath_type_indirect) || ($type_out == Page::CONST_xpath_type_indirectbis))
				$content .= $out->saveHTML();
			if($type_out == Page::CONST_xpath_type_direct)
				$content .= $out->textContent;
 
		}
 
		return $content;
	}
 
	function extractRegex($regex,$content,$file=0){
		$result="";
 
		if(preg_match_all($regex,$content,$matches))
			{
				if($file){
					$result = $matches[1];
				}
				else {
					$result = mysql_real_escape_string(trim($matches[1][0]));
				}
			}
 
		return $result;
	}
 
	function extractXpath($xpath_scheme,$xpath_type,$regex=""){
		if($xpath_type == Page::CONST_xpath_type_direct){ //type = 2
			$content = mysql_real_escape_string(trim($this->query_dom($this->xpath,$xpath_scheme,$xpath_type)));
		}
		elseif ($xpath_type == Page::CONST_xpath_type_indirect) { //type = 1
			$content = $this->extractRegex($regex,$this->query_dom($this->xpath,$xpath_scheme,$xpath_type));
 
		}
		elseif ($xpath_type == Page::CONST_xpath_type_indirectbis){ //type = 3)
			$content = $this->query_dom($this->xpath,$xpath_scheme,$xpath_type);
		}
		return $content;
	}
 
	function request_webAll($pdo,$url){
		$sql = "SELECT * FROM web WHERE `url` = '".$url."'";
 
		$pdo->exec($sql);
	}
 
 
	function __destruct() {
        print "Destruction\n";
    }
}
?>
01net.class.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
class 01net extends Page {
 
    function __construct($content,$curl,$url,$pdo) {
        parent::__construct($content,$curl,$url,$pdo);
 
		$this->pdo = $pdo;
		$this->url = $url;
		if($this->data_status == "200"){
			$this->execute200OK();
		}
    }
 
	function execute200OK(){
		$this->xpath_title = "//*[@id='carrousel']/div[1]/div[2]/p[1]/a";
 
		$this->data_title = parent::extractXpath($this->xpath_title,Page::CONST_xpath_type_direct);
 
		parent::request_webAll($this->pdo,$this->url);
	}
}
?>
JDN.class.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
class JDN extends Page {
 
    function __construct($content,$curl,$url,$pdo) {
        parent::__construct($content,$curl,$url,$pdo);
 
		$this->pdo = $pdo;
		$this->url = $url;
		if($this->data_status == "200"){
			$this->execute200OK();
		}
    }
 
	function execute200OK(){
		$this->xpath_title = "//*[@id='top_slider']/div[1]/figure/figcaption/h1/a";
 
		$this->data_title = parent::extractXpath($this->xpath_title,Page::CONST_xpath_type_direct);
 
		parent::request_webAll($this->pdo,$this->url);
	}
}
?>

Merci