2017-09-11 5 views
-3

Je cherche un moyen de gratter du code source. L'information dont j'ai besoin est à l'intérieur d'un tag similaire à celui-ci.Scraping code source <script> tag d'une page Web

<script> 
....... 
var playerIdMap = {}; 
playerIdMap['4'] = '614'; 
playerIdMap['5'] = '84'; 
playerIdMap['6'] = '65'; 
playerIdMap['7'] = '701'; 
getPlayerIdMap = function() { return playerIdMap; }; // global 
} 
enclosePlayerMap(); 
</script> 

Je suis en train de saisir le contenu des numéros de playerIdMap par exemple: 4 et 614, ou toute la ligne pour cette question ..

+1

Avez-vous essayé de lire le fichier HTML, en vérifiant si chaque ligne a "playerI" dMap "en elle, puis enregistrez ceux qui le font? Qu'en est-il d'une expression régulière pour saisir les clés et la valeur du tableau playerIdMap? Vous pouvez même exploser playerIdMap (bien que cela soit inefficace). Il y a plusieurs façons. – Nadav

+0

Rien de tout cela n'est visible sur le front-end. J'ai déjà gratté des images, mais je n'ai jamais essayé quoi que ce soit qui fasse partie de la source de la page et qui n'est pas visible. Comment pourrais-je parler d'une expression? Merci – KJThaDon

+1

Essayez ce sujet: https://stackoverflow.com/questions/584826/scrape-web-page-contents?rq=1 Il décrit de nombreuses façons d'accomplir cela. – Nadav

Répondre

1

Modifier-2

complet du code PHP inspiré à partir du code à How to get data from API - php - curl

<?php 
/** 
* Handles making a cURL request 
* 
* @param string $url   URL to call out to for information. 
* @param bool $callDetails Optional condition to allow for extended 
* information return including error and getinfo details. 
* 
* @return array $returnGroup cURL response and optional details. 
*/ 
function makeRequest($url, $callDetails = false) 
{ 
    // Set handle 
    $ch = curl_init($url); 

    // Set options 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

    // Execute curl handle add results to data return array. 
    $result = curl_exec($ch); 
    $returnGroup = ['curlResult' => $result,]; 

    // If details of curl execution are asked for add them to return group. 
    if ($callDetails) { 
    $returnGroup['info'] = curl_getinfo($ch); 
    $returnGroup['errno'] = curl_errno($ch); 
    $returnGroup['error'] = curl_error($ch); 
    } 

    // Close cURL and return response. 
    curl_close($ch); 
    return $returnGroup; 
} 

$url = "http://www.bullshooterlive.com/my-stats/999/"; 
$response = makeRequest($url, true); 

$re = '/playerIdMap\[\'(?P<id>\d+)\']\s+=\s+\'(?P<value>\d+)\'/'; 

preg_match_all($re, $response['curlResult'], $matches, PREG_SET_ORDER, 0); 

// Print the entire match result 
var_dump($matches); 

//var_dump($response); 

Edit-1

Désolé n'a pas réalisé que vous avez posé une question PHP. Je ne sais pas pourquoi j'ai supposé scrapy ici. Quoi qu'il en soit ci-dessous le code php devrait aider

$re = '/playerIdMap\[\'(?P<id>\d+)\']\s+=\s+\'(?P<value>\d+)\'/'; 
$str = '<script> 
....... 
var playerIdMap = {}; 
playerIdMap[\'4\'] = \'614\'; 
playerIdMap[\'5\'] = \'84\'; 
playerIdMap[\'6\'] = \'65\'; 
playerIdMap[\'7\'] = \'701\'; 
getPlayerIdMap = function() { return playerIdMap; }; // global 
} 
enclosePlayerMap(); 
</script>'; 

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0); 

// Print the entire match result 
var_dump($matches); 

Réponse précédente

Vous pouvez utiliser quelque chose comme ci-dessous

>>> data = """ 
... <script> 
... ....... 
... var playerIdMap = {}; 
... playerIdMap['4'] = '614'; 
... playerIdMap['5'] = '84'; 
... playerIdMap['6'] = '65'; 
... playerIdMap['7'] = '701'; 
... getPlayerIdMap = function() { return playerIdMap; }; // global 
... } 
... enclosePlayerMap(); 
... </script> 
... """ 
>>> import re 
>>> 
>>> regex = r"playerIdMap\['(?P<id>\d+)']\s+=\s+'(?P<value>\d+)'" 
>>> re.findall(regex, data) 
[('4', '614'), ('5', '84'), ('6', '65'), ('7', '701')] 

Vous devez arriver à la balise de script utilisant ci-dessous

data = response.xpath("//script[contains(text(),'getPlayerIdMap')]").extract_first() 

import re 
regex = r"playerIdMap\['(?P<id>\d+)']\s+=\s+'(?P<value>\d+)'" 
print(re.findall(regex, data)) 
[('4', '614'), ('5', '84'), ('6', '65'), ('7', '701')] 
+0

Désolé, impossible de lire ce code, c'est php? – KJThaDon

+1

@KJThaDon, c'est Python montré en utilisant Python REPL –

+0

ahh dang, désolé, je ne l'ai pas utilisé depuis longtemps .. Je ne sais même pas comment implémenter cela dans mon code php si possible. – KJThaDon