2017-01-10 3 views
2

Ich versuche Scrapy mit Selen zu verwenden, um mit Javascript interagieren zu können und habe immer noch das mächtige Scraping-Framework, das scrapy bietet. Ich habe ein Skript geschrieben, das http://www.iens.nl besucht, "Amsterdam" in die Suchleiste eingibt und dann erfolgreich auf die Suchschaltfläche klickt. Nachdem ich auf den Suchknopf geklickt habe, möchte ich scrapy ein Element von der neu gerenderten Seite abrufen. Leider gibt scrapy keine Werte zurück. DieseSelenium + Scrapy verwenden

ist, was mein Code wie folgt aussieht:

from selenium import webdriver 
from scrapy.loader import ItemLoader 
from scrapy import Request 
from scrapy.crawler import CrawlerProcess 
from properties import PropertiesItem 
import scrapy 


class BasicSpider(scrapy.Spider): 
    name = "basic" 
    allowed_domains = ["web"] 
    # Start on a property page 
    start_urls = ['http://www.iens.nl'] 

    def __init__(self): 
     chrome_path = '/Users/username/Documents/chromedriver' 
     self.driver = webdriver.Chrome(chrome_path) 

    def parse(self, response): 
     self.driver.get(response.url) 
     text_box = self.driver.find_element_by_xpath('//*[@id="searchText"]') 
     submit_button = self.driver.find_element_by_xpath('//*[@id="button_search"]') 
     text_box.send_keys("Amsterdam") 
     submit_button.click() 

     l = ItemLoader(item=PropertiesItem(), response=response) 
     l.add_xpath('description', '//*[@id="results"]/ul/li[1]/div[2]/h3/a/') 

     return l.load_item() 


process = CrawlerProcess() 
process.crawl(BasicSpider) 
process.start() 

"Eigenschaften" ein anderes Skript, das wie folgt aussieht:

from scrapy.item import Item, Field 

class PropertiesItem(Item): 
    # Primary fields 
    description = Field() 

F: Wie kann ich erfolgreich das Element scrapy finden machen Ich rufe "description" durch seinen xpath auf der Seite Selen erreicht und gebe es als Ausgabe zurück?

Vielen Dank im Voraus!

+0

Haben Sie konfiguriert, dass Ihr Code "Parse" erreicht? mit einem print oder sowas – eLRuLL

+0

@eLRuLL hat es 'parse' erreicht, sonst wäre Selen nicht auf die nächste Seite gerückt, oder? – titusAdam

+0

Sie möchten vielleicht einen Blick darauf werfen, für andere Möglichkeiten, Scrapy mit Selen zu verbinden: http://stackoverflow.com/a/36085533/1204332 –

Antwort

3

Objekt, das Sie zu Ihrem ItemLoader zuweisen, ist die scrapy Antwort, nicht Selenium.

Ich würde empfehlen, eine neue Selector mit der Seite Quelle von Selen zurücklegen:

from scrapy import Selector 
... 

selenium_response_text = driver.page_source 

new_selector = Selector(text=selenium_response_text) 
l = ItemLoader(item=PropertiesItem(), selector=new_selector) 
... 

auf diese Weise die add_xpath werden Informationen aus dieser Antwortstruktur statt scrapy erhalten (die Sie nicht wirklich benötigen).

+0

Wie ich schon sagte; Ich möchte Scrapy verwenden, um die Daten wegen ihrer Geschwindigkeit zu kratzen! Ich weiß, wie man Selen verwendet. :) – titusAdam

+0

@titusAdam Geschwindigkeit ist nicht wirklich eine Sache in Selen. Wenn Sie Geschwindigkeit wollen, müssen Sie entweder Selen völlig auslassen oder es durch etwas ersetzen, das asynchrones Rendering unterstützt. d. h. [Splash] (http://splash.readthedocs.io/en/stable/) – Granitosaurus

+0

@Granitosaurus ist es möglich, sich durch Seiten mit Splash zu bewegen, wie Selen in diesem Beispiel? – titusAdam