2016-06-16 17 views
0

Ich habe eine scrapy Crawlspider, die Links analysiert und HTML-Inhalt zurückgibt gut. Bei JavaScript-Seiten habe ich Selenium allerdings dazu aufgerufen, auf den "versteckten" Inhalt zuzugreifen. Das Problem ist, dass, während Selen außerhalb des scrapy Parsing funktioniert, funktioniert es nicht innerhalb der parse_itemsSelen innerhalb von Scrapy funktioniert nicht

funktionieren
from scrapy.spiders import CrawlSpider, Rule, Spider 
from scrapy.selector import HtmlXPathSelector 
from scrapy.linkextractors import LinkExtractor 
from scrapy.linkextractors.sgml import SgmlLinkExtractor 
from craigslist_sample.items import CraigslistReviewItem 
import scrapy 
from selenium import selenium 
from selenium import webdriver 


class MySpider(CrawlSpider): 
    name = "spidername" 
    allowed_domains = ["XXXXX"] 
    start_urls = ['XXXXX'] 

    rules = (
     Rule(LinkExtractor(allow = ('reviews\?page')),callback= 'parse_item'), 
     Rule(LinkExtractor(allow=('.',),deny = ('reviews\?page',)),follow=True)) 

    def __init__(self): 
     #this page loads 
     CrawlSpider.__init__(self) 
     self.selenium = webdriver.Firefox() 
     self.selenium.get('XXXXX') 
     self.selenium.implicitly_wait(30) 


    def parse_item(self, response): 
     #this page doesnt 
     print response.url 
     self.driver.get(response.url) 
     self.driver.implicitly_wait(30) 

     #...do things 
+0

Sie beschreiben nicht, was es genau ist, funktioniert nicht noch was du versucht hast. Wir müssen irgendwie wissen, was "# ... Dinge tun" tatsächlich tut. – Mobrockers

+0

HINWEIS: Bitte verwenden Sie nicht Modulname als Variablenname in Ihrem Skript, wie Sie "selen" verwenden –

Antwort

1

Sie haben einige variable Ausgaben. In der Methode init ordnen Sie die Browser-Instanz self.selenium zu und verwenden dann in der Methode parse_item self.driver als Browser-Instanz. Ich habe dein Skript aktualisiert. Versuche es jetzt.

from scrapy.spiders import CrawlSpider, Rule, Spider 
from scrapy.selector import HtmlXPathSelector 
from scrapy.linkextractors import LinkExtractor 
from scrapy.linkextractors.sgml import SgmlLinkExtractor 
from craigslist_sample.items import CraigslistReviewItem 
import scrapy 
from selenium import selenium 
from selenium import webdriver 


class MySpider(CrawlSpider): 
    name = "spidername" 
    allowed_domains = ["XXXXX"] 
    start_urls = ['XXXXX'] 

    rules = (
     Rule(LinkExtractor(allow = ('reviews\?page')),callback= 'parse_item'), 
     Rule(LinkExtractor(allow=('.',),deny = ('reviews\?page',)),follow=True)) 

    def __init__(self): 
     #this page loads 
     CrawlSpider.__init__(self) 
     self.driver= webdriver.Firefox() 
     self.driver.get('XXXXX') 
     self.driver.implicitly_wait(30) 


    def parse_item(self, response): 
     #this page doesnt 
     print response.url 
     self.driver.get(response.url) 
     self.driver.implicitly_wait(30) 

     #...do things 
0

Großartig! eine Kombination von Hassan Antwort und bessere Kenntnis der URLs, die ich scraping führte zur Antwort (stellt sich heraus, die Website hatte "gefälschte" URLs gepflanzt, die nie geladen)

+0

Also akzeptieren Sie Hassans Antwort, um ihm Kredit zu geben für die Arbeit, die er getan hat. Schreibe nicht deine eigene Antwort. – JeffC

Verwandte Themen