2017-09-28 1 views
-1

Im essayant de gratter les données d'un site qui génère ses données via un javascript, mais je ne peux pas sembler localiser le script invoquant. Quand je regarde la source de la page, il y a un script dans la page qui a une variable qui contient un tableau des données que je souhaite récupérer mais il y a un autre script qui contient tous les codes pour les différentes compagnies dont je souhaite récupérer les données. C'est ce que j'ai essayé jusqu'à présent:Web scraping contenu dynamique avec phantomjs

var url = 'http://www.asx.com.au/asx/share-price-research/company/ZAM/details'; 
var page = require('webpage').create(); 
page.open(url, function (status) { 
    var digitalData = page.evaluate(function() { 
      return window.digitalData; 
     })page.then(function (digitalData) { 
      console.log 
     } 
      ('DigtalData is ' + digitalData)); 
    phantom.exit(); 
}); 

Malheureusement, le script ci-dessus ne génère aucun résultat. Le script qui contient les codes pour les entreprises que je veux obtenir les données de mon avis est le suivant:

var locationPath = window.location.pathname.split('/'); 
var companyCode = locationPath[locationPath.length - 1].trim(); 
var sectorCodes = { 
    "MOQ": "soft", 
    "1PG": "soft", 
    "ONT": "heal", 
    "1ST": "heal", 
    "T3D": "food", 
    "TGP": "real", 
    "TIX": "real", 
    "TDO": "ener", 
    "DDD": "mate", 
    "3PL": "cons", 
    "4DS": "semi" 
}; 

setTimeout(function() { 
    googletag.cmd.push(function() { 
     googletag.defineSlot('/76291182/ASX_leaderboard_com_info', [728, 90], 'div-gpt-ad-1450158832871-0').addService(googletag.pubads()); 
     googletag.defineSlot('/76291182/ASX_MREC_com_info', [[300, 250], [300, 600]], 'div-gpt-ad-1450158832871-1').addService(googletag.pubads()); 
     googletag.defineSlot('/76291182/ASX_MREC_lower_com_info', [300, 250], 'div-gpt-ad-1450158832871-2').addService(googletag.pubads()); 
     googletag.defineSlot('/76291182/ASX_skyscraper_com_info', [160, 600], 'div-gpt-ad-1450158832871-3').addService(googletag.pubads()); 
     googletag.defineSlot('/76291182/ASX_half_page_com_info', [300, 600], 'div-gpt-ad-1450158832871-4').addService(googletag.pubads()); 
     googletag.pubads().setTargeting("cc", companyCode); 

     if (typeof sectorCodes[companyCode] != 'undefined') { 
      googletag.pubads().setTargeting('sec', sectorCodes[companyCode]); 
     } 
     googletag.enableServices(); 
    }); 
}, 2000); 

Ce script semble faire beaucoup plus que contiennent les codes pour les entreprises, mais c'est le seul script JS Je peux trouver qui a les codes d'entreprise. Je crois que les données que je veux est de ce script:

var currentURL = (document.URL); 
var part = currentURL.split("/")[6]; 
// var dwsDTM = $('#company-code-title').text(); 

var digitalData = { 
    "page": { 
     "pageInfo": { 
      "pageID": "3345", 
      "pageName": "Company info " + part, 
      "pageURL": window.location.href, 
      "issueDate": "n/a", 
      "updatedDate": "n/a", 
      "brand": "ASX", 
      "generator": "OpenText", 
      "domain": "Website", 
      "sysEnv": "", 
      "delayType": "Normal" 
     }, 
     "category": { 
      "primaryCategory": "Prices and research", 
      "subCategory1": "Company information", 
      "subCategory2": "Company info " + part, 
      "subCategory3": "", 
      "pageType": "" 
     }, 
     "productInfo": {} 
    }, 
    "user": { 
     "profileInfo": { 
      "memberB2B": "", 
      "businessMemberID": "", 
      "memberRetail": "", 
      "retailMemberID": "" 
     }, 
     "version": "1.0", 
     "events": [], 
     "vendor": { 
      "GoogleAnalytics": { 
       "account": "UA-9950793-3", 
       "eventCategory": "" 
      } 
     } 
    } 
}; 

Je crois que son produit à ce HTML:

<div class="view-content" ui-view></div> 

Im nouveau pour gratter le contenu dynamique et cela ressemble si difficile à faire. Quelqu'un pourrait-il me diriger dans la bonne direction pour récupérer ces données? MISE À JOUR: Après quelques heures de jeu sur le site, je me suis rendu compte qu'ils utilisaient angularJS pour leurs rappels de données et après avoir joué, j'ai trouvé les liens qu'ils utilisaient pour stocker leurs données. Ils ont une API mais je ne pense pas que ce soit publiquement disponible. En tout cas, je pense que je peux écrire un simple script DOM pour récupérer et formater les données. Je vous tiendrai au courant

+0

À l'URL fournie je vois l'information sur "ZAMANCO MINERALS LIMITED". Qu'est-ce que vous voulez obtenir à partir de là? – Vaviloff

+0

@Vaviloff malheureusement, je ne pouvais pas récupérer l'une des données souhaitées dont j'ai besoin, le site ASX n'a ​​pas d'API pour accéder aux données de l'entreprise. Lorsque j'ai utilisé un simple analyseur DOM, je n'ai pu que des données statiques ou des données non générées via javascript. –

+0

Tout d'abord, cela est contraire à leurs [Conditions d'utilisation] (http://www.asx.com.au/about/ terms-use.htm). Donc, je conseillerais fortement d'avorter. Cela dit, le schéma général que vous recherchez dans une situation comme celle-ci est d'utiliser d'autres fonctions fantômes pour interagir avec la page et attendre le contenu dont vous avez besoin avant de le racler. Encore une fois cependant, je ne recommande pas d'utiliser cela ici. C'est contre leurs TOS et vous devriez respecter cela. – GotDibbs

Répondre

0

J'ai trouvé une solution. En utilisant leur API et en utilisant HTML DOM et PHP, j'ai été en mesure de récupérer les données que je voulais et ensuite sortir les données au format CSV. Je ne peux pas discuter mon code ou l'API parce que ce serait en violation de leurs termes et services.