1

So muss ich eine Seite wie this zum Beispiel Schrott und ich benutze Scrapy + Seleninum mit einem Date-Picker-Kalender zu interagieren.Bildschirm scraping ein Datepicker mit Scrapy und Selenium auf Maus Hover

Ich erkannte, dass, wenn ein bestimmtes Datum verfügbar ist, ein Preis auf dem Tooltip angezeigt wird, und wenn es nicht verfügbar ist, wenn Sie darauf schweben, passiert nichts.

Was ist der Code für mich, um den Preis, der dynamisch erscheint, wenn Sie an einem verfügbaren Tag schweben und auch, woher weiß ich, ob es verfügbar ist oder nicht nur mit dem Hover?

Antwort

2

Es ist nicht so einfach, wie man das Problem wegen der dynamischen Natur der Seite angehen kann - Sie müssen hier und dort verwenden und es ist schwierig, den HTML der dynamischen Komponenten zu erfassen, die auf Klicken oder Schweben erscheinen.

Hier ist der vollständige Arbeitscode, der zur Seite navigieren, auf die "Einchecken" -Eingabe klicken, auf das Laden des Kalenders warten und die Verfügbarkeit für jeden Tag im Kalender melden würde (es verwendet das Vorhandensein von ui-datepicker-unselectable Klasse, um das zu bestimmen). Dann schwebt sie jede Zelle mit der move_to_element() Browser Aktion, wartet auf den Tooltip und erhält den Preis:

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


driver = webdriver.Firefox() 
driver.get("https://www.airbnb.pt/rooms/265820?check_in=2016-04-26&guests=1&check_out=2016-04-29") 

# wait for the check in input to load 
wait = WebDriverWait(driver, 10) 
elem = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.book-it-panel input[name=checkin]"))) 
elem.click() 

# wait for datepicker to load 
wait.until(
    EC.visibility_of_element_located((By.CSS_SELECTOR, '.ui-datepicker:not(.loading)')) 
) 

days = driver.find_elements_by_css_selector(".ui-datepicker table.ui-datepicker-calendar tr td") 
for cell in days: 
    day = cell.text.strip() 
    if not day: 
     continue 

    if "ui-datepicker-unselectable" in cell.get_attribute("class"): 
     status = "Unavailable" 
    else: 
     status = "Available" 

    price = "n/a" 
    if status == "Available": 
     # hover the cell and wait for the tooltip 
     ActionChains(driver).move_to_element(cell).perform() 
     price = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, '.datepicker-tooltip'))).text 

    print(day, status, price) 

Drucke:

1 Unavailable n/a 
2 Unavailable n/a 
3 Unavailable n/a 
4 Unavailable n/a 
5 Unavailable n/a 
6 Unavailable n/a 
7 Unavailable n/a 
8 Unavailable n/a 
9 Unavailable n/a 
10 Unavailable n/a 
11 Unavailable n/a 
12 Unavailable n/a 
13 Available €40 
14 Unavailable n/a 
15 Unavailable n/a 
16 Unavailable n/a 
17 Unavailable n/a 
18 Unavailable n/a 
19 Available €36 
20 Available €49 
21 Unavailable n/a 
22 Available €49 
23 Unavailable n/a 
24 Unavailable n/a 
25 Available €40 
26 Available €39 
27 Available €35 
28 Available €37 
29 Available €37 
30 Available €37 
+0

fast scheint es, dies zu sein, aber wie über den Tooltip mit dem Preis, wenn ich ihm schweben auf? Wie kann ich den Preis bekommen, wenn es verfügbar ist? – psychok7

+0

@ psychok7 okay, sicher, aktualisiert. Hoffe es hilft :) – alecxe

+0

ok ich werde dies jetzt testen und lassen Sie wissen, ob es funktioniert .. danke – psychok7

1

Hallo bitte die Antwort

Key Note finden: wir haben einige Sekunden nach Klick-Ereignis im Kalender gewartet, weil Java-Skript interne Verarbeitungszeit im Kalender benötigt, nachdem es geöffnet wird.

public static void main(String[] args) throws InterruptedException { 


    System.setProperty("webdriver.chrome.driver","D:\\eclipseProject\\StackOverFlow\\chromedriver_win32 (1)\\chromedriver.exe"); 
    WebDriver driver = new ChromeDriver(); 
    driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); 
    driver.manage().window().maximize(); 
    Actions act = new Actions(driver); 
    WebDriverWait wait = new WebDriverWait(driver,30); 
    driver.get("https://www.airbnb.pt/rooms/265820?check_in=2016-04-26&guests=1&check_out=2016-04-29"); 

    // selecting firstdate picker -- check in 
    driver.findElement(By.xpath("//*[@class='col-sm-6']/input")).click(); 
    // NOTE: we have to give sleep due to java-script takes internal processing time on calendar after it get opens 
    Thread.sleep(5000); 
    // NOTE: calendar is not completely visible hence to make it visible 
    // scroll a little bit down 
    ((JavascriptExecutor) driver).executeScript("window.scrollBy(0,200)"); 

    // take all calendar dates inside the list 
    List<WebElement> myhAvDates = driver.findElements(By.xpath("//*[@class='ui-datepicker-calendar']/tbody/tr/td/a[contains(@class, 'ui-state-default')]")); 

    System.out.println("Size is "+myhAvDates.size()); 
    for(int i=0;i<myhAvDates.size();i++){ 
     wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//*[@class='ui-datepicker-calendar']/tbody/tr/td/a"))); 
     System.out.println("Available Date is : " + myhAvDates.get(i).getText()); 
     act.moveToElement(myhAvDates.get(i)).build().perform(); 
     wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(".datepicker-tooltip"))); 
     WebElement toolTipElement = driver.findElement(By.cssSelector(".datepicker-tooltip")); 
     System.out.println("Available Date is : " + myhAvDates.get(i).getText() + "==" +"And price is "+ toolTipElement.getText()); 
     myhAvDates = driver.findElements(By.xpath("//*[@class='ui-datepicker-calendar']/tbody/tr/td/a")); 
    } 
} 

obigen Code wird wie Antwort ergeben

Size is 10 
Available Date is : 13 
Available Date is : 13==And price is €40 
Available Date is : 19 
Available Date is : 19==And price is €36 
Available Date is : 20 
Available Date is : 20==And price is €49 
Available Date is : 22 
Available Date is : 22==And price is €49 
Available Date is : 25 
Available Date is : 25==And price is €40 
Available Date is : 26 
Available Date is : 26==And price is €39 
Available Date is : 27 
Available Date is : 27==And price is €35 
Available Date is : 28 
Available Date is : 28==And price is €37 
Available Date is : 29 
Available Date is : 29==And price is €37 
Available Date is : 30 
Available Date is : 30==And price is €37 
+0

Ich ging mit den anderen answe, weil seine Python bereits aber danke für Ihre Hilfe sowieso – psychok7

+0

@ psychok7 m froh, dass du findest, wonach du gesucht hast –

+0

hi kannst du mir bitte mithelfen? http://stackoverflow.com/questions/36723659/python-selenium-datepicker-click – psychok7

Verwandte Themen