2016-03-03 17 views
5

Używam Splash 2.0.2 + Scrapy 1.0.5 + Scrapyjs 0.1.1 i nadal nie jestem w stanie renderować javascript za pomocą kliknięcia. Oto przykład url https://olx.pt/anuncio/loja-nova-com-250m2-garagem-em-box-fechada-para-arrumos-IDyTzAT.html#c49d3d94cfScrapy + Splash + ScrapyJS

ja wciąż otrzymuję stronę bez numeru telefonu renderowany:

class OlxSpider(scrapy.Spider): 
    name = "olx" 
    rotate_user_agent = True 
    allowed_domains = ["olx.pt"] 
    start_urls = [ 
     "https://olx.pt/imoveis/" 
    ] 

    def parse(self, response): 
     script = """ 
     function main(splash) 
      splash:go(splash.args.url) 
      splash:runjs('document.getElementById("contact_methods").getElementsByTagName("span")[1].click();') 
      splash:wait(0.5) 
      return splash:html() 
     end 
     """ 
     for href in response.css('.link.linkWithHash.detailsLink::attr(href)'): 
      url = response.urljoin(href.extract()) 
      yield scrapy.Request(url, callback=self.parse_house_contents, meta={ 
       'splash': { 
        'args': {'lua_source': script}, 
        'endpoint': 'execute', 
       } 
      }) 

     for next_page in response.css('.pager .br3.brc8::attr(href)'): 
      url = response.urljoin(next_page.extract()) 
      yield scrapy.Request(url, self.parse) 

    def parse_house_contents(self, response): 

     import ipdb;ipdb.set_trace() 

Jak mogę uzyskać to do pracy?

Odpowiedz

2

Możesz w pierwszej kolejności unikać używania Splash i wysyłać odpowiednie żądanie GET, aby uzyskać numer telefonu. pająk pracy:

import json 
import re 

import scrapy 

class OlxSpider(scrapy.Spider): 
    name = "olx" 
    rotate_user_agent = True 
    allowed_domains = ["olx.pt"] 
    start_urls = [ 
     "https://olx.pt/imoveis/" 
    ] 

    def parse(self, response): 
     for href in response.css('.link.linkWithHash.detailsLink::attr(href)'): 
      url = response.urljoin(href.extract()) 
      yield scrapy.Request(url, callback=self.parse_house_contents) 

     for next_page in response.css('.pager .br3.brc8::attr(href)'): 
      url = response.urljoin(next_page.extract()) 
      yield scrapy.Request(url, self.parse) 

    def parse_house_contents(self, response): 
     property_id = re.search(r"ID(\w+)\.", response.url).group(1) 

     phone_url = "https://olx.pt/ajax/misc/contact/phone/%s/" % property_id 
     yield scrapy.Request(phone_url, callback=self.parse_phone) 

    def parse_phone(self, response): 
     phone_number = json.loads(response.body)["value"] 
     print(phone_number) 

Jeśli istnieje więcej rzeczy wydobyć z tego „dynamiczne” stronie internetowej, sprawdź, czy jest wystarczająco Splash naprawdę, a jeśli nie, to zajrzeć do automatyzacji przeglądarki i selenium.

+0

I rzeczywiście potrzebują tego do pracy, bo będzie przejście do bardziej skomplikowanych js witryn z kalendarzy wyboru daty i rzeczy – psychok7

+1

@ psychok7 jesteś pewna scrapyjs wystarczyłoby dla twojej złożonej dynamicznej strony internetowej? Może przejście na "selen" sprawi, że wszystko pójdzie szybciej i prościej .. – alecxe

+0

Próbuję tego .. Nie mam pojęcia, czy to możliwe, czy nie .. Ale przyjrzę się także selenowi dzięki – psychok7

3

Dodaj

splash:autoload("https://code.jquery.com/jquery-2.1.3.min.js") 

do skryptu Lua i będzie działać.

function main(splash) 
    splash:go(splash.args.url) 
    splash:autoload("https://code.jquery.com/jquery-2.1.3.min.js") 
    splash:runjs('document.getElementById("contact_methods").getElementsByTagName("span")[1].click();') 
    splash:wait(0.5) 
    return splash:html() 
end 

.Kliknij() to funkcja JQuery https://api.jquery.com/click/