Construire votre premier grattoir Web, partie 3

Bienvenue dans cette série consacrée à la construction d’un grattoir Web. Dans ce tutoriel, je vais vous donner un exemple d'extraction de données de mon propre site de podcast. Je vais expliquer en détail comment j'ai extrait les données, comment les méthodes d'assistance et d'utilitaire accomplissent leur travail et comment toutes les pièces du puzzle sont réunies..

Les sujets

  • Gratter mon podcast
  • Pry
  • Grattoir
  • Méthodes d'assistance
  • Rédaction de messages

Gratter mon podcast

Mettons en pratique ce que nous avons appris jusqu'à présent. Pour diverses raisons, une refonte de mon podcast Between | Les écrans étaient attendus depuis longtemps. Il y avait des problèmes qui m'ont fait crier quand je me suis réveillé le matin. J'ai donc décidé de créer un tout nouveau site statique, construit avec Middleman et hébergé avec GitHub Pages.

J'ai investi pas mal de temps dans le nouveau design après avoir peaufiné le blog Middleman selon mes besoins. Tout ce qui restait à faire était d'importer le contenu de mon application Sinatra sauvegardée sur une base de données. Je devais donc extraire le contenu existant et le transférer sur mon nouveau site statique..

Faire cela à la main de façon schmuck n'était pas sur la table - même pas une question - puisque je pouvais compter sur mes amis Nokogiri et Mechanize pour faire le travail à ma place. Ce qui vous attend, c’est un travail relativement modeste qui n’est pas trop compliqué mais offre quelques rebondissements intéressants qui devraient être instructifs pour le Web et qui gratte les débutants..

Ci-dessous deux captures d'écran de mon podcast. 

Capture Vieux Podcast

Capture Nouveau podcast

Décomposons ce que nous voulons accomplir. Nous souhaitons extraire les données suivantes de 139 épisodes répartis sur 21 sites index paginés:

  • le titre
  • l'interviewé
  • le sous en-tête avec la liste des sujets
  • le numéro de piste SoundCloud pour chaque épisode
  • la date
  • le numéro de l'épisode
  • le texte des notes de spectacle
  • les liens des notes de spectacle

Nous parcourons la pagination et laissons Mechanize cliquer sur chaque lien d'un épisode. Sur la page de détail suivante, nous trouverons toutes les informations ci-dessus dont nous avons besoin. En utilisant ces données extraites, nous souhaitons renseigner l’avant-propos et le «corps» des fichiers de démarques pour chaque épisode..

Vous trouverez ci-dessous un aperçu de la composition des nouveaux fichiers de démarques avec le contenu extrait. Je pense que cela vous donnera une bonne idée de la portée qui nous attend. Ceci représente la dernière étape de notre petit script. Ne vous inquiétez pas, nous allons l'examiner plus en détail. 

def compose_markdown

def compose_markdown (options = ) <<-HEREDOC --- title: #options[:interviewee] interviewee: #options[:interviewee] topic_list: #options[:title] tags: #options[:tags] soundcloud_id: #options[:sc_id] date: #options[:date] episode_number: #options[:episode_number] --- #options[:text] HEREDOC end

Je voulais aussi ajouter quelques astuces que l'ancien site ne pouvait pas jouer. Avoir un système de marquage complet et personnalisé en place était crucial pour moi. Je voulais que les auditeurs aient un outil de découverte en profondeur. Par conséquent, j’avais besoin d’étiquettes pour chaque personne interrogée et je divisais également le sous-en-tête. Depuis que j'ai produit 139 épisodes rien que pour la première saison, j'ai dû préparer le site pour une période où la quantité de contenu devient plus difficile à analyser. Un système de marquage en profondeur avec des recommandations judicieusement placées était la voie à suivre. Cela m'a permis de garder le site léger et rapide.

Jetons un coup d'oeil au code complet pour gratter le contenu de mon site. Regardez autour de vous et essayez de comprendre la grande image de ce qui se passe. Puisque je m'attends à ce que vous soyez du côté débutant, je me suis abstenu de trop abstraire et j'ai commis une erreur de clarté. J'ai fait quelques refactorings qui visaient à améliorer la clarté du code, mais j'ai aussi laissé un peu de viande sur laquelle vous pouvez jouer lorsque vous avez terminé avec cet article. Après tout, un apprentissage de qualité se produit lorsque vous allez au-delà de la lecture et que vous jouez avec du code vous-même..

