2016-12-26 3 views
1

I Anker-Links mit class = „_ 1UoZlX“ aus den Suchergebnissen von dieser bestimmten Seite kratzen wollen - https://www.flipkart.com/search?as=on&as-pos=1_1_ic_sam&as-show=on&otracker=start&page=6&q=samsung+mobiles&sid=tyy%2F4ioScraping Elemente gerendert Reagieren JS mit BeautifulSoup

Als ich erstellt eine Suppe von der Seite erkennen ich, dass die Suche Ergebnisse werden mit React JS gerendert und daher kann ich sie in der Seitenquelle (oder in der Suppe) nicht finden.

Hier ist mein Code

import requests 
from bs4 import BeautifulSoup 
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 


listUrls = ['https://www.flipkart.com/search?as=on&as-pos=1_1_ic_sam&as-show=on&otracker=start&page=6&q=samsung+mobiles&sid=tyy%2F4iof'] 
PHANTOMJS_PATH = './phantomjs' 
browser = webdriver.PhantomJS(PHANTOMJS_PATH) 
urls=[] 

for url in listUrls: 
    browser.get(url) 
    wait = WebDriverWait(browser, 20) 
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "_1UoZlX"))) 
    soup = BeautifulSoup(browser.page_source,"html.parser") 
    results = soup.findAll('a',{'class':"_1UoZlX"}) 
    for result in results: 
     link = result["href"] 
     print link 
     urls.append(link) 
    print urls 

Dies ist der Fehler Ich erhalte.

Traceback (most recent call last): 
    File "fetch_urls.py", line 19, in <module> 
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "_1UoZlX"))) 
    File "/usr/local/lib/python2.7/site-packages/selenium/webdriver/support/wait.py", line 80, in until 
    raise TimeoutException(message, screen, stacktrace) 
selenium.common.exceptions.TimeoutException: Message: 
Screenshot: available via screen 

Jemand in this answer erwähnt, dass es einen Weg gibt, Selen zu verwenden, um die Javascript auf einer Seite zu verarbeiten. Kann jemand darauf eingehen? Ich habe etwas gegoogelt, konnte aber keinen Ansatz finden, der für diesen speziellen Fall funktioniert.

Antwort

0

Es gibt kein Problem mit Ihrem Code aber die Website, die Sie kratzen - es stoppt nicht aus irgendeinem Grund laden, die das Parsen der Seite und nachfolgenden Code verhindert, dass Sie geschrieben haben.

ich mit wikipedia versucht, die gleichen zu bestätigen:

from bs4 import BeautifulSoup 
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 

listUrls = ["https://en.wikipedia.org/wiki/List_of_state_and_union_territory_capitals_in_India"] 
# browser = webdriver.PhantomJS('/usr/local/bin/phantomjs') 
browser = webdriver.Chrome("./chromedriver") 
urls=[] 

for url in listUrls: 
    browser.get(url) 
    soup = BeautifulSoup(browser.page_source,"html.parser") 
    results = soup.findAll('a',{'class':"mw-redirect"}) 
    for result in results: 
     link = result["href"] 
     urls.append(link) 
    print urls 

Ausgänge:

[u'/wiki/List_of_states_and_territories_of_India_by_area', u'/wiki/List_of_Indian_states_by_GDP_per_capita', u'/wiki/Constitutional_republic', u'/wiki/States_and_territories_of_India', u'/wiki/National_Capital_Territory_of_Delhi', u'/wiki/States_Reorganisation_Act', u'/wiki/High_Courts_of_India', u'/wiki/Delhi_NCT', u'/wiki/Bengaluru', u'/wiki/Madras', u'/wiki/Andhra_Pradesh_Capital_City', u'/wiki/States_and_territories_of_India', u'/wiki/Jammu_(city)'] 

P. S. Ich benutze einen Chrome-Treiber, um das Skript zum Debugging gegen den echten Chrome-Browser laufen zu lassen. Laden Sie die Chrom-Treiber von https://chromedriver.storage.googleapis.com/index.html?path=2.27/

0

Selen wird die Seite mit der Javascript machen. Ihr Code funktioniert ordnungsgemäß. Es wartet darauf, dass das Element generiert wird. In Ihrem Fall hat Selen das CSS-Element nicht bekommen. Die URL, die Sie angegeben haben, rendert die Ergebnisseite nicht. Stattdessen erzeugt es die folgende Fehlerseite.

http://imgur.com/a/YwFyE

Diese Seite ist nicht mit der CSS-Klasse. Ihr Code wartet auf dieses bestimmte CSS-Element. Versuchen Sie Firefox Web-Treiber, um zu sehen, was passiert.

+0

Ich bin eine Maden-Browser. Das ist vielleicht warum. Wird mit einem normalen Browser versuchen. – dontpanic

+0

Headless Browser sollte gut funktionieren. Regulärer Browser wird leicht zu sehen sein, die Ausgabe. Sie können zum normalen Browser wechseln, sobald das Problem behoben ist. Flipkart öffnet die Fehlerseite die meiste Zeit. Sie sollten das Skript so konfigurieren, dass es bei jedem Auftreten auf die Schaltfläche "Wiederholen" klickt. – Sriraman

Verwandte Themen