Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

अपना पहला वेब स्क्रैपर बनाना, भाग 1

रूबीलैंड के पास दो रत्न हैं जिन्होंने पिछले कुछ वर्षों से वेब स्क्रैपिंग स्पॉटलाइट पर कब्जा कर लिया है:नोकोगिरी और मैकेनाइज। हम इनमें से प्रत्येक पर एक व्यावहारिक उदाहरण के साथ कार्रवाई करने से पहले एक लेख खर्च करते हैं।

विषय

  • वेब स्क्रैपिंग?
  • अनुमति
  • समस्या
  • नोकोगिरी
  • निष्कर्षण?
  • पेज
  • एपीआई
  • नोड नेविगेशन

वेब स्क्रैपिंग?

वेब या स्क्रीन स्क्रैपिंग की तुलना में फैंसी शब्द हैं। वेब हार्वेस्टिंग और वेब डेटा निष्कर्षण बहुत कुछ आपको तुरंत बता देता है कि क्या हो रहा है। हम वेब पेजों से डेटा की निकासी को स्वचालित कर सकते हैं—और यह उतना जटिल भी नहीं है।

एक तरह से, ये उपकरण आपको मानव वेब ब्राउज़िंग की नकल और स्वचालित करने की अनुमति देते हैं। आप एक प्रोग्राम लिखते हैं जो केवल उस प्रकार के डेटा को निकालता है जो आपकी रुचि का है। विशिष्ट डेटा को लक्षित करना लगभग उतना ही आसान है जितना कि CSS चयनकर्ताओं का उपयोग करना।

कुछ साल पहले मैंने कुछ ऑनलाइन वीडियो कोर्स की सदस्यता ली थी, जिसमें एक लाख लघु वीडियो थे, लेकिन उन्हें थोक में डाउनलोड करने का कोई विकल्प नहीं था। मुझे अपने दम पर हर कड़ी से गुजरना पड़ा और खतरनाक 'सेव ऐज' खुद करना पड़ा। यह एक तरह से मानव वेब स्क्रैपिंग था - कुछ ऐसा जो हमें अक्सर करने की आवश्यकता होती है जब हमारे पास उस तरह के सामान को स्वचालित करने के लिए ज्ञान की कमी होती है। पाठ्यक्रम अपने आप में ठीक था, लेकिन उसके बाद मैंने उनकी सेवाओं का उपयोग नहीं किया। यह अभी बहुत थकाऊ था।

आज, मैं इस तरह के दिमागी पिघलने वाले यूएक्स के बारे में ज्यादा परवाह नहीं करता। एक स्क्रैपर जो मेरे लिए डाउनलोडिंग करेगा, मुझे एक साथ फेंकने में केवल कुछ मिनट लगेंगे। कोई बड़ी बात नहीं!

इससे पहले कि हम शुरू करें, मैं इसे जल्दी से जल्दी तोड़ दूं। पूरी बात को दो चरणों में संघनित किया जा सकता है। सबसे पहले हम एक वेब पेज लाते हैं जिसमें वांछित डेटा होता है जिसकी हमें आवश्यकता होती है। फिर हम उस पृष्ठ के माध्यम से खोज करते हैं और उस जानकारी की पहचान करते हैं जिसे हम निकालना चाहते हैं।

अंतिम चरण इन बिट्स को लक्षित करना है, यदि आवश्यक हो तो उन्हें टुकड़ा करना है, और यह तय करना है कि आप उन्हें कैसे और कहाँ स्टोर करना चाहते हैं। इस प्रक्रिया को आसान और आनंददायक बनाने के लिए अक्सर अच्छी तरह से लिखा गया HTML महत्वपूर्ण होता है। अधिक सम्मिलित अर्क के लिए, यदि आपको खराब संरचित मार्कअप से निपटना है तो यह एक दर्द हो सकता है।

एपीआई के बारे में क्या? बहुत अच्छा प्रश्न। यदि आपके पास एपीआई के साथ किसी सेवा तक पहुंच है, तो अक्सर अपना खुद का स्क्रैपर लिखने की आवश्यकता नहीं होती है। यह दृष्टिकोण ज्यादातर उन वेबसाइटों के लिए है जो उस तरह की सुविधा प्रदान नहीं करती हैं। एपीआई के बिना, यह अक्सर वेबसाइटों से जानकारी के निष्कर्षण को स्वचालित करने का एकमात्र तरीका है।

आप पूछ सकते हैं, यह स्क्रैपिंग चीज़ वास्तव में कैसे काम करती है? गहरे अंत में कूदने के बिना, संक्षिप्त उत्तर ट्री डेटा संरचनाओं को पार करके है। नोकोगिरी इन डेटा संरचनाओं को आपके द्वारा फ़ीड किए गए दस्तावेज़ों से बनाता है और आपको निष्कर्षण के लिए रुचि के बिट्स को लक्षित करने देता है। उदाहरण के लिए, CSS ट्री ट्रैवर्सल के लिए लिखी गई भाषा है, ट्री डेटा संरचनाओं की खोज के लिए, और हम इसका उपयोग डेटा निष्कर्षण के लिए कर सकते हैं।

वहाँ खेलने के लिए कई दृष्टिकोण और समाधान हैं। रूबीलैंड के पास दो रत्न हैं जो कई वर्षों से सुर्खियों में हैं। बहुत से लोग अभी भी HTML स्क्रैपिंग जरूरतों के लिए नोकोगिरी और मैकेनाइज पर भरोसा करते हैं। दोनों का परीक्षण किया गया है और अत्यधिक सक्षम होने के बावजूद खुद को उपयोग में आसान साबित किया है। हम दोनों को देखेंगे। लेकिन इससे पहले, मैं उस समस्या का समाधान करने के लिए कुछ समय देना चाहता हूं जिसे हम इस संक्षिप्त परिचयात्मक श्रृंखला के अंत में हल करने जा रहे हैं।

