2016-04-27 15 views
0

I scrapy und Selen zu verwenden, gerade erst begonnen, und ich habe einige Probleme mit einer Webseite in die Verschrottung, die unendliche Scrollen hat:Scrolling in Selenium nach unten mit Scrapy nicht funktioniert

http://observador.pt/opiniao/autor/ahcristo

So möchte ich Extrahieren Sie die Links für jeden Eintrag (politische Texte). Mit scrapy ist das alleine nicht möglich, da man scrollen muss, um alle Einträge anzeigen zu lassen. Ich benutze Selen, um den Chrome-Browser und Scroll-Dow zu simulieren. Mein Problem ist, dass das Scrollen nicht funktioniert. Ich habe den Code in anderen ähnlichen Beispielen wie this oder this basiert. Der Code zählt nach jedem Scrollen die Anzahl der gesamten Eintragslinks und wenn er in Ordnung war, sollte er nach jedem Schritt zunehmen. Es gibt mir eine konstante Anzahl von 24 Links.

## -*- coding: utf-8 -*- 

import scrapy 
from selenium import webdriver 
import time 

from observador.items import ObservadorItem 

class OpinionSpider(scrapy.Spider): 
    name = "opinionspider" 
    start_urls = ["http://observador.pt/opiniao/"] 

    def __init__(self): 
     self.driver = webdriver.Chrome() 

    def parse(self, response): 
     # Colunistas 
     for url in response.xpath('//*[@id="main"]/div/div[1]/ul/li[1]/div/ul/li[*]/a/@href').extract(): 
      # test for a single author 
      if url == 'http://observador.pt/opiniao/autor/ahcristo':    
       yield scrapy.Request(url,callback=self.parse_author_main_page) 
      else: 
       continue 

    def parse_author_main_page(self,response): 
     self.driver.get(response.url) 

     count = 0 
     for url in response.xpath('//*[@id="main"]/div/div[3]/div[1]/article[*]/h1/a/@href').extract(): 
      count += 1 
     print "Number of links: ",count 

     for i in range(1,100): 
      self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") 
      time.sleep(4) 

      count = 0 
      for url in response.xpath('//*[@id="main"]/div/div[3]/div[1]/article[*]/h1/a/@href').extract(): 
       count += 1 
     print "Number of links: ",count 

     self.driver.close() 

Antwort

0

Ihr Weg, dies mit Selenium zu lösen, ist vielleicht etwas übertrieben.

Wenn Sie sich ansehen, wie die Webseite, die Sie aussortieren möchten, funktioniert, laden Sie einfach die Artikel, indem Sie eine AJAX-Anfrage machen (POST auf der Seite /wp-admin/admin-ajax.php).

Versuchen Sie einfach zu replizieren, wie der JavaScript-Code, der die Artikel lädt, in Ihrem Spider funktioniert. Ich werde viel schneller und einfacher sein.

Hier ist ein funktionierendes cURL Abfrage einige Artikel zum Abrufen

curl 'http://observador.pt/wp-admin/admin-ajax.php' 
     -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' 
     --data 'action=obs_get_latest_articles&offset=2&section=author&scroll_type=usual&data_id=74&data_type=1&exclude=&nonce=5145441fea' 
+0

Ok, danke für die Antwort. Wie hast du das herausgefunden? Ich gestehe, ich verstehe Ihre Antwort nicht sehr, und ich zeigte Ihnen ein Beispiel für den Autor "http://observador.pt/opiniao/autor/ahcristo". Ich muss die gleiche Verschrottung auf alle verschiedenen Autoren anwenden. – Miguel