En cours de route, je vous encourage fortement à commencer à réfléchir à la manière dont vous pouvez améliorer le code devant vous. Ce sera votre tâche finale à la fin de cet article. Un petit indice de ma part: casser les grandes méthodes en méthodes plus petites est toujours un bon point de départ. Une fois que vous avez compris comment fonctionne le code, vous devriez avoir du plaisir à peaufiner ce refactoring.. 

J'ai déjà commencé par extraire un tas de méthodes dans de petits assistants concentrés. Vous devriez pouvoir facilement appliquer ce que vous avez appris dans mes articles précédents sur les odeurs de code et leur refactorisation. Si cela vous échappe encore, ne vous inquiétez pas, nous sommes tous passés par là. Continuez, et à un moment donné, les choses commenceront à cliquer plus rapidement.

Code complet

require 'Mechanize' require 'Pry' require 'date' # Méthodes Helper # (Méthodes d'extraction) def extract_interviewee (detail_page) interviewee_selector = '.episode_sub_title span' detail_page.search (interviewee_selector) .text.strip end def extrait_title (detail_page) title_selector = ".episode_title" detail_page.search (title_selector) .text.gsub (/ [? #] /, ") end def extract_soundcloud_id (detail_page) sc = detail_page.iframes_with (href: /soundcloud.com/).to_s sc.scan ( /\d3,/).first end def extract_shownotes_text (detail_page) shownote_selector = "#shownote_container> p" detail_page.search (shownote_selector) et fin de extract_subtitle (detail_page) subheader_selector = ".pisode_sub_title". text end def extract_episode_number (episode_subtitle) number = /[#]\d*/.match(episode_subtitle) clean_episode_number (number) end # (Méthodes utilitaires) def clean_date (episode_subtitle) string_date = / [^ |] * ([,]) (…) /. Match (episode_subtitle) .to_s Date.parse (string_date) end def build_tags (titre, interviewé) extract_tags = strip_pipes (title) "# interviewee" + ", # extract_tags" end def strip_pipes (text) tags = text.tr ('|', ',') 'tags = tags. gsub (/ [@? # &] /, ") tags.gsub (/ [w \ /] 2 /, 'avec') end def clean_episode_number (number) number.to_s.tr ('#',") end def dasherize (text) text.lstrip.rstrip.tr (", '-') end def extract_data (detail_page) interviewee = extract_interviewee (detail_page) title = extract_title (détail_page) sc_id = extract_soundcloud_id (détail_page) text = extract_shownotes_text (détail_page) episode_subtitle = extract_subtitle (detail_page) episode_number = extract_episode_number (episode_subtitle) date = clean_date (episode_subtitle) tags = build_tags (titre, personne interrogée) options = interviewée: interviewé: titre, titre: titre, sc_id, texte: mots-clés, tags: : date, episode_number: episode_number end def compose_markdown (options = ) <<-HEREDOC --- title: #options[:interviewee] interviewee: #options[:interviewee] topic_list: #options[:title] tags: #options[:tags] soundcloud_id: #options[:sc_id] date: #options[:date] episode_number: #options[:episode_number] --- #options[:text] HEREDOC end def write_page(link) detail_page = link.click extracted_data = extract_data(detail_page) markdown_text = compose_markdown(extracted_data) date = extracted_data[:date] interviewee = extracted_data[:interviewee] episode_number = extracted_data[:episode_number] File.open("#date-#dasherize(interviewee)-#episode_number.html.erb.md", 'w')  |file| file.write(markdown_text)  end def scrape link_range = 1 agent ||= Mechanize.new until link_range == 21 page = agent.get("https://between-screens.herokuapp.com/?page=#link_range") link_range += 1 page.links[2… 8].map do |link| write_page(link) end end end scrape