अनुमति

इससे पहले कि आप स्क्रैप करना शुरू करें, सुनिश्चित करें कि आपके पास उन साइटों की अनुमति है जिन्हें आप डेटा निष्कर्षण के लिए एक्सेस करने का प्रयास कर रहे हैं। उदाहरण के लिए, यदि साइट में एपीआई या आरएसएस फ़ीड है, तो उस वांछित सामग्री को प्राप्त करना न केवल आसान हो सकता है, बल्कि यह पसंद का कानूनी विकल्प भी हो सकता है।

यदि आप उनकी साइटों पर बड़े पैमाने पर स्क्रैपिंग करते हैं, तो हर कोई इसकी सराहना नहीं करेगा-समझ में आता है। उस विशेष साइट पर खुद को शिक्षित करें जिसमें आप रुचि रखते हैं, और खुद को परेशानी में न डालें। संभावना कम है कि आप गंभीर नुकसान पहुंचाएंगे, लेकिन अनजाने में परेशानी का जोखिम उठाने का रास्ता नहीं है।

समस्या

मुझे एक नया पॉडकास्ट बनाने की जरूरत थी। डिज़ाइन वह नहीं था जहाँ मैं चाहता था, और मुझे नई पोस्ट प्रकाशित करने के तरीके से नफरत थी। धिक्कार है WYSIWYGs! थोड़ा सा प्रसंग। लगभग दो साल पहले, मैंने अपने पॉडकास्ट का पहला संस्करण बनाया था। विचार सिनात्रा के साथ खेलना और कुछ सुपर लाइटवेट बनाना था। मैं कुछ अप्रत्याशित मुद्दों में भाग गया क्योंकि मैंने काफी सब कुछ तैयार किया था।

रेल से आ रहा है, यह निश्चित रूप से एक शैक्षिक यात्रा थी जिसकी मैं सराहना करता हूं, लेकिन मुझे जल्दी से खेद है कि मैं एक स्थिर साइट का उपयोग नहीं कर रहा था जिसे मैं गिटहब पृष्ठों के माध्यम से गिटहब के माध्यम से तैनात कर सकता था। नए एपिसोड को परिनियोजित करने और उन्हें बनाए रखने में उस सादगी का अभाव था जिसकी मुझे तलाश थी। थोड़ी देर के लिए, मैंने फैसला किया कि मेरे पास तलने के लिए बड़ी मछली है और इसके बजाय नई पॉडकास्ट सामग्री बनाने पर ध्यान केंद्रित किया।

पिछली गर्मियों में मैंने गंभीर होना शुरू कर दिया और एक मध्यस्थ साइट पर काम किया जिसे गिटहब पृष्ठों के माध्यम से होस्ट किया जाता है। शो के दूसरे सीजन के लिए, मुझे कुछ नया चाहिए था। एक नया, सरलीकृत डिज़ाइन, नए एपिसोड प्रकाशित करने के लिए मार्कडाउन, और हेरोकू-स्वर्ग के साथ कोई मुट्ठी नहीं लड़ता! बात यह थी कि मेरे पास 139 एपिसोड पड़े थे जिन्हें आयात करने और बिचौलिए के साथ काम करने के लिए पहले परिवर्तित करने की आवश्यकता थी।

पोस्ट के लिए, बिचौलिया .markdown . का उपयोग करता है फ़ाइलें जो डेटा के लिए तथाकथित फ्रंटमैटर हैं - जो मूल रूप से मेरे डेटाबेस को बदल देती हैं। यह स्थानांतरण हाथ से करना 139 एपिसोड के लिए एक विकल्प नहीं है। यही गणना के लिए है। मुझे अपनी पुरानी वेबसाइट के HTML को पार्स करने, प्रासंगिक सामग्री को परिमार्जन करने और इसे ब्लॉग पोस्ट में स्थानांतरित करने का एक तरीका निकालने की आवश्यकता थी, जिसका उपयोग मैं मिडलमैन पर नए पॉडकास्ट एपिसोड प्रकाशित करने के लिए करता हूं।

इसलिए, अगले तीन लेखों में, मैं आपको ऐसे कार्यों के लिए आमतौर पर रूबीलैंड में उपयोग किए जाने वाले टूल से परिचित कराने जा रहा हूं। अंत में, हम आपको कुछ व्यावहारिक दिखाने के लिए मेरे समाधान पर भी जाएंगे।

नोकोगिरी

यहां तक ​​​​कि अगर आप रूबी / रेल के लिए पूरी तरह से नए हैं, तो संभावना बहुत अच्छी है कि आपने इस छोटे से रत्न के बारे में पहले ही सुना होगा। नाम अक्सर छूट जाता है और आसानी से आपसे चिपक जाता है। मुझे यकीन नहीं है कि बहुत से लोग जानते हैं कि "आरा" के लिए नोकोगिरी जापानी है।

यह एक उपयुक्त नाम है जब आप समझ जाते हैं कि उपकरण क्या करता है। इस रत्न के निर्माता प्यारे टेंडरलोव, आरोन पैटरसन हैं। नोकोगिरी एक्सएमएल और एचटीएमएल दस्तावेज़ों को डेटा संरचना में बदल देती है—एक ट्री डेटा संरचना, अधिक सटीक होने के लिए। उपकरण तेज है और एक अच्छा इंटरफ़ेस भी प्रदान करता है। कुल मिलाकर, यह एक बहुत ही शक्तिशाली पुस्तकालय है जो आपकी HTML स्क्रैपिंग आवश्यकताओं की भीड़ का ख्याल रखता है।

