2014-03-05 13 views
6

Ich bin in der Lage, Daten von grundlegenden HTML-Seiten zu kratzen, aber ich habe Probleme beim Abkratzen der Website unten. Es sieht so aus, als ob die Daten über Javascript präsentiert werden, und ich bin mir nicht sicher, wie ich dieses Problem angehen soll. Ich würde es vorziehen, wenn möglich R zu verwenden, könnte aber auch Python verwenden.Scraping Javascript Website

Irgendwelche Ideen/Vorschläge?

Edit: Ich muss das Jahr/Hersteller/Modell, die S/N, den Preis, den Standort und die kurze Beschreibung (beginnt mit "Auktion:") für jeden Eintrag.

http://www.machinerytrader.com/list/list.aspx?bcatid=4&DidSearch=1&EID=1&LP=MAT&ETID=5&catid=1015&mdlx=Contains&Cond=All&SO=26&btnSearch=Search&units=imperial

+1

Blick in Selen. Es gibt ein paar Beispiele für seine Verwendung über R hier auf SO, aber nicht viele. – Thomas

+1

Mit [CasperJS] (http://casperjs.org/) können Sie eine Verbindung zur Seite herstellen und darauf warten, dass Elemente geladen werden. Sie können JavaScript auch direkt in den Seitenkontext einfügen. –

Antwort

3
library(XML) 
library(relenium) 

##downloading website 
website<- firefoxClass$new() 
website$get("http://www.machinerytrader.com/list/list.aspx?pg=1&bcatid=4&DidSearch=1&EID=1&LP=MAT&ETID=5&catid=1015&mdlx=Contains&Cond=All&SO=26&btnSearch=Search&units=imperial") 
doc <- htmlParse(website$getPageSource()) 

##reading tables and binding the information 
tables <- readHTMLTable(doc, stringsAsFactors=FALSE) 
data<-do.call("rbind", tables[seq(from=8, to=56, by=2)]) 
data<-cbind(data, sapply(lapply(tables[seq(from=9, to=57, by=2)], '[[', i=2), '[', 1)) 
rownames(data)<-NULL 
names(data) <- c("year.man.model", "s.n", "price", "location", "auction") 

Dies wird Ihnen, was Sie für die erste Seite wollen (nur die ersten beiden Zeilen hier zeigt):

head(data,2) 
     year.man.model  s.n  price location            auction 
1 1972 AMERICAN 5530 GS14745W US $50,100  MI     Auction: 1/9/2013; 4,796 Hours; .. 
2 AUSTIN-WESTERN 307  307 US $3,400  MT Auction: 12/18/2013; AUSTIN-WESTERN track excavator. 

sie zu allen Seiten, nur eine Schleife über, Einfügen der pg=i in die Adresse.

+1

Danke für die schnelle Antwort. Wenn ich diesen Code ausführe, erhalte ich jedoch null Ergebnisse. Der Befehl readHTMLTable scheint tatsächlich nichts zu lesen. Es erzeugt nur eine Nullliste. Irgendeine Idee? –

+1

Auch - ich benutze Windows 7, wenn das einen Unterschied macht. –

+0

Vielen Dank, dass Sie darauf hingewiesen haben, Sie haben recht, ich habe tatsächlich ein anderes Setup verwendet, das den direkten Download zuließ. Ich habe die Antwort aktualisiert, zuerst die Quelle mit 'relenium' heruntergeladen und dann' readHTMLTable' verwendet, jetzt sollte es funktionieren! –

2

Mit Relenium:

require(relenium) # More info: https://github.com/LluisRamon/relenium 
require(XML) 
firefox <- firefoxClass$new() # init browser 
res <- NULL 
pages <- 1:2 
for (page in pages) { 
    url <- sprintf("http://www.machinerytrader.com/list/list.aspx?pg=%d&bcatid=4&DidSearch=1&EID=1&LP=MAT&ETID=5&catid=1015&mdlx=Contains&Cond=All&SO=26&btnSearch=Search&units=imperial", page) 
    firefox$get(url) 
    doc <- htmlParse(firefox$getPageSource()) 
    res <- rbind(res, 
       cbind(year_manu_model = xpathSApply(doc, '//table[substring(@id, string-length(@id)-15) = "tblListingHeader"]/tbody/tr/td[1]', xmlValue), 
        sn = xpathSApply(doc, '//table[substring(@id, string-length(@id)-15) = "tblListingHeader"]/tbody/tr/td[2]', xmlValue), 
        price = xpathSApply(doc, '//table[substring(@id, string-length(@id)-15) = "tblListingHeader"]/tbody/tr/td[3]', xmlValue), 
        loc = xpathSApply(doc, '//table[substring(@id, string-length(@id)-15) = "tblListingHeader"]/tbody/tr/td[4]', xmlValue), 
        auc = xpathSApply(doc, '//table[substring(@id, string-length(@id)-9) = "tblContent"]/tbody/tr/td[2]', xmlValue)) 
) 
} 
sapply(as.data.frame(res), substr, 0, 30)       
#  year_manu_model     sn    price   loc auc        
# [1,] " 1972 AMERICAN 5530"   "GS14745W"  "US $50,100" "MI " "\n\t\t\t\t\tAuction: 1/9/2013; 4,796" 
# [2,] " AUSTIN-WESTERN 307"   "307"   "US $3,400" "MT " "\n\t\t\t\t\tDetails & Photo(s)Video(" 
# ... 
+0

Installiertes Relienium, aber ich bekomme "Error: WebDriverException", wenn ich Ihren genauen Code oben ausführen. Irgendeine Idee darüber, was das verursachen könnte? –

+0

@ user3384596 ups, ich habe "http: //" in der URL vergessen. sry, aber es sollte jetzt funktionieren. – lukeA

+0

@ lukeA - der Fehler ist weg, aber das "auc" -Feld hat zwei Probleme: 1) Es zieht nicht den vollständigen Text, und 2) es zieht abwechselnd den Text "Details & Fotos" aus irgendeinem Grund (Beispiel: der erste Datensatz zieht die Auktionsdaten, der 2. Datensatz zieht Details & Fotos, der 3. Datensatz zieht Auktionsdaten ...). Irgendeine Idee? –