2016-03-03 15 views
5

मैं Splash 2.0.2 + Scrapy 1.0.5 + Scrapyjs 0.1.1 का उपयोग कर रहा हूं और मैं अभी भी एक क्लिक के साथ जावास्क्रिप्ट प्रस्तुत करने में सक्षम नहीं हूं।स्क्रैप + स्पलैश + स्कैरेपीजेएस

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() 

मैं कैसे यह काम करने के लिए प्राप्त कर सकते हैं: यहाँ एक उदाहरण यूआरएल https://olx.pt/anuncio/loja-nova-com-250m2-garagem-em-box-fechada-para-arrumos-IDyTzAT.html#c49d3d94cf

मैं अभी भी प्रदान की गई फोन नंबर के बिना पेज हो रही है?

उत्तर

2

आप पहले स्थान पर Splash का उपयोग करने से बच सकते हैं और फोन नंबर प्राप्त करने के लिए उपयुक्त जीईटी अनुरोध कर सकते हैं। कार्य मकड़ी:

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) 

अगर वहाँ अधिक चीजों को इस "डायनामिक" वेबसाइट से निकालने के लिए कर रहे हैं,,, अगर स्पलैश वास्तव में पर्याप्त है देख सकते हैं और नहीं तो ब्राउज़र स्वचालन और selenium पर गौर।

+0

है मैं वास्तव में यह काम करने के लिए है क्योंकि मैं @ psychok7 आप कर रहे हैं यकीन है कि scrapyjs पर्याप्त होगा दिनांक पिकर कैलेंडर और सामान – psychok7

+1

साथ करने के लिए और अधिक जटिल js साइटों ले जाया जा रहा जरूरत है आपकी जटिल गतिशील वेब साइट के लिए? हो सकता है कि 'सेलेनियम' पर स्विच करने से चीजें तेजी से और सरल हो जाएंगी .. – alecxe

+0

मैं इसे आज़मा रहा हूं .. मुझे नहीं पता कि यह संभव है या नहीं .. लेकिन मैं सेलेनियम में भी देखूंगा धन्यवाद – psychok7

3

लुआ स्क्रिप्ट के

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

जोड़ें और यह काम करेंगे।

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 

.click() JQuery समारोह https://api.jquery.com/click/

संबंधित मुद्दे