आप न केवल HTML को पार्स करने के लिए नोकोगिरी का उपयोग कर सकते हैं; एक्सएमएल निष्पक्ष खेल भी है। यह आपको आपके द्वारा लोड किए गए दस्तावेज़ों को पार करने के लिए XML पथ भाषा और CSS इंटरफेस दोनों के विकल्प देता है। XML पथ भाषा, या संक्षेप में XPath, एक क्वेरी भाषा है।

यह हमें XML दस्तावेज़ों से नोड्स का चयन करने की अनुमति देता है। CSS चयनकर्ता शुरुआती लोगों के लिए अधिक परिचित होने की संभावना है। जैसा कि आप शैलियों के साथ लिखते हैं, सीएसएस चयनकर्ता उन पृष्ठों के विशिष्ट अनुभागों को लक्षित करना बहुत आसान बनाते हैं जो निष्कर्षण के लिए रुचि रखते हैं। आपको बस नोकोगिरी को यह बताने की जरूरत है कि जब आप किसी विशेष गंतव्य को लक्षित करते हैं तो आप क्या चाहते हैं।

पेज

जिस चीज से हमें हमेशा शुरुआत करने की जरूरत होती है, वह उस वास्तविक पृष्ठ को लाना है जिसमें हम रुचि रखते हैं। हम निर्दिष्ट करते हैं कि हम किस प्रकार के नोकोगिरी दस्तावेज़ को पार्स करना चाहते हैं- उदाहरण के लिए एक्सएमएल या एचटीएमएल:

Nokogiri::XML

Nokogiri::HTML

some_scraper.rb

require "nokogiri"

require "open-uri"

page = Nokogiri::XML(File.open("some.xml"))

page = Nokogiri::HTML(File.open("some.html"))

Nokogiri:XML और Nokogiri:HTML IO ऑब्जेक्ट या स्ट्रिंग ऑब्जेक्ट ले सकते हैं। ऊपर जो होता है वह सीधा है। यह open-uri . का उपयोग करके निर्दिष्ट पृष्ठ को खोलता और प्राप्त करता है और फिर इसकी संरचना, इसके एक्सएमएल या एचटीएमएल को एक नए नोकोगिरी दस्तावेज़ में लोड करता है। एक्सएमएल कुछ ऐसा नहीं है जिससे शुरुआती लोगों को अक्सर निपटना पड़ता है।

इसलिए, मैं अनुशंसा करता हूं कि हम अभी के लिए HTML पार्सिंग पर ध्यान केंद्रित करें। क्यों open-uri ? रूबी स्टैंडर्ड लाइब्रेरी का यह मॉड्यूल हमें बिना किसी झंझट के साइट को हथियाने देता है। क्योंकि IO ऑब्जेक्ट निष्पक्ष खेल हैं, हम open-uri . का आसान उपयोग कर सकते हैं .

एपीआई

आइए इसे एक छोटे से उदाहरण के साथ व्यवहार में लाएं:

at_css

some_podcast_scraper.rb

require 'nokogiri'

require "open-uri"

url = 'https://betweenscreens.fm/'

page = Nokogiri::HTML(open(url))

header = page.at_css("h2.post-title")

title = header.text

puts "This is the raw header of the latest episode: #{header}"

puts "This is the title of the latest episode: #{title}"

हमने यहां जो किया वह उन सभी चरणों का प्रतिनिधित्व करता है जो आमतौर पर वेब स्क्रैपिंग से जुड़े होते हैं—बस एक सूक्ष्म स्तर पर। हम तय करते हैं कि हमें कौन सा यूआरएल चाहिए और हमें कौन सी साइट लाने की जरूरत है, और हम उन्हें एक नए नोकोगिरी दस्तावेज़ में लोड करते हैं। फिर हम उस पेज को खोलते हैं और एक खास सेक्शन को टारगेट करते हैं।

यहां मैं केवल नवीनतम एपिसोड का शीर्षक जानना चाहता था। at_css . का उपयोग करना h2.post-title . के लिए विधि और CSS चयनकर्ता निष्कर्षण बिंदु को लक्षित करने के लिए मुझे बस इतना ही चाहिए था। हालाँकि, इस पद्धति से हम केवल इस एकवचन तत्व को ही परिमार्जन करेंगे। यह हमें संपूर्ण चयनकर्ता देता है- जो कि ज्यादातर समय ठीक वैसा नहीं होता जैसा हमें चाहिए। इसलिए हम text . के माध्यम से इस नोड के केवल आंतरिक पाठ भाग को निकालते हैं तरीका। तुलना के लिए, आप नीचे दिए गए हेडर और टेक्स्ट दोनों के लिए आउटपुट की जांच कर सकते हैं।

आउटपुट

This is the raw title of the latest episode: <h2 class="post-title"><a href="episodes/142/">David Heinemeier Hansson</a></h2>

This is the title of the latest episode: David Heinemeier Hansson

यद्यपि इस उदाहरण में बहुत सीमित अनुप्रयोग हैं, इसमें सभी अवयव, सभी चरण हैं जिन्हें आपको समझने की आवश्यकता है। मुझे लगता है कि यह अच्छा है कि यह कितना आसान है। क्योंकि यह इस उदाहरण से स्पष्ट नहीं हो सकता है, मैं यह बताना चाहूंगा कि यह उपकरण कितना शक्तिशाली हो सकता है। आइए देखें कि हम नोकोगिरी लिपि के साथ और क्या कर सकते हैं।

