2015-09-11 3 views
5

यहां कोड है जिसे मैंने वेब पेज के पार्सिंग के लिए उपयोग किया था। मैंने इसे रेल कंसोल में किया था। लेकिन मुझे अपने रेल कंसोल में कोई आउटपुट नहीं मिल रहा है। साइट जो मैं स्क्रैप करना चाहता हूं आलसी लोड हो रहा हैआलसी लोडिंग वाले पृष्ठों को कैसे स्क्रैप करें

require 'nokogiri' 
require 'open-uri' 

page = 1 
while true 
    url = "http://www.justdial.com/functions"+"/ajxsearch.php?national_search=0&act=pagination&city=Delhi+%2F+NCR&search=Pandits"+"&where=Delhi+Cantt&catid=1195&psearch=&prid=&page=#{page}" 


    doc = Nokogiri::HTML(open(url)) 
    doc = Nokogiri::HTML(doc.at_css('#ajax').text) 
    d = doc.css(".rslwrp") 
    d.each do |t| 
    puts t.css(".jrcw").text 
    puts t.css("span.jcn").text 
    puts t.css(".jaid").text 
    puts t.css(".estd").text 
    page+=1 
    end 
end 

उत्तर

4

रहा है आप 2 विकल्प यहाँ हैं:

  1. स्विच शुद्ध HTTP कुछ उपकरण जो (चयनित proper driver के साथ) इस तरह के Capybara के रूप में जावास्क्रिप्ट मूल्यांकन, का समर्थन करता है के लिए scraping। यह धीमा हो सकता है, क्योंकि आप हूड के नीचे हेडलेस ब्राउज़र चला रहे हैं और आपको कुछ टाइमआउट सेट करना होगा या यह सुनिश्चित करने के लिए एक और तरीका तय करना होगा कि आप जिस पाठ में दिलचस्पी रखते हैं उसके ब्लॉक को किसी भी स्क्रैपिंग शुरू करने से पहले लोड किया गया हो।

  2. दूसरा विकल्प वेब डेवलपर कंसोल का उपयोग करना है और यह पता लगाना है कि टेक्स्ट के उन ब्लॉक को कैसे लोड किया जाता है (जो AJAX कॉल, उनके पैरामीटर और आदि) और उन्हें आपके स्क्रैपर में लागू करते हैं। यह, और अधिक उन्नत दृष्टिकोण है, लेकिन अधिक performant है के बाद से आप किसी अतिरिक्त कार्य नहीं होगा, जैसे आप विकल्प में क्या किया है 1.

आपका दिन शुभ हो!

अद्यतन:

आपका कोड से काम नहीं होता है, क्योंकि प्रतिक्रिया एचटीएमएल JSON ऑब्जेक्ट में लिपटे कोड है, जब आप एक कच्चे एचटीएमएल के रूप में यह पार्स करने के लिए कोशिश कर रहे हैं। यह इस तरह दिखता है:

{ 
    "error": 0, 
    "msg": "request successful", 
    "paidDocIds": "some ids here", 
    "itemStartIndex": 20, 
    "lastPageNum": 50, 
    "markup": 'LOTS AND LOTS AND LOTS OF MARKUP' 
} 

आपको क्या करना होगा खोलना JSON है और उसके बाद HTML के रूप में पार्स:

require 'json' 

json = JSON.parse(open(url).read) # make sure you check http errors here 
html = json['markup'] # can this field be empty? check for the json['error'] field 
doc = Nokogiri::HTML(html) # parse as you like 

मैं भी advise you againstopen-uri का उपयोग कर अपने कोड कमजोर करता है, तो आप क्योंकि गतिशील यूआरएल का उपयोग हो सकता है चाहता हूँ के बाद से जिस तरह से open-uri काम करता है (विवरण के लिए लिंक किए गए आलेख को पढ़ें) और HTTParty और RestClient जैसे अच्छे और अधिक फीचर-वार लाइब्रेरी का उपयोग करें।

अद्यतन 2: कम से कम काम कर रहे स्क्रिप्ट मेरे लिए:

require 'json' 
require 'open-uri' 
require 'nokogiri' 

url = 'http://www.justdial.com/functions/ajxsearch.php?national_search=0&act=pagination&city=Delhi+%2F+NCR&search=Pandits&where=Delhi+Cantt&catid=1195&psearch=&prid=&page=2' 

json = JSON.parse(open(url).read) # make sure you check http errors here 
html = json['markup'] # can this field be empty? check for the json['error'] field 
doc = Nokogiri::HTML(html) # parse as you like 
puts doc.at_css('#newphoto10').attr('title') 
# => Dr Raaj Batra Lal Kitab Expert in East Patel Nagar, Delhi 
+0

मैं कंसोल में यह जाँच ... सभी ajax कॉल पेज को छोड़कर एक ही पैरामीटर नहीं ...... केवल एक चीज है जो बदलता है पृष्ठ कोई और मैंने प्लेसहोल्डर में पहले से पेज नंबर डाला है और इसे लूप में रखा है –

+0

यदि आप ब्राउज़र में यह यूआरएल खोलते हैं: 'http://www.justdial.com/functions/ajxsearch.php?national_search=0&act=pagination&city=Delhi+%2F+NCR&search = पंडित्स और कहां = दिल्ली + कैंट और कैटिड = 11 9 5 और पिसर्च = और प्राइड = और पेज = 2' यह कुछ JSON प्रतिक्रिया दिखाता है, ऐसा लगता है कि यह ठीक काम कर रहा है, है ना? –

+0

मेरा वास्तविक यूआरएल यह है http://www.justdial.com/Delhi-NCR/Pandits-%3Cearear%3E-delhi/ct-1195 यूआरएल जिसका मैंने अपने प्रश्न में उल्लेख किया है, मुझे इसे कंसोल –

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