Pourquoi n'avons-nous pas besoin de "Nokogiri"? Mechanize nous fournit tous nos besoins en matière de raclage. Comme nous en avons discuté dans l'article précédent, Mechanize s'appuie sur Nokogiri et nous permet également d'extraire du contenu. Il était toutefois important de couvrir ce joyau dans le premier article, car nous devions en tirer parti..

Pry

Les premières choses d'abord. Avant de passer à notre code, je pensais qu'il était nécessaire de vous montrer comment vérifier efficacement si votre code fonctionnait comme prévu à chaque étape. Comme vous l'avez certainement remarqué, j'ai ajouté un autre outil au mélange. Entre autres, Pry est vraiment pratique pour le débogage. 

Si vous placez Pry.start (contraignant) n'importe où dans votre code, vous pouvez inspecter votre application exactement à cet endroit. Vous pouvez extraire les objets à des endroits spécifiques de l'application. Cela est très utile pour traiter votre demande étape par étape sans vous trébucher. Par exemple, plaçons-le juste après notre write_page fonction et vérifier si lien est ce qu'on attend.

Pry

… Def scrape link_range = 1 agent || = Mechanize.new jusqu'à link_range == 21 page = agent.get ("https://between-screens.herokuapp.com/?page=#link_range") link_range + = 1 page.links [2… 8] .map do | link | write_page (lien) Pry.start (binding) end end end… 

Si vous exécutez le script, nous obtiendrons quelque chose comme ceci.

Sortie

"$ ruby ​​noko_scraper.rb 321: def scrape 322: link_range = 1 323: agent || = Mechanize.new 324: 326: jusqu’à link_range == 21 327: page = agent.get (" https: // entre deux écrans. herokuapp.com/?page=#link_range ") 328: link_range + = 1 329: 330: page.links [2… 8] .map do | link | 331: write_page (link) => 332: Pry.start (reliure) 333: fin 334: fin 335: fin [1] levier (principal)>

Quand on demande alors le lien objet, nous pouvons vérifier si nous sommes sur la bonne voie avant de passer à d'autres détails de mise en œuvre.

Terminal

[2] levier (principal)> link => #

On dirait ce dont nous avons besoin. Super, on peut passer à autre chose. Effectuer cette opération étape par étape tout au long de l’application est une pratique importante pour vous assurer de ne pas vous perdre et de bien comprendre comment cela fonctionne. Je ne traiterai pas plus en détail de Pry ici, car il me faudrait au moins un autre article complet pour le faire. Je ne peux que recommander de l'utiliser comme alternative au shell IRB standard. Retour à notre tâche principale.

Grattoir

Maintenant que vous avez eu l’occasion de vous familiariser avec les pièces du puzzle en place, je vous recommande de les examiner une par une et de clarifier quelques points intéressants ici et là. Commençons par les pièces centrales.

podcast_scraper.rb

… Def write_page (lien) detail_page = link.click extrait_data = extract_data (détail_page) markdown_text = composer_markdown (extrait_data) date = extrait_data [: date] interviewé = extrait_data [: interviewé] episode_number = extrait_data [: episode_number] file_name = "# date  - # dasherize (interviewee) - # numéro_episode .html.erb.md "Fichier.open (nom_fichier, 'w') | fichier | file.write (markdown_text) end def scrape link_range = 1 agent || = Mechanize.new jusqu'à link_range == 21 page = agent.get ("https://between-screens.herokuapp.com/?page=#link_range  ") link_range + = 1 page.links [2… 8] .map do | link | write_page (lien) fin fin fin… 

Qu'est-ce qui se passe dans le gratter méthode? Tout d’abord, je passe en revue toutes les pages d’index de l’ancien podcast. J'utilise l'ancienne URL de l'application Heroku car le nouveau site est déjà en ligne sur betweenscreens.fm. J'ai eu 20 pages d'épisodes que j'avais besoin de boucler sur. 

J'ai délimité la boucle via le lien_range variable, que j'ai mis à jour à chaque boucle. Parcourir la pagination était aussi simple que d’utiliser cette variable dans l’URL de chaque page. Simple et efficace.

def gratter