ध्यान दें!

यदि आप एक नौसिखिया हैं और सुनिश्चित नहीं हैं कि इसके लिए आवश्यक HTML को कैसे लक्षित किया जाए, तो मेरा सुझाव है कि आप अपने ब्राउज़र में वेबसाइटों की सामग्री का निरीक्षण करने का तरीका जानने के लिए ऑनलाइन खोज करें। मूल रूप से, सभी प्रमुख ब्राउज़र इन दिनों इस प्रक्रिया को वास्तव में आसान बनाते हैं।

क्रोम पर आपको वेबसाइट में किसी तत्व पर राइट-क्लिक करना होगा और निरीक्षण विकल्प चुनना होगा। यह आपके ब्राउज़र के निचले भाग में एक छोटी सी विंडो खोलेगा जो आपको साइट के DOM के एक्स-रे जैसा कुछ दिखाती है। इसके और भी कई विकल्प हैं, और मैं खुद को शिक्षित करने के लिए Google पर कुछ समय बिताने की सलाह दूंगा। यह समय बुद्धिमानी से बिताया गया है!

सीएसएस

css विधि हमें न केवल पसंद का एक तत्व देगी बल्कि पृष्ठ पर खोज मानदंड से मेल खाने वाला कोई भी तत्व प्रदान करेगी। काफी साफ-सुथरा और सीधा!

some_scraper.rb

require 'nokogiri'

require "open-uri"

url = 'https://betweenscreens.fm/'

page = Nokogiri::HTML(open(url))

headers = page.css("h2.post-title")

headers.each do |header|
  puts "This is the raw title of the latest episode: #{header}"
end

headers.each do |header|
  puts "This is the title of the latest episode: #{header.text}"
end

आउटपुट

This is the raw title of the latest episode: <h2 class="post-title"><a href="episodes/142/">David Heinemeier Hansson</a></h2>
This is the raw title of the latest episode: <h2 class="post-title"><a href="episodes/141/">Zach Holman</a></h2>
This is the raw title of the latest episode: <h2 class="post-title"><a href="episodes/140/">Joel Glovier</a></h2>
This is the raw title of the latest episode: <h2 class="post-title"><a href="episodes/139/">João Ferreira</a></h2>
This is the raw title of the latest episode: <h2 class="post-title"><a href="episodes/138/">Corwin Harrell</a></h2>
This is the raw title of the latest episode: <h2 class="post-title"><a href="episodes/137/">Roberto Machado</a></h2>
This is the raw title of the latest episode: <h2 class="post-title"><a href="episodes/136/">James Edward Gray II</a></h2>

This is the title of the latest episode: David Heinemeier Hansson
This is the title of the latest episode: Zach Holman
This is the title of the latest episode: Joel Glovier
This is the title of the latest episode: João Ferreira
This is the title of the latest episode: Corwin Harrell
This is the title of the latest episode: Roberto Machado
This is the title of the latest episode: James Edward Gray II

इस उदाहरण में केवल इतना ही अंतर है कि मैं पहले कच्चे हेडर पर पुनरावृति करता हूं। मैंने इसके आंतरिक पाठ को text . के साथ भी निकाला तरीका। नोकोगिरी स्वचालित रूप से पृष्ठ के अंत में रुक जाती है और स्वचालित रूप से कहीं भी पेजिनेशन का पालन करने का प्रयास नहीं करती है।

मान लें कि हम प्रत्येक एपिसोड की तारीख और उपशीर्षक जैसी कुछ और जानकारी चाहते हैं। हम बस ऊपर के उदाहरण पर विस्तार कर सकते हैं। वैसे भी यह कदम दर कदम उठाना एक अच्छा विचार है। थोड़ा सा काम करें और रास्ते में और अधिक जटिलताएं जोड़ें।

some_scraper.rb

require 'nokogiri'

require "open-uri"

url = 'https://betweenscreens.fm/'

page = Nokogiri::HTML(open(url))

articles = page.css("article.index-article")

articles.each do |article|
  header     = article.at_css("h2.post-title")
  date       = article.at_css(".post-date")
  subtitle   = article.at_css(".topic-list")

  puts "This is the raw header:    #{header}"
  puts "This is the raw date:      #{date}"
  puts "This is the raw subtitle:  #{subtitle}\n\n"
 
  puts "This is the text header:   #{header.text}"
  puts "This is the text date:     #{date.text}"
  puts "This is the text subtitle: #{subtitle.text}\n\n"
end

आउटपुट

This is the raw header: <h2 class="post-title"><a href="episodes/142/">David Heinemeier Hansson</a></h2>
This is the raw date: <span class="post-date">Oct 18 | 2016</span>
This is the raw subtitle: <h3 class="topic-list">Rails community | Tone | Technical disagreements | Community policing | Ungratefulness | No assholes allowed | Basecamp | Open source persona | Aspirations | Guarding motivations | Dealing with audiences | Pressure | Honesty | Diverse opinions | Small talk</h3>

This is the text header: David Heinemeier Hansson
This is the text date: Oct 18 | 2016
This is the text subtitle: Rails community | Tone | Technical disagreements | Community policing | Ungratefulness | No assholes allowed | Basecamp | Open source persona | Aspirations | Guarding motivations | Dealing with audiences | Pressure | Honesty | Diverse opinions | Small talk

