2016-07-14 19 views
-1

Ich mag Daten von der Webseite kratzen: https://www.youtube.com/playlist?list=PLMC9KNkIncKtPzgY-5rmhvj7fax8fdxojScrape Daten von einer Webseite nach Klicken auf eine Schaltfläche

Es gibt eine „Last mehr“ am Ende der Seite mehr Videos zu laden.

Diese Seite zeigt nur 100 Videos, aber ich möchte Daten analysieren, nachdem „Mehr laden“ Button klicken.

<button class="yt-uix-button yt-uix-button-size-default yt-uix-button-default load-more-button yt-uix-load-more browse-items-load-more-button" type="button" onclick=";return false;" aria-label="Load more 
" data-uix-load-more-target-id="pl-load-more-destination" data-uix-load-more-href="/browse_ajax?action_continuation=1&amp;continuation=4qmFsgIuEiRWTFBMTUM5S05rSW5jS3RQemdZLTVybWh2ajdmYXg4ZmR4b2oaBkNHVSUzRA%253D%253D"><span class="yt-uix-button-content"> <span class="load-more-loading hid"> 
     <span class="yt-spinner"> 
     <span class="yt-spinner-img yt-sprite" title="Loading icon"></span> 

Loading... 
    </span> 

    </span> 
    <span class="load-more-text"> 
    Load more 

    </span> 
</span></button> 

kann ich tun, dass ich schöne Suppe
EDIT: Gefunden 2 Lösungen. Einer benutzt Beautifulsoup und andere Selen.

Antwort

-1

habe ich den folgenden Code zu tun video titles zu bekommen, können Sie es andere Inhalte kratzen bearbeiten können.

from bs4 import BeautifulSoup 
import json 
import requests 

url = "https://www.youtube.com/playlist?list=PLMC9KNkIncKtPzgY-5rmhvj7fax8fdxoj" 
html=requests.get(url).text 

soup=BeautifulSoup(html, "lxml") 

links=soup.find_all(class_='pl-video-title') 

for vid in links: 
    print vid.contents[1].string 

url1="https://www.youtube.com/browse_ajax?action_continuation=1&continuation=4qmFsgIuEiRWTFBMTUM5S05rSW5jS3RQemdZLTVybWh2ajdmYXg4ZmR4b2oaBkNHVSUzRA%3D%3D" 
html1=requests.get(url1).text 
data=json.loads(html1) 

soup=BeautifulSoup(data[u'content_html'], "lxml") 

links=soup.find_all(class_='pl-video-title') 

for vid in links: 
    print vid.contents[1].string 
+0

Thnks. Ich habe einen Zweifel, warum verwenden Sie json.loads (html1)? Warum gibt es Daten im JSON-Format? Auch wenn ich diese URL im Browser eingeben, wird eine Datei namens browser_ajax heruntergeladen. Sollte es keine Webseite öffnen –

+0

Wenn Sie die URL gehen, gibt der Server eine 'Json' Antwort zurück und das ist der Grund für' json.loads() '. – shiva

+0

Thnks ....................... –

0

Sie können durch den Aufruf der select() Methode und Leiten einer Zeichenfolge eines CSS-Selektor für das Element Sie suchen eine Web-Seite Element aus einem BeautifulSoup Objekt abzurufen.

soup.select('span .load-more-text') 

Ich glaube, das für funktionieren sollte, was Sie versuchen

+0

Sie nur knapp sein Ziel, diese Frage verstanden. Ich möchte den Inhalt dieser Webseite abschaben, nachdem ich auf die Schaltfläche "Mehr laden" geklickt habe. –

-1

Der beste Weg, um eine Wiedergabeliste zu lesen ist mit den YouTube API.

Wenn jedoch aus irgendeinem Grund es nicht, hier, was können Sie würden wollen, ist ein Crawler, der auch mit der Seite interagieren können. selenium ist ein gutes Beispiel dafür:

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.support.ui import WebDriverWait 

driver = webdriver.Firefox() 
driver.get("https://www.youtube.com/playlist?list=PLMC9KNkIncKtPzgY-5rmhvj7fax8fdxoj") # Get the playlist page 

# Click the button 
load_more_button = driver.find_element_by_class_name("load-more-text") 
load_more_button.click() 

# Wait *up to* 10 seconds to make sure the page has finished loading (check that the button no longer exists) 
WebDriverWait(driver,10).until(EC.invisibility_of_element_located(
    (By.CLASS_NAME, "load-more-text"))) 
# Get the html 
html = driver.page_source 

Von diesem Punkt an Sie die HTML analysieren können, wie Sie es von requests.

+0

THnks. Dies wird später zu meiner Verwendung kommen, wenn ich Selen verwende. –

Verwandte Themen