page = agent.get ("https://between-screens.herokuapp.com/?page=#link_range")

Ensuite, chaque fois que j'ai une nouvelle page avec huit autres épisodes à gratter, j'utilise page.liens pour identifier les liens sur lesquels nous voulons cliquer et suivre la page de détail de chaque épisode. J'ai décidé d'aller avec une gamme de liens (liens [2… 8]) car il était cohérent sur chaque page. C'était également le moyen le plus simple de cibler les liens dont j'avais besoin depuis chaque page d'index. Pas besoin de fouiller avec les sélecteurs CSS ici.

Nous alimentons ensuite ce lien pour la page de détail à la write_page méthode. C'est là que la majeure partie du travail est effectuée. Nous prenons ce lien, cliquons dessus et suivons à la page de détail où nous pouvons commencer à extraire ses données. Sur cette page, on trouve toutes les informations nécessaires pour composer mes nouveaux épisodes de démarques pour le nouveau site.. 

def write_page

extract_data = extract_data (detail_page)

def extract_data

def extract_data (detail_page) interviewee = extract_interviewee (detail_page) title = extract_title (detail_page) sc_id = extract_soundcloud_id (detail_page) text = extract_shownotes_text (detail_page) (titre, personne interrogée) options = personne interrogée: personne interrogée, titre: titre, sc_id: sc_id, texte: texte, tags: balises, date: date, date_pisode, numéro_episode fin

Comme vous pouvez le voir ci-dessus, nous prenons cela detail_page et appliquer un tas de méthodes d'extraction sur elle. Nous extrayons le interviewé, Titre, sc_id, texte, episode_title, et episode_number. J'ai refactoré un tas de méthodes d'assistance ciblées qui sont en charge de ces responsabilités d'extraction. Regardons-les rapidement:

Méthodes d'assistance 

Méthodes d'extraction

J'ai extrait ces aides parce que cela m'a permis d'avoir globalement des méthodes plus petites. Encapsuler leur comportement était également important. Le code se lit mieux aussi. La plupart d'entre eux prennent la detail_page comme argument et extraire certaines données spécifiques dont nous avons besoin pour nos messages de Middleman.

def extract_interviewee (detail_page) interviewee_selector = '.episode_sub_title span' detail_page.search (interviewee_selector) .text.strip end

Nous recherchons un sélecteur spécifique sur la page et obtenons le texte sans espaces blancs inutiles.