This is the raw header: <h2 class="post-title"><a href="episodes/141/">Zach Holman</a></h2>
This is the raw date: <span class="post-date">Oct 12 | 2016</span>
This is the raw subtitle: <h3 class="topic-list">Getting Fired | Taboo | Transparency | Different Perspectives | Timing | Growth Stages | Employment &amp; Dating | Managers | At-will Employment | Tech Industry | Europe | Low hanging Fruits | Performance Improvement Plans | Meeting Goals | Surprise Firings | Firing Fast | Mistakes | Company Culture | Communication</h3>

This is the text header: Zach Holman
This is the text date: Oct 12 | 2016
This is the text subtitle: Getting Fired | Taboo | Transparency | Different Perspectives | Timing | Growth Stages | Employment & Dating | Managers | At-will Employment | Tech Industry | Europe | Low hanging Fruits | Performance Improvement Plans | Meeting Goals | Surprise Firings | Firing Fast | Mistakes | Company Culture | Communication

This is the raw header: <h2 class="post-title"><a href="episodes/140/">Joel Glovier</a></h2>
This is the raw date: <span class="post-date">Oct 10 | 2016</span>
This is the raw subtitle: <h3 class="topic-list">Digital Product Design | Product Design @ GitHub | Loving Design | Order &amp; Chaos | Drawing | Web Design | HospitalRun | Diversity | Startup Culture | Improving Lives | CURE International | Ember | Offline First | Hospital Information System | Designers &amp; Open Source</h3>

This is the text header: Joel Glovier
This is the text date: Oct 10 | 2016
This is the text subtitle: Digital Product Design | Product Design @ GitHub | Loving Design | Order & Chaos | Drawing | Web Design | HospitalRun | Diversity | Startup Culture | Improving Lives | CURE International | Ember | Offline First | Hospital Information System | Designers & Open Source

This is the raw header: <h2 class="post-title"><a href="episodes/139/">João Ferreira</a></h2>
This is the raw date: <span class="post-date">Aug 26 | 2015</span>
This is the raw subtitle: <h3 class="topic-list">Masters @ Work | Subvisual | Deadlines | Design personality | Design problems | Team | Pushing envelopes | Delightful experiences | Perfecting details | Company values</h3>

This is the text header: João Ferreira
This is the text date: Aug 26 | 2015
This is the text subtitle: Masters @ Work | Subvisual | Deadlines | Design personality | Design problems | Team | Pushing envelopes | Delightful experiences | Perfecting details | Company values

This is the raw header: <h2 class="post-title"><a href="episodes/138/">Corwin Harrell</a></h2>
This is the raw date: <span class="post-date">Aug 06 | 2015</span>
This is the raw subtitle: <h3 class="topic-list">Q&amp;A | 01 | University | Graphic design | Design setup | Sublime | Atom | thoughtbot | Working location | Collaboration &amp; pairing | Vim advocates | Daily routine | Standups | Clients | Coffee walks | Investment Fridays |</h3>

This is the text header: Corwin Harrell
This is the text date: Aug 06 | 2015
This is the text subtitle: Q&A | 01 | University | Graphic design | Design setup | Sublime | Atom | thoughtbot | Working location | Collaboration & pairing | Vim advocates | Daily routine | Standups | Clients | Coffee walks | Investment Fridays |

This is the raw header: <h2 class="post-title"><a href="episodes/137/">Roberto Machado</a></h2>
This is the raw date: <span class="post-date">Aug 03 | 2015</span>
This is the raw subtitle: <h3 class="topic-list">CEO @ Subvisual | RubyConf Portugal | Creators School | Consultancy | Company role models | Group Buddies | Portuguese startup | Rebranding | Technologies used | JS frameworks | TDD &amp; BDD | Startup mistakes | Culture of learning | Young entrepreneurs</h3>

This is the text header: Roberto Machado
This is the text date: Aug 03 | 2015
This is the text subtitle: CEO @ Subvisual | RubyConf Portugal | Creators School | Consultancy | Company role models | Group Buddies | Portuguese startup | Rebranding | Technologies used | JS frameworks | TDD & BDD | Startup mistakes | Culture of learning | Young entrepreneurs

This is the raw header: <h2 class="post-title"><a href="episodes/136/">James Edward Gray II</a></h2>
This is the raw date: <span class="post-date">Jul 30 | 2015</span>
This is the raw subtitle: <h3 class="topic-list">Screencasting | Less Code | Reading code | Getting unstuck | Rails’s codebase | CodeNewbie | Small examples | Future plans | PeepCode | Frequency &amp; pricing</h3>

This is the text header: James Edward Gray II
This is the text date: Jul 30 | 2015
This is the text subtitle: Screencasting | Less Code | Reading code | Getting unstuck | Rails’s codebase | CodeNewbie | Small examples | Future plans | PeepCode | Frequency & pricing

इस बिंदु पर, हमारे पास खेलने के लिए पहले से ही कुछ डेटा है। हम इसे किसी भी तरह से संरचित या कसाई कर सकते हैं। उपरोक्त को केवल यह दिखाना चाहिए कि हमारे पास पठनीय फैशन में क्या है। बेशक हम इनमें से प्रत्येक में text . के साथ रेगुलर एक्सप्रेशन का उपयोग करके गहराई से खोज कर सकते हैं तरीका।

जब हम वास्तविक पॉडकास्ट समस्या को हल करेंगे तो हम इसे और अधिक विस्तार से देखेंगे। यह रेगेक्सपी पर एक वर्ग नहीं होगा, लेकिन आप इसमें से कुछ को क्रिया में देखेंगे - लेकिन कोई चिंता नहीं, इतना नहीं कि आपके दिमाग से खून बह जाए।

