Analyser les codes HTML/JS pour obtenir des informations en utilisant PHP.Comment analyser une page HTML en utilisant PHP?
www.asos.com/Asos/Little-Asos-Union-Jack-T-Shirt/Prod/pgeproduct.aspx?iid=1273626
Jetez un oeil à cette page, il est un magasin de vêtements pour enfants . C'est l'un de leurs articles et je tiens à souligner la section de taille. Ce que nous devons faire ici est d'obtenir toutes les tailles pour cet article et de vérifier si les tailles sont disponibles ou non. En ce moment toutes les tailles pour ces articles sont:
3-4 years
4-5 years
5-6 years
7-8 years
Comment pouvez-vous dire si les tailles sont disponibles ou non?
Maintenant, jetez un oeil à cette page d'abord et vérifier à nouveau les tailles:
www.asos.com/Ralph-Lauren/Ralph-Lauren-Long-Sleeve-Big-Horse-Stripe-Rugby-Top/ ? Prod/pgeproduct.aspx IID = 1111751
Cet article a les dimensions suivantes:
12 months
18 months - Not Available
24 months
Comme vous pouvez le voir 18 mois taille ne sont pas disponibles, il est indiqué par le texte « non disponible » à côté la taille.
Ce que nous devons faire est aller à la page d'un article, obtenir les tailles et vérifier la disponibilité de chaque taille. Comment puis-je faire cela en PHP?
EDIT:
Ajout d'un code de travail et un nouveau problème à résoudre.
Code de travail mais il a besoin de plus de travail:
<?php
function getProductVariations($url) {
//Use CURL to get the raw HTML for the page
$ch = curl_init();
curl_setopt_array($ch,
array(
CURLOPT_RETURNTRANSFER=>true,
CURLOPT_HEADER => false,
CURLOPT_URL => $url
)
);
$raw_html = curl_exec($ch);
//If we get an invalid response back from the server fail
if ($raw_html===false) {
throw new Exception(curl_error($ch));
}
curl_close($ch);
//Find the variation JS declarations and extract them
$raw_variations = preg_match_all("/arrSzeCol_ctl00_ContentMainPage_ctlSeparateProduct\[[0-9]+\].*Array\((.*)\);/",$raw_html,$raw_matches);
//We are done with the Raw HTML now
unset($raw_html);
//Check that we got some results back
if (is_array($raw_matches) && isset($raw_matches[1]) && sizeof($raw_matches[1])==$raw_variations && $raw_variations>0) {
//This is where the matches will go
$matches = array();
//Go through the results of the bracketed expression and convert them to a PHP assoc array
foreach($raw_matches[1] as $match) {
//As they are declared in javascript we can use json_decode to process them nicely, they just need wrapping
$proc=json_decode("[$match]");
//Label the fields as best we can
$proc2=array(
"variation_id"=>$proc[0],
"size_desc"=>$proc[1],
"colour_desc"=>$proc[2],
"available"=>(trim(strtolower($proc[3]))=="true"),
"unknown_col1"=>$proc[4],
"price"=>$proc[5],
"unknown_col2"=>$proc[6], /*Always seems to be zero*/
"currency"=>$proc[7],
"unknown_col3"=>$proc[8],
"unknown_col4"=>$proc[9], /*Negative price*/
"unknown_col5"=>$proc[10], /*Always seems to be zero*/
"unknown_col6"=>$proc[11] /*Always seems to be zero*/
);
//Push the processed variation onto the results array
$matches[$proc[0]]=$proc2;
//We are done with our proc2 array now (proc will be unset by the foreach loop)
unset($proc2);
}
//Return the matches we have found
return $matches;
} else {
throw new Exception("Unable to find any product variations");
}
}
//EXAMPLE USAGE
try {
$variations = getProductVariations("http://www.asos.com/Asos/Prod/pgeproduct.aspx?iid=803846");
//Do something more useful here
print_r($variations);
} catch(Exception $e) {
echo "Error: " . $e->getMessage();
}
?>
Le code ci-dessus fonctionne, mais il y a un problème lorsque le produit doit d'abord sélectionner une couleur avant que les tailles sont affichées.
Comme celui-ci:
Toute idée comment s'y prendre?
Je viens de découvrir que l'option pour la taille de sélection est peuplée par AJAX. Comme vous pouvez le voir, ceci est la sélection de taille DIV. Les informations qui peuplent cette DIV proviennent apparemment d'une interaction AJAX avec un script backend. Les mots "non disponible" ne sont pas dans le HTML, mais ils sont clairement rendus sur l'écran lorsque vous ouvrez le contrôle de formulaire SELECT. Donc, ils sont mis dans le DOM d'une autre manière. Est-ce que fopen et file_get_contents fonctionneront toujours ici? – GoDesigner