2017-11-24 2 views
1

Vor kurzem habe ich gelernt, Web Scraping mit Python und Beautiful Soup. Allerdings habe ich ein bisschen eine Beule getroffen, wenn sie versuchen die folgende Seite zu kratzen:Web Scraping spezifische Seite mit Python

http://www.librarything.com/work/3203347

Die Daten, die ich von der Seite wollen, ist die Tags für das Buch, aber ich kann keinen Weg finden, um die Daten trotz viel Zeit im Internet.

Ich habe versucht, ein paar Führer online zu folgen, aber keiner von ihnen schien zu funktionieren. Ich habe versucht, die Seite in XML und JSON zu konvertieren, aber ich konnte die Daten immer noch nicht finden.

Ziemlich ratlos im Moment und ich würde jede Hilfe zu schätzen wissen.

Danke.

+1

Meinst du das Schaben eines bestimmten Elements auf der Seite? IE, die Daten unter der Überschrift Tags? –

Antwort

2

Nach dem HTML und Skripte zu analysieren, werden die Tags durch AJAX geladen und anfragende Die AJAX-URL macht unser Leben einfach. Hier ist das Python-Skript.

import requests 
from bs4 import BeautifulSoup 

content = requests.get("http://www.librarything.com/ajax_work_makeworkCloud.php?work=3203347&check=2801929225").text 
soup = BeautifulSoup(content) 

for tag in soup.find_all('a'): 
    print(tag) 
+1

Oh mein Gott. Nach buchstäblich stundenlangem Suchen im Internet finde ich etwas, das funktioniert. Ich danke dir sehr!! – Univold

0

Ich bin mir nicht sicher, welche Daten Sie von der Seite scrappen möchten. Aber wenn sie überprüft wird, lädt die Seite dynamische "Tags" durch ein Javascript, das initiiert wird, sobald die Seite geladen wird. Wenn Ihr Scraper nur den DOM-Controller lädt und die Webseite im Hintergrund analysiert, ohne in einen Browser geladen zu werden, ist es sehr wahrscheinlich, dass die dynamischen Daten auf der Seite nicht geladen werden.

Eine mögliche Lösung ist die Verwendung von Selen, um die Seite vollständig zu laden und dann zu kratzen.

0

Mögliche Implementierung ohne BS:

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

my_url = 'http://www.librarything.com/work/3203347' 
driver = webdriver.Chrome() 
driver.get(my_url) 

delay = 5 # seconds 

try: 
    WebDriverWait(driver, delay).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'span.tag'))) 
    print("Page is ready!") 
    for element in driver.find_elements_by_css_selector('span.tag'): 
     print(element.text) 
except TimeoutException: 
    print("Couldn't load page") 
finally: 
    driver.quit() 

Quellen für die Umsetzung:

Waiting until an element identified by its css is present

Locating elements with selenium