विशेषताएं

इस स्तर पर जो उपयोगी हो सकता है वह है href . को निकालना व्यक्तिगत एपिसोड के लिए भी। यह इससे आसान नहीं हो सकता।

some_scraper.rb

require 'nokogiri'

require "open-uri"

url = 'https://betweenscreens.fm/'

page = Nokogiri::HTML(open(url))

articles = page.css("article.index-article")

articles.each do |article|
  header      = article.at_css("h2.post-title")
  date        = article.at_css(".post-date")
  subtitle    = article.at_css(".topic-list")
  link        = article.at_css("h2.post-title a")
  podcast_url = "https://betweenscreens.fm/"

  puts "This is the raw header:    #{header}"
  puts "This is the raw date:      #{date}"
  puts "This is the raw subtitle:  #{subtitle}"
  puts "This is the raw link:      #{link}\n\n"

  puts "This is the text header:   #{header.text}"
  puts "This is the text date:     #{date.text}"
  puts "This is the text subtitle: #{subtitle.text}"
  puts "This is the raw link:      #{podcast_url}#{link[:href]}\n\n"
end

यहां ध्यान देने के लिए सबसे महत्वपूर्ण बिट्स हैं [:href] और podcast_url . अगर आप [:] . पर टैग करते हैं आप लक्षित चयनकर्ता से बस एक विशेषता निकाल सकते हैं। मैंने थोड़ा और सार किया, लेकिन आप नीचे और अधिक स्पष्ट रूप से देख सकते हैं कि यह कैसे काम करता है।

...

href = article.at_css("h2.post-title a")[:href]

...

एक पूर्ण और उपयोगी URL प्राप्त करने के लिए, मैंने रूट डोमेन को एक चर में सहेजा और प्रत्येक एपिसोड के लिए पूर्ण URL का निर्माण किया।

...

podcast_url = "https://betweenscreens.fm/"

puts "This is the raw link: #{podcast_url}#{link[:href]}\n\n"

...

आइए आउटपुट पर एक त्वरित नज़र डालें:

आउटपुट

This is the raw header:   <h2 class="post-title"><a href="episodes/143/">Jason Long</a></h2>
This is the raw date:     <span class="post-date">Oct 25 | 2016</span>
This is the raw subtitle: <h3 class="topic-list">Open source | Empathy | Lower barriers | Learning tool | Design contributions | Git website | Branding | GitHub | Neovim | Tmux | Design love | Knowing audiences | Showing work | Dribbble | Progressions | Ideas</h3>
This is the raw link:     <a href="episodes/143/">Jason Long</a>

This is the text header: Jason Long
This is the text date:   Oct 25 | 2016
This is the text subtitle: Open source | Empathy | Lower barriers | Learning tool | Design contributions | Git website | Branding | GitHub | Neovim | Tmux | Design love | Knowing audiences | Showing work | Dribbble | Progressions | Ideas
This is the href:     https://betweenscreens.fm/episodes/143/

This is the raw header:   <h2 class="post-title"><a href="episodes/142/">David Heinemeier Hansson</a></h2>
This is the raw date:     <span class="post-date">Oct 18 | 2016</span>
This is the raw subtitle: <h3 class="topic-list">Rails community | Tone | Technical disagreements | Community policing | Ungratefulness | No assholes allowed | Basecamp | Open source persona | Aspirations | Guarding motivations | Dealing with audiences | Pressure | Honesty | Diverse opinions | Small talk</h3>
This is the raw link:     <a href="episodes/142/">David Heinemeier Hansson</a>

This is the text header: David Heinemeier Hansson
This is the text date:   Oct 18 | 2016
This is the text subtitle: Rails community | Tone | Technical disagreements | Community policing | Ungratefulness | No assholes allowed | Basecamp | Open source persona | Aspirations | Guarding motivations | Dealing with audiences | Pressure | Honesty | Diverse opinions | Small talk
This is the href:     https://betweenscreens.fm/episodes/142/

This is the raw header:   <h2 class="post-title"><a href="episodes/141/">Zach Holman</a></h2>
This is the raw date:     <span class="post-date">Oct 12 | 2016</span>
This is the raw subtitle: <h3 class="topic-list">Getting Fired | Taboo | Transparency | Different Perspectives | Timing | Growth Stages | Employment &amp; Dating | Managers | At-will Employment | Tech Industry | Europe | Low hanging Fruits | Performance Improvement Plans | Meeting Goals | Surprise Firings | Firing Fast | Mistakes | Company Culture | Communication</h3>
This is the raw link:     <a href="episodes/141/">Zach Holman</a>

This is the text header: Zach Holman
This is the text date:   Oct 12 | 2016
This is the text subtitle: Getting Fired | Taboo | Transparency | Different Perspectives | Timing | Growth Stages | Employment & Dating | Managers | At-will Employment | Tech Industry | Europe | Low hanging Fruits | Performance Improvement Plans | Meeting Goals | Surprise Firings | Firing Fast | Mistakes | Company Culture | Communication
This is the href:     https://betweenscreens.fm/episodes/141/

This is the raw header:   <h2 class="post-title"><a href="episodes/140/">Joel Glovier</a></h2>
This is the raw date:     <span class="post-date">Oct 10 | 2016</span>
This is the raw subtitle: <h3 class="topic-list">Digital Product Design | Product Design @ GitHub | Loving Design | Order &amp; Chaos | Drawing | Web Design | HospitalRun | Diversity | Startup Culture | Improving Lives | CURE International | Ember | Offline First | Hospital Information System | Designers &amp; Open Source</h3>
This is the raw link:     <a href="episodes/140/">Joel Glovier</a>