def extract_title (detail_page) title_selector = ".episode_title" detail_page.search (title_selector) .text.gsub (/ [? #] /, ") end

Nous prenons le titre et retirons ? et # car ceux-ci ne jouent pas bien avec la matière première dans les messages de nos épisodes. Plus sur la matière avant ci-dessous.

def extract_soundcloud_id (detail_page) sc = detail_page.iframes_with (href: /soundcloud.com/).to_s sc.scan (/ \ d 3, /). première fin

Ici, nous devions travailler un peu plus fort pour extraire l’identifiant SoundCloud de nos pistes hébergées. Nous avons d’abord besoin des iframes Mechanize avec href de soundcloud.com et en faire une chaîne pour la numérisation…

"[#\ n] " 

Puis correspond à une expression régulière pour ses chiffres de la piste id-our soundcloud_id "221003494".

def extract_shownotes_text (detail_page) shownote_selector = "#shownote_container> p" detail_page.search (shownote_selector) end

Extraire les notes de spectacle est encore une fois assez simple. Il suffit de rechercher les paragraphes de show notes dans la page de détail. Pas de surprises ici. 

def extract_subtitle (detail_page) subheader_selector = ".episode_sub_title" detail_page.search (subheader_selector) .text end

Il en va de même pour le sous-titre, sauf qu'il ne s'agit que d'une préparation pour en extraire proprement le numéro de l'épisode..

def extract_episode_number (episode_subtitle) number = /[#]\d*/.match(episode_subtitle) clean_episode_number (nombre) fin

Ici, nous avons besoin d’une autre série d’expressions régulières. Jetons un coup d'oeil avant et après l'application de la regex.

episode_subtitle

"João Ferreira | 12 minutes | 26 août 2015 | Épisode n ° 139"

nombre

"# 139"

Un pas de plus jusqu'à ce que nous ayons un numéro vierge.

def clean_episode_number (number) number.to_s.tr ('#', ") end

Nous prenons ce nombre avec un hash # et l'enlever. Voilà, nous avons notre premier numéro d'épisode 139 extrait aussi bien. Je suggère que nous examinions également les autres méthodes d’utilité avant de rassembler tout cela..

Méthodes utilitaires

Après toutes ces activités d'extraction, nous avons un peu de nettoyage à faire. Nous pouvons déjà commencer à préparer les données pour la composition du démarquage. Par exemple, je tranche le episode_subtitle un peu plus pour obtenir une date propre et construire la Mots clés avec le build_tags méthode.  

def clean_date

def clean_date (episode_subtitle) string_date = / [^ |] * ([,]) (…) /. match (episode_subtitle) .to_s Date.parse (string_date) end

Nous courons une autre regex qui recherche des dates comme celle-ci: "26 août 2015". Comme vous pouvez le constater, cela n’est pas encore très utile. Du date_chaîne nous obtenons du sous-titre, nous devons créer un réel Rendez-vous amoureux objet. Sinon, il serait inutile de créer des messages de Middleman.

date_chaîne

"26 août 2015"

Par conséquent, nous prenons cette chaîne et faisons Date.parse. Le résultat semble beaucoup plus prometteur.

Rendez-vous amoureux

2015-08-26

def build_tags

def build_tags (titre, interviewé) extract_tags = strip_pipes (title) "# interviewee" + ", # extract_tags" end

Cela prend la Titre et interviewé nous avons construit à l'intérieur du extract_data méthode et supprime tous les caractères de pipe et les indésirables. Nous remplaçons les caractères de pipe par une virgule, @, ?, #, et Et avec une chaîne vide, et enfin prendre soin des abréviations pour avec.

def strip_pipes

def strip_pipes (text) tags = text.tr ('|', ',') tags = tags.gsub (/ [@? # &] /, ") tags.gsub (/ [w \ /] 2 / , 'avec') fin

En fin de compte, nous incluons également le nom de l’interviewé dans la liste des tags et séparons chaque tag par une virgule..

Avant

"Masters @ Work | Subvisual | Délais | Personnalité de la conception | Problèmes de conception | Équipe | Enveloppes volantes | Expériences agréables | Perfectionnement des détails | Valeurs de l'entreprise"

Après

"João Ferreira, Masters Work, Subvisual, Délais, Personnalité de la conception, Problèmes de conception, Équipe, Enveloppes enveloppantes, Expériences délicieuses, Perfectionnement des détails, Valeurs de l'entreprise"

Chacune de ces balises finira par être un lien vers une collection de publications sur ce sujet. Tout cela s'est passé à l'intérieur du extract_data méthode. Regardons un peu où nous en sommes:

def extract_data

def extract_data (detail_page) interviewee = extract_interviewee (detail_page) title = extract_title (detail_page) sc_id = extract_soundcloud_id (detail_page) text = extract_shownotes_text (detail_page) (titre, personne interrogée) options = personne interrogée: personne interrogée, titre: titre, sc_id: sc_id, texte: texte, tags: balises, date: date, date_pisode, numéro_episode fin

Il ne reste plus qu'à retourner un hachage d'options avec les données extraites. Nous pouvons nourrir ce hash dans le composer_markdown méthode, qui prépare nos données à l'écriture sous forme de fichier dont j'ai besoin pour mon nouveau site.

Rédaction de messages

def compose_markdown

def compose_markdown (options = ) <<-HEREDOC --- title: #options[:interviewee] interviewee: #options[:interviewee] topic_list: #options[:title] tags: #options[:tags] soundcloud_id: #options[:sc_id] date: #options[:date] episode_number: #options[:episode_number] --- #options[:text] HEREDOC end

Pour la publication d’épisodes de podcast sur mon site Middleman, j’ai choisi de modifier son système de blogs. Au lieu de créer des articles de blog «purs», je crée des notes de spectacle pour mes épisodes qui affichent les épisodes hébergés sur SoundCloud via des iframes. Sur les sites d'index, j'affiche uniquement que iframe plus title and stuff.  

Le format dont j'ai besoin pour que cela fonctionne est composé de quelque chose appelé avant-propos. Il s’agit essentiellement d’un magasin de clés / valeurs pour mes sites statiques. Il remplace mes besoins de base de données de mon ancien site Sinatra. 

Des données telles que le nom de l'interviewé, la date, l'identifiant de la piste SoundCloud, le numéro de l'épisode, etc., sont placées entre trois tirets (---) au-dessus de nos fichiers d’épisodes. Vous trouverez ci-dessous le contenu de chaque épisode, notamment des questions, des liens, des informations sur les sponsors, etc..

Matière avant

--- clé: valeur clé: valeur clé: valeur clé: valeur --- Le contenu de l'épisode va ici.

dans le composer_markdown méthode, j'utilise un HEREDOC pour composer ce fichier avec sa matière première pour chaque épisode que nous parcourons. À partir du hachage d’options que nous alimentons cette méthode, nous extrayons toutes les données que nous avons collectées dans extract_data méthode d'assistance.

def compose_markdown

… <<-HEREDOC --- title: #options[:interviewee] interviewee: #options[:interviewee] topic_list: #options[:title] tags: #options[:tags] soundcloud_id: #options[:sc_id] date: #options[:date] episode_number: #options[:episode_number] --- #options[:text] HEREDOC… 

Ceci est le plan pour un nouvel épisode de podcast juste là. C'est ce que nous sommes venus chercher. Peut-être vous interrogez-vous sur cette syntaxe particulière: # options [: interviewé]. J'interpole comme d'habitude avec des chaînes, mais comme je suis déjà dans un <<-HEREDOC, Je peux laisser les guillemets doubles.

Juste pour nous orienter, nous sommes toujours dans la boucle, à l'intérieur du write_page fonction pour chaque lien cliqué vers une page de détail avec les notes d’émission d’un épisode singulier. La prochaine étape consiste à préparer l'écriture de ce plan dans le système de fichiers. En d'autres termes, nous créons l'épisode réel en fournissant un nom de fichier et le composé markdown_text

Pour cette dernière étape, il suffit de préparer les ingrédients suivants: la date, le nom de l’interviewé et le numéro de l’épisode. Plus le markdown_text bien sûr, que nous venons de recevoir composer_markdown.

def write_page

… Markdown_text = compose_markdown (extract_data) date = extract_data [: date] interviewee = extract_data [: interviewee] episode_number = extract_data [: episode_number] nom_fichier = "# date - # dasherize (interviewee) - # episode_number .html .erb.md "… 

Ensuite, il suffit de prendre la nom de fichier et le markdown_text et ecrire le fichier.

def write_page

… File.open (nom_fichier, 'w') | fichier | fichier.write (markdown_text)… 

Décomposons cela aussi. Pour chaque message, j'ai besoin d'un format spécifique: quelque chose comme: 2016-10-25-Avdi-Grimm-120. Je veux écrire des fichiers qui commencent par la date et incluent le nom de l'interviewé et le numéro de l'épisode.

Pour correspondre au format attendu par Middleman pour les nouveaux postes, je devais prendre le nom de la personne interrogée et le mettre en relation avec ma méthode d’aide pour: dasherize le nom pour moi, de Avdi Grimm à Avdi-Grimm. Rien de magique, mais mérite un coup d'oeil:

def dasherize

def dasherize (text) text.lstrip.rstrip.tr (", '-') fin

Il supprime les espaces du texte que nous avons gratté pour le nom de la personne interrogée et remplace l'espace entre Avdi et Grimm par un tiret. Le reste du nom de fichier est pointé ensemble dans la chaîne elle-même: "date-nom-interviewé-nom-episodenumber".

def write_page

… "# Date - # dasherize (interviewé) - # episode_number .html.erb.md"… 

Comme le contenu extrait provient directement d'un site HTML, je ne peux pas simplement utiliser .Maryland ou .réduction comme extension de nom de fichier. J'ai décidé d'aller avec .html.erb.md. Pour les prochains épisodes que je compose sans racler, je peux quitter la .html.erb partie et seulement besoin .Maryland.

Après cette étape, la boucle dans le gratter La fonction se termine, et nous devrions avoir un seul épisode qui ressemble à ceci:

2014-12-01-Avdi-Grimm-1.html.erb.md

--- titre: Avdi Grimm interviewé: Avdi Grimm topic_list: What is Rake | Origines | Jim Weirich | Cas d'utilisation courants | Avantages des balises Rake: Avdi Grimm, Qu'est-ce que Rake, Origines, Jim Weirich, Cas d'utilisation courants, Avantages de Rake soundcloud_id: 179619755 Date: 2014-12-01 Numéro de l'épisode: 1 --- Questions: - Qu'est-ce que Rake? - Que peux-tu nous dire sur les origines de Rake? - Que pouvez-vous nous dire à propos de Jim Weihrich? - Quels sont les cas d'utilisation les plus courants pour Rake? - Quels sont les avantages les plus notables de Rake? Liens: Dans "> http://www.youtube.com/watch?v=2ZHJSrF52bc"> À la mémoire du grand Jim Weirich Rake "> https://github.com/jimweirich/rake"> Rake on GitHub Jim " > https://github.com/jimweirich "> Jim Weirich sur GitHub Basic"> http://www.youtube.com/watch?v=AFPWDzHWjEY "> Discussion de base sur le rake par Jim Weirich Power"> http: // www .youtube.com / watch? v = KaEqZtulOus "> Rake talk de Jim Weirich Learn"> http://devblog.avdi.org/2014/04/30/learn-advanced-rake-in-7-episodes/ " > Apprenez le rake en 7 épisodes - grâce à Avdi Grimm (gratuit) Avdi "> http://about.avdi.org/"> Avdi Grimm Screencasts d'Avdi Grimm: Ruby "> http://www.rubytapas.com/"> Ruby Tapas Ruby "> http://devchat.tv/ruby-rogues/"> Podcast de Ruby Rogues avec Avdi Grimm Grand ebook: Rake "> http://www.amazon.com/Rake-Management-Essentials-Andrey-Koleshko / dp / 1783280778 "> Les bases de la gestion des tâches de râteau de http: //twitter.com/ka8725"> Andrey Koleshko

Ce grattoir commencerait bien sûr au dernier épisode et resterait en boucle jusqu'au premier. À des fins de démonstration, l'épisode 01 est aussi bon que tout. Vous pouvez voir en haut la matière avec les données que nous avons extraites. 

Tout cela était auparavant bloqué dans la base de données contenant le numéro d'épisode de l'application Sinatra, la date, le nom de l'interviewé, etc. Nous l'avons maintenant préparé pour faire partie de mon nouveau site statique Middleman. Tout en dessous des deux triples tirets (---) est le texte des notes de spectacle: questions et liens principalement.

Dernières pensées

Et nous avons fini. Mon nouveau podcast est déjà opérationnel. Je suis vraiment content d'avoir pris le temps de redessiner la chose à partir de zéro. C'est beaucoup plus cool de publier de nouveaux épisodes maintenant. La découverte de nouveaux contenus devrait également être plus fluide pour les utilisateurs. 

Comme je l'ai mentionné plus tôt, c'est le moment où vous devriez aller dans votre éditeur de code pour vous amuser. Prenez ce code et combattez-le un peu. Essayez de trouver des moyens de simplifier les choses. Il y a quelques occasions de refactoriser le code.

Globalement, j'espère que ce petit exemple vous a donné une bonne idée de ce que vous pouvez faire avec votre nouveau site Web en grattant des côtelettes. Bien sûr, vous pouvez réaliser des défis beaucoup plus sophistiqués - je suis sûr que de nombreuses opportunités de petites entreprises peuvent être créées avec ces compétences.. 

Mais comme toujours, faites-le étape par étape et ne vous énervez pas si les choses ne cliquent pas tout de suite. Ce n'est pas seulement normal pour la plupart des gens, mais il faut s'y attendre. Cela fait partie du voyage. Bonne raclage!