2017-11-18 3 views
0

Ich versuche, 'https://www.kaggle.com/kernels' zu kratzen, um alle Titelnamen auf der Website zurückzugeben, aber ich bin in einem Problem, wo der Container für dieses Detail 'div Datenrectroot' ist nicht in die Scraped-Daten gezogen werden.Web scrape nicht zurück html

Gibt es einen Fehler in meinem Code oder gibt es eine Art Block auf der Website, die mich daran hindert, diese Daten zu scrapen?

+0

einer Zeitverzögerung und die Nutzung Anfragen Bibliothek geben für das Erhalten von HTML-Inhalten nicht urllib wie es für statische Inhalte Parsing verwendet wird Ihr Fall ist dynamischer Inhalt –

+0

Mögliches Duplikat von [HTML-Daten ist von urllib ausgeblendet] (https://stackoverflow.com/questions/47351045/html-data-is-hidden-from-urllib) –

Antwort

0

Die gewünschten Daten werden jedes Mal, wenn Sie die Seite anfordern, per JavaScript im JSON-Format abgerufen. Sie können es von "https://www.kaggle.com/kernels.json?sortBy=hotness&group=everyone&pageSize=20&after=439354&language=all&outputType=all" wie folgt abrufen.

import requests 
import json 
source = requests.get("https://www.kaggle.com/kernels.json?sortBy=hotness&group=everyone&pageSize=20&after=439354&language=all&outputType=all") 
json_obj = source.json() 
for a in json_obj: 
    print (a["title"]) 

Ausgänge:

2004-2005 Landfalling Hurricanes animation 
Visualization of StockData 
Generating Sentences One Letter at a Time 
Decoding the Sexiest Job of 21st Century!! 
Novice to Grandmaster 
Analysis on Pokemon Data 
ROC Curve with k-Fold CV 
Japan Bulgaria trade playground 
Bootstrapping and CIs with Veteran Suicides 
Replicating "Did I do that?" paper analyses with R 
Social Progress Index and World Happiness Report 
SVM+HOG On ColourCompositeImage 
Low- level students 
PyTorch Speech Recognition Challenge (WIP) 
Loans -getting Insights 
Exploring Youtube Trending Statistics EDA 
3 Simple Steps (LB: .9878 with new data) 
Titanic: Neural Network using Keras 
Feature Engineering 
Why do employees leave and what to do about it 

Das einzige, was müssen Sie ist ändern Sie die „nach“ Query-String-Parameter, die in meiner Anfrage 439.354 war aber Sie es auf 0 gesetzt könnten die ersten Aufzeichnungen zu erhalten .

Sie können auch die Anzahl der zurückgegebenen Datensätze ändern, indem Sie den Abfragezeichenfolgenparameter "pageSize" ändern, z. „https://www.kaggle.com/kernels.json?sortBy=hotness&group=everyone&pageSize=5&after=0&language=all&outputType=all

Ausgänge:

Data ScienceTutorial for Beginners 
Data visualization and investigation 
Spooky NLP and Topic Modelling tutorial 
20 Years Of Games Analysis 
NYC Taxi EDA - Update: The fast & the curious 

Oder ein Beispiel mit urllib:

import urllib.request 
import json 
kaggle = "https://www.kaggle.com/kernels.json?sortBy=hotness&group=everyone&pageSize=5&after=0&language=all&outputType=all" 
data = urllib.request.urlopen(kaggle).read() 
json_obj = json.loads(data.decode("utf-8")) 
for a in json_obj: 
    print (a["title"]) 
0

Wie Elis Byberi schrieb, ist das Problem wirklich, dass Sie versuchen, Daten zu erhalten, bevor Daten vom Backend gerendert werden. Sie können den Inhalt der Seite nach dem Backend mit phantomjs abrufen. Sie können kleines Tutorial finden here