This is the text header: Joel Glovier
This is the text date:   Oct 10 | 2016
This is the text subtitle: Digital Product Design | Product Design @ GitHub | Loving Design | Order & Chaos | Drawing | Web Design | HospitalRun | Diversity | Startup Culture | Improving Lives | CURE International | Ember | Offline First | Hospital Information System | Designers & Open Source
This is the href:     https://betweenscreens.fm/episodes/140/

This is the raw header:   <h2 class="post-title"><a href="episodes/139/">João Ferreira</a></h2>
This is the raw date:     <span class="post-date">Aug 26 | 2015</span>
This is the raw subtitle: <h3 class="topic-list">Masters @ Work | Subvisual | Deadlines | Design personality | Design problems | Team | Pushing envelopes | Delightful experiences | Perfecting details | Company values</h3>
This is the raw link:     <a href="episodes/139/">João Ferreira</a>

This is the text header: João Ferreira
This is the text date:   Aug 26 | 2015
This is the text subtitle: Masters @ Work | Subvisual | Deadlines | Design personality | Design problems | Team | Pushing envelopes | Delightful experiences | Perfecting details | Company values
This is the href:     https://betweenscreens.fm/episodes/139/

This is the raw header:   <h2 class="post-title"><a href="episodes/138/">Corwin Harrell</a></h2>
This is the raw date:     <span class="post-date">Aug 06 | 2015</span>
This is the raw subtitle: <h3 class="topic-list">Q&amp;A | 01 | University | Graphic design | Design setup | Sublime | Atom | thoughtbot | Working location | Collaboration &amp; pairing | Vim advocates | Daily routine | Standups | Clients | Coffee walks | Investment Fridays |</h3>
This is the raw link:     <a href="episodes/138/">Corwin Harrell</a>

This is the text header: Corwin Harrell
This is the text date:   Aug 06 | 2015
This is the text subtitle: Q&A | 01 | University | Graphic design | Design setup | Sublime | Atom | thoughtbot | Working location | Collaboration & pairing | Vim advocates | Daily routine | Standups | Clients | Coffee walks | Investment Fridays |
This is the href:     https://betweenscreens.fm/episodes/138/

This is the raw header:   <h2 class="post-title"><a href="episodes/137/">Roberto Machado</a></h2>
This is the raw date:     <span class="post-date">Aug 03 | 2015</span>
This is the raw subtitle: <h3 class="topic-list">CEO @ Subvisual | RubyConf Portugal | Creators School | Consultancy | Company role models | Group Buddies | Portuguese startup | Rebranding | Technologies used | JS frameworks | TDD &amp; BDD | Startup mistakes | Culture of learning | Young entrepreneurs</h3>
This is the raw link:     <a href="episodes/137/">Roberto Machado</a>

This is the text header: Roberto Machado
This is the text date:   Aug 03 | 2015
This is the text subtitle: CEO @ Subvisual | RubyConf Portugal | Creators School | Consultancy | Company role models | Group Buddies | Portuguese startup | Rebranding | Technologies used | JS frameworks | TDD & BDD | Startup mistakes | Culture of learning | Young entrepreneurs
This is the href:     https://betweenscreens.fm/episodes/137/

साफ, है ना? [:class] . निकालने के लिए आप ऐसा ही कर सकते हैं एक चयनकर्ता का।

require 'nokogiri'

require "open-uri"

url = 'https://betweenscreens.fm/'

page = Nokogiri::HTML(open(url))

body_classes = page.at_css("body")[:class]

यदि उस नोड में एक से अधिक वर्ग हैं, तो आपको उन सभी की एक सूची मिल जाएगी।

नोड नेविगेशन

  • माता-पिता
  • बच्चे
  • पिछला_भाई
  • next_sibling

हम सीएसएस या यहां तक ​​कि jQuery में वृक्ष संरचनाओं से निपटने के लिए उपयोग किए जाते हैं। यह एक दर्द होगा अगर नोकोगिरी ने ऐसे पेड़ों के भीतर जाने के लिए एक आसान एपीआई की पेशकश नहीं की।

some_scraper.rb

require 'nokogiri'

require "open-uri"

url = 'https://betweenscreens.fm/'

page = Nokogiri::HTML(open(url))

header = page.at_css("h2.post-title")
header_children = page.at_css("h2.post-title").children
header_parent = page.at_css("h2.post-title").parent
header_prev_sibling = page.at_css("h2.post-title").previous_sibling

puts "#{header}\n\n"
puts "#{header_children}\n\n"
puts "#{header_parent}\n\n"
puts "#{header_prev_sibling}\n\n"

आउटपुट

#header
<h2 class="post-title"><a href="episodes/143/">Jason Long</a></h2>

#header_children
<a href="episodes/143/">Jason Long</a>

#header_parent
<article class="index-article">
  <span class="post-date">Oct 25 | 2016</span><h2 class="post-title"><a href="episodes/143/">Jason Long</a></h2>
    <h3 class="topic-list">Open source | Empathy | Lower barriers | Learning tool | Design contributions | Git website | Branding | GitHub | Neovim | Tmux | Design love | Knowing audiences | Showing work | Dribbble | Progressions | Ideas</h3>
    <div class="soundcloud-player-small">  
    </div>
</article>

#header_previous_sibling
<span class="post-date">Oct 25 | 2016</span>

जैसा कि आप अपने लिए देख सकते हैं, यह कुछ बहुत शक्तिशाली चीजें हैं—खासकर जब आप देखते हैं कि .parent एक बार में एकत्र करने में सक्षम था। नोड्स के एक समूह को हाथ से परिभाषित करने के बजाय, आप उन्हें थोक में एकत्र कर सकते हैं।

आप उन्हें अधिक शामिल ट्रैवर्सल के लिए भी श्रृंखलाबद्ध कर सकते हैं। आप इसे जितना चाहें उतना जटिल ले सकते हैं, लेकिन मैं आपको चीजों को सरल रखने के लिए सावधान करूंगा। यह जल्दी से थोड़ा बोझिल और समझने में कठिन हो सकता है। याद रखें, "इसे सरल रखें, बेवकूफ़!"

...

header_parent_parent = page.at_css("h2.post-title").parent.parent
header_prev_sibling_parent_children = page.at_css("h2.post-title").previous_sibling.parent.children

...

some_scraper.rb

require 'nokogiri'

require "open-uri"

url = 'https://betweenscreens.fm/'

page = Nokogiri::HTML(open(url))

header = page.at_css("h2.post-title")
header_prev_sibling_children = page.at_css("h2.post-title").previous_sibling.children
header_parent_parent = page.at_css("h2.post-title").parent.parent
header_prev_sibling_parent = page.at_css("h2.post-title").previous_sibling.parent
header_prev_sibling_parent_children = page.at_css("h2.post-title").previous_sibling.parent.children

puts "#{header}\n\n"
puts "#{header_prev_sibling_children}\n\n"
puts "#{header_parent_parent}\n\n"
puts "#{header_prev_sibling_parent}\n\n"
puts "#{header_prev_sibling_parent_children}\n\n"

आउटपुट

#header
<h2 class="post-title"><a href="episodes/143/">Jason Long</a></h2>

#header_previous_sibling_children
Oct 25 | 2016

#header_parent_parent
<li>
  <article class="index-article">
  <span class="post-date">Oct 25 | 2016</span><h2 class="post-title"><a href="episodes/143/">Jason Long</a></h2>
    <h3 class="topic-list">Open source | Empathy | Lower barriers | Learning tool | Design contributions | Git website | Branding | GitHub | Neovim | Tmux | Design love | Knowing audiences | Showing work | Dribbble | Progressions | Ideas</h3>
    <div class="soundcloud-player-small">  
    </div>
  </article>
</li>

#header_previous_sibling_parent
<article class="index-article">
  <span class="post-date">Oct 25 | 2016</span><h2 class="post-title"><a href="episodes/143/">Jason Long</a></h2>
    <h3 class="topic-list">Open source | Empathy | Lower barriers | Learning tool | Design contributions | Git website | Branding | GitHub | Neovim | Tmux | Design love | Knowing audiences | Showing work | Dribbble | Progressions | Ideas</h3>
    <div class="soundcloud-player-small">  
    </div>
</article>

#header_previous_sibling_parent_children
  <span class="post-date">Oct 25 | 2016</span><h2 class="post-title"><a href="episodes/143/">Jason Long</a></h2>
    <h3 class="topic-list">Open source | Empathy | Lower barriers | Learning tool | Design contributions | Git website | Branding | GitHub | Neovim | Tmux | Design love | Knowing audiences | Showing work | Dribbble | Progressions | Ideas</h3>
    <div class="soundcloud-player-small">  
    </div>

अंतिम विचार

Nokogiri is not a huge library, but it has a lot to offer. I recommend you play with what you have learned thus far and expand your knowledge through its documentation when you hit a wall. But don’t get yourself into trouble!

This little intro should get you well on your way to understanding what you can do and how it works. I hope you will explore it a bit more on your own and have some fun with it. As you will find out on your own, it’s a rich tool that keeps on giving.


  1. अपना पहला वेब स्क्रैपर बनाना, भाग 2

    इस ट्यूटोरियल में, आप सीखेंगे कि आप लिंक पर क्लिक करने, फॉर्म भरने और फाइल अपलोड करने के लिए मैकेनाइज का उपयोग कैसे कर सकते हैं। आप यह भी सीखेंगे कि आप पेज ऑब्जेक्ट्स को मैकेनाइज कैसे कर सकते हैं और Google खोज को स्वचालित कैसे करें और इसके परिणामों को कैसे सहेज सकते हैं। विषय एकल पृष्ठ बनाम पृष्ठ

  1. iPhone पर अपना वेब ब्राउज़र कैसे अपडेट करें

    IPhone पर अपने पसंदीदा वेब ब्राउज़र को अपडेट करना सुनिश्चित करता है कि आपके पास नई सुविधाओं, प्रदर्शन में वृद्धि और बग फिक्स तक पहुंच है। एक अप-टू-डेट ब्राउज़र इंटरनेट पर नेविगेट करते हुए बेहतर गोपनीयता और सुरक्षा में भी अनुवाद करता है। लेकिन आप सफारी वेब ब्राउज़र और Google क्रोम और मोज़िला फ़ायरफ़

  1. आपके ब्राउज़र को कितना निजी होना चाहिए?

    ब्लॉग सारांश - जब आप कोई वेब ब्राउज़र चुनते हैं तो क्या आप उसकी सुरक्षा और गोपनीयता सुविधाओं पर ध्यान देते हैं? क्या आप जानते हैं कि वेब ब्राउज़र हमारा डेटा चुराने में भी सक्षम हैं? इसके बारे में सब कुछ पढ़ें और पता करें कि इस ब्लॉग में ब्राउज़र का कितना निजी होना आवश्यक है। ब्राउज़र आपके लिए इंटर