Προσθήκη των αγαπημένων σας ειδησεογραφικών ιστοσελίδων

Το calibre έχει ένα πανίσχυρο, ευπροσάρμοστο και εύκολο στη χρήση σύνολο εργαλείων για τη λήψη ειδήσεων από το διαδίκτυο και τη μετατροπή τους σε ψηφιακά βιβλία. Τα ακόλουθα θα σας δείξουν, με χρήση παραδειγμάτων, πως να λαμβάνετε ειδήσεις από διάφορες ιστοσελίδες.

Για να καταλάβετε πως να χρησιμοποιείτε το σύνολο εργαλείων ακολουθήστε τα παραδείγματα, στη σειρά με την οποία εμφανίζονται παρακάτω:

Πλήρως αυτοματοποιημένες λήψεις

Αν η πηγή των ειδήσεών σας είναι αρκετά απλή, το calibre ίσως είναι σε θέση να κάνει αυτόματη λήψη - θα χρειαστεί απλώς να του γνωστοποιήσετε το URL. Το calibre συλλέγει όλες τις απαραίτητες πληροφορίες για τη λήψη των πηγών ειδήσεων σε μια συνταγή. Για να πείτε στο calibre για μια πηγή ειδήσεων, πρέπει να δημιουργήσετε μια συνταγή γι” αυτό. Ας δούμε κάποια παραδείγματα:

Το ιστολόγιο του calibre

Το ιστολόγιο του calibre είναι ένα ιστολόγιο με αναρτήσεις που περιγράφουν πολλά χρήσιμα χαρακτηριστικά του calibre με ένα απλό και βατό τρόπο για νέους χρήστες του calibre. Για να γίνει λήψη του ιστολόγιου αυτού ως ψηφιακό βιβλίο, βασιζόμαστε στη ροή RSS του ιστολόγιου:

http://blog.calibre-ebook.com/feeds/posts/default

Παίρνουμε τη διεύθυνση της ροής RSS κοιτώντας κάτω από το «Subscribe to» στο τέλος της σελίδας ιστολογίου, και επιλέγοντας Posts → Atom. Για να κάνετε το calibre να λάβει τη ροή και να τη μετατρέψει σε ψηφιακό βιβλίο, πρέπει να πατήσετε το δεξί πλήκτρο του ποντικιού σας στο κουμπί Λήψη ειδήσεων, μετά στο στοιχείο μενού Προσθήκη μιας εξατομικευμένης πηγής ειδήσεων και ακολούθως στο κουμπί Νέα συνταγή. Θα πρέπει να παρουσιαστεί ένας διάλογος παρόμοιος με αυτόν που φαίνεται παρακάτω.

_images/custom_news.png

Πρώτα εισάγετε Ιστολόγιο Calibre στο πεδίο Όνομα συνταγής. Αυτός θα είναι ο τίτλος του ψηφιακού βιβλίου που θα δημιουργηθεί από τα άρθρα της παραπάνω ροής.

Τα επόμενα δύο πεδία (Παλιότερο άρθρο και Μέγιστος αριθμός άρθρων) σας δίνουν κάποιο έλεγχο πάνω στο πόσα άρθρα πρέπει να ληφθούν από κάθε ροή, και είναι αρκετά αυτονόητα.

Για να προσθέσετε ροές σε συνταγή, εισάγετε τον τίτλο και τη διεύθυνση URL της ροής και πατήστε το κουμπί Προσθήκη ροής. Αφού προσθέσετε τη ροή, απλώς πατήστε το κουμπί Αποθήκευση και τελειώσατε! Κλείστε το διάλογο.

Για να δοκιμάσετε τη νέα σας συνταγή, πατήστε το κουμπί Λήψη ειδήσεων και στο υπομενού Εξατομικευμένες πηγές ειδήσεων επιλέξτε Ιστολόγιο calibre. Μετά από λίγα λεπτά, το νεοληφθέν ψηφιακό βιβλίο με τις αναρτήσεις του ιστολόγιου θα εμφανιστεί στην προβολή της κύριας βιβλιοθήκης (αν έχετε συνδεδεμένη τη συσκευή ανάγνωσής σας, θα αποσταλεί σε αυτήν αντί για τη βιβλιοθήκη). Επιλέξτε το βιβλίο και χτυπήστε το κουμπί Προβολή για να διαβάσετε!

Ο λόγος που αυτό λειτούργησε τόσο καλά, με τόσο λίγο κόπο, είναι γιατί το ιστολόγιο παρέχει πλήρους περιεχομένου ροές RSS, δηλαδή τα περιεχόμενα άρθρα είναι ενσωματωμένα στην ίδια τη ροή. Για τις περισσότερες πηγές ειδήσεων που παρέχουν νέα με αυτό τον τρόπο, με πλήρους περιεχομένου ροές, δεν απαιτείται πρόσθετος κόπος για τη μετατροπή τους σε ψηφιακά βιβλία. Τώρα θα κοιτάξουμε σε μια πηγή ειδήσεων που δεν παρέχει ροές πλήρους περιεχομένου. Σε τέτοιες ροές, το πλήρες άρθρο είναι μια ιστοσελίδα, και η ροή περιέχει μόνο ένα σύνδεσμο στην ιστοσελίδα, μαζί με μια συνοπτική περιγραφή του άρθρου.

bbc.co.uk

Ας δοκιμάσουμε τις επόμενες δύο ροές από το BBC:

Ακολουθήστε τη διαδικασία που περιγράφηκε στην ενότητα Το ιστολόγιο του calibre παραπάνω για τη δημιουργία συνταγής για το BBC (με χρήση των προαναφερθέντων ροών). Κοιτώντας στο ληφθέν ψηφιακό βιβλίο, βλέπουμε ότι το calibre έχει κάνει μια αξιόπιστη δουλειά στην επιλογή του περιεχομένου που σας ενδιαφέρει από την ιστοσελίδα του κάθε άρθρου. Ωστόσο, η διαδικασία επιλογής δεν είναι τέλεια. Μερικές φορές αφήνει ανεπιθύμητο περιεχόμενο όπως μενού και βοηθήματα πλοήγησης, ή αφαιρεί περιεχόμενο που θα έπρεπε να έχει επιλεγεί, όπως επικεφαλίδες άρθρων. Για να τελειοποιηθεί η διαδικασία επιλογής θα χρειαστεί να εξατομικεύσουμε τη διαδικασία λήψης όπως περιγράφεται στην επόμενη ενότητα.

Εξατομίκευση της διαδικασίας λήψης

Όταν θέλετε να τελειοποιήσετε την διαδικασία λήψης, ή να λάβετε περιεχόμενο από μια ιδιαιτέρως περίπλοκη ιστοσελίδα, μπορείτε να θέσετε στη διάθεσή σας όλη την ισχύ και την προσαρμοστικότητα του μηχανισμού των συνταγών. Για να το κάνετε αυτό, στο διάλογο Προσθήκη εξατομικευμένης πηγής ειδήσεων, απλώς πατήστε το κουμπί Αλλαγή σε κατάσταση για προχωρημένους.

Η ευκολότερη και συχνά πιο παραγωγική προσαρμογή είναι να χρησιμοποιήσετε την εκτυπώσιμη έκδοση των διαδικτυακών άρθρων. Η εκτυπώσιμη έκδοση έχει τυπικά πολύ λιγότερους πλεονασμούς και μετατρέπεται πολύ ομαλότερα σε ψηφιακό βιβλίο. Ας προσπαθήσουμε να χρησιμοποιήσουμε την εκτυπώσιμη έκδοση από τα άρθρα του BBC.

Χρήση της εκτυπώσιμης έκδοσης του bbc.co.uk

Το πρώτο βήμα είναι να κοιτάξουμε το ψηφιακό βιβλίο που λάβαμε προηγουμένως από το bbc.co.uk. Στο τέλος κάθε άρθρου, το ψηφιακό βιβλίο έχει μια μικρή σύνοψη που σας λέει από που λάβατε το άρθρο. Αντιγράψτε και επικολλήστε αυτό το URL σε ένα φυλλομετρητή. Τώρα, στην ιστοσελίδα του άρθρου, κοιτάξτε για κάποιο σύνδεσμο που δείχνει στην «εκτυπώσιμη έκδοση». Πατήστε τον για να δείτε την εκτυπώσιμη έκδοση του άρθρου. Φαίνεται πολύ καλύτερη! Τώρα, συγκρίνετε τα δύο URL. Για μένα ήταν τα:

Συνεπώς για να πάρουμε την εκτυπώσιμη έκδοση φαίνεται πως χρειάζεται να βάλουμε σε κάθε URL το πρόθεμα:

newsvote.bbc.co.uk/mpapps/pagetools/print/

Now in the Advanced mode of the Custom news sources dialog, you should see something like (remember to select The BBC recipe before switching to advanced mode):

_images/bbc_advanced.png

Μπορείτε να δείτε ότι τα πεδία από τη Βασική κατάσταση έχουν μεταφραστεί σε κώδικα Python με ένα ξεκάθαρο τρόπο. Χρειαζόμαστε την προσθήκη εντολών στη συνταγή αυτή, για να χρησιμοποιεί την εκτυπώσιμη έκδοση των άρθρων. Το μόνο που χρειάζεται είναι να προσθέσουμε τις ακόλουθες 2 γραμμές:

def print_version(self, url):
    return url.replace('https://', 'https://newsvote.bbc.co.uk/mpapps/pagetools/print/')

Έχουμε να κάνουμε με την Python, οπότε οι εσοχές είναι σημαντικές. Αφού έχετε προσθέσει τις γραμμές, θα πρέπει να μοιάζει με το εξής:

_images/bbc_altered.png

Στα παραπάνω, η def print_version(self, url) ορίζει μια μέθοδο που καλείται από το calibre για κάθε άρθρο. Το url είναι το URL του αρχικού άρθρου. Αυτό που κάνει η print_version είναι να πάρει αυτό το url και να το αντικαταστήσει με το νέο URL που δείχνει στην εκτυπώσιμη έκδοση του άρθρου. Για να μάθετε για την Python δείτε τον `οδηγό εκμάθησης<https://docs.python.org/tutorial/>`_.

Τώρα, πατήστε το κουμπί Προσθήκη/ενημέρωση συνταγής και οι αλλαγές σας θα αποθηκευτούν. Κατεβάστε ξανά το ψηφιακό βιβλίο. Θα πρέπει να έχετε ένα αρκετά καλύτερο ψηφιακό βιβλίο. Ένα από τα προβλήματα με τη νέα έκδοση είναι ότι οι γραμματοσειρές στην ιστοσελίδα της εκτυπώσιμης έκδοσης είναι υπερβολικά μικρές. Αυτό διορθώνεται αυτόματα κατά τη μετατροπή σε ψηφιακό βιβλίο, αλλά ακόμα και μετά την επιδιόρθωση το μέγεθος της γραμματοσειράς των μενού και της μπάρας πλοήγησης γίνονται πολύ μεγάλα συγκριτικά με το κείμενο του άρθρου. Για να διορθωθεί αυτό, θα κάνουμε λίγη παραπάνω εξατομίκευση στην επόμενη ενότητα.

Αντικατάσταση του στυλ των άρθρων

Στην προηγούμενη ενότητα είδαμε πως το μέγεθος της γραμματοσειράς των άρθρων στην εκτυπώσιμη έκδοσή τους στο BBC ήταν πολύ μικρό. Στις περισσότερες ιστοσελίδες, συμπεριλαμβανομένου του BBC, το μέγεθος της γραμματοσειράς ορίζεται με χρήση φύλλων στυλ CSS. Μπορούμε να απενεργοποιήσουμε τη λήψη τέτοιων φύλλων στυλ προσθέτοντας τη γραμμή:

no_stylesheets = True

Η συνταγή τώρα μοιάζει με:

_images/bbc_altered1.png

Η νέα έκδοση φαίνεται πολύ καλή. Αν είστε τελειομανείς, θα θέλετε να διαβάσετε την επόμενη ενότητα, η οποία ουσιαστικά πραγματεύεται την τροποποίηση του ληφθέντος περιεχομένου.

Τομές και τεμαχισμός

Το calibre έχει πολύ ισχυρές και ευπροσάρμοστες ικανότητες για τη διαχείριση ληφθέντος περιεχομένου. Για να επιδείξουμε λίγες εξ αυτών, ας κοιτάξουμε τον παλιόφιλό μας, τη συνταγή BBC, για μια ακόμα φορά. Κοιτώντας τον πηγαίο κώδικα (HTML) σε λίγα άρθρα (στην εκτυπώσιμη έκδοσή τους), βλέπουμε ότι έχουν ένα υποσέλιδο που δεν περιέχει καμιά χρήσιμη πληροφορία, το οποίο περιέχεται στο

<div class="footer">
...
</div>

Αυτό μπορεί να αφαιρεθεί προσθέτοντας:

remove_tags    = [dict(name='div', attrs={'class':'footer'})]

στη συνταγή. Τέλος, ας αντικαταστήσουμε κάποια από τα CSS που απενεργοποιήσαμε νωρίτερα, με δικά μας CSS, τα οποία είναι κατάλληλα για μετατροπή σε ψηφιακό βιβλίο:

extra_css      = '.headline {font-size: x-large;} \n .fact { padding-top: 10pt  }'

With these additions, our recipe has become «production quality».

Αυτή η recipe εξερευνά μόνο την κορφή του παγόβουνου όσον αφορά την ισχύ του calibre. Για να εξερευνήσουμε περισσότερες από τις δυνατότητες του calibre, θα εξετάσουμε ένα πιο πολύπλοκο παράδειγμα πραγματικής χρήσης στην επόμενη ενότητα.

Παράδειγμα πραγματικής χρήσης

Ένα αρκούντως περίπλοκο παράδειγμα πραγματικής χρήσης που εκθέτει περισσότερο από το API των BasicNewsRecipe είναι η recipe των New York Times

import string, re
from calibre import strftime
from calibre.web.feeds.recipes import BasicNewsRecipe
from calibre.ebooks.BeautifulSoup import BeautifulSoup

class NYTimes(BasicNewsRecipe):

    title       = 'The New York Times'
    __author__  = 'Kovid Goyal'
    description = 'Daily news from the New York Times'
    timefmt = ' [%a, %d %b, %Y]'
    needs_subscription = True
    remove_tags_before = dict(id='article')
    remove_tags_after  = dict(id='article')
    remove_tags = [dict(attrs={'class':['articleTools', 'post-tools', 'side_tool', 'nextArticleLink clearfix']}),
                dict(id=['footer', 'toolsRight', 'articleInline', 'navigation', 'archive', 'side_search', 'blog_sidebar', 'side_tool', 'side_index']),
                dict(name=['script', 'noscript', 'style'])]
    encoding = 'cp1252'
    no_stylesheets = True
    extra_css = 'h1 {font: sans-serif large;}\n.byline {font:monospace;}'

    def get_browser(self):
        br = BasicNewsRecipe.get_browser()
        if self.username is not None and self.password is not None:
            br.open('https://www.nytimes.com/auth/login')
            br.select_form(name='login')
            br['USERID']   = self.username
            br['PASSWORD'] = self.password
            br.submit()
        return br

    def parse_index(self):
        soup = self.index_to_soup('https://www.nytimes.com/pages/todayspaper/index.html')

        def feed_title(div):
            return ''.join(div.findAll(text=True, recursive=False)).strip()

        articles = {}
        key = None
        ans = []
        for div in soup.findAll(True,
             attrs={'class':['section-headline', 'story', 'story headline']}):

             if ''.join(div['class']) == 'section-headline':
                 key = string.capwords(feed_title(div))
                 articles[key] = []
                 ans.append(key)

             elif ''.join(div['class']) in ['story', 'story headline']:
                 a = div.find('a', href=True)
                 if not a:
                     continue
                 url = re.sub(r'\?.*', '', a['href'])
                 url += '?pagewanted=all'
                 title = self.tag_to_string(a, use_alt=True).strip()
                 description = ''
                 pubdate = strftime('%a, %d %b')
                 summary = div.find(True, attrs={'class':'summary'})
                 if summary:
                     description = self.tag_to_string(summary, use_alt=False)

                 feed = key if key is not None else 'Uncategorized'
                 if feed not in articles:
                     articles[feed] = []
                 if not 'podcasts' in url:
                     articles[feed].append(
                               dict(title=title, url=url, date=pubdate,
                                    description=description,
                                    content=''))
        ans = self.sort_index_by(ans, {'The Front Page':-1, 'Dining In, Dining Out':1, 'Obituaries':2})
        ans = [(key, articles[key]) for key in ans if key in articles]
        return ans

    def preprocess_html(self, soup):
        refresh = soup.find('meta', {'http-equiv':'refresh'})
        if refresh is None:
            return soup
        content = refresh.get('content').partition('=')[2]
        raw = self.browser.open('https://www.nytimes.com'+content).read()
        return BeautifulSoup(raw.decode('cp1252', 'replace'))

Βλέπουμε αρκετά νέα χαρακτηριστικά στη recipe αυτή. Αρχικά, έχουμε:

timefmt = ' [%a, %d %b, %Y]'

Αυτό θέτει την ημερομηνία που εμφανίζεται στην μπροστινή σελίδα του δημιουργημένου ψηφιακού βιβλίου στη μορφή Όνομα_μέρας, αριθμός_μέρας όνομα_μήνα έτος. Δείτε μορφοποιήσεις_χρόνου.

Στη συνέχεια βλέπουμε μια ομάδα από εντολές για εκκαθάριση του ληφθέντος HTML:

remove_tags_before = dict(name='h1')
remove_tags_after  = dict(id='footer')
remove_tags = ...

Αυτές απομακρύνουν τα πάντα πριν από την πρώτη ετικέτα <h1>, και ότι υπάρχει μετά την πρώτη ετικέτα της οποίας το όνομα είναι footer. Δείτε αφαίρεση_ετικετών, αφαίρεση_ετικετών_πριν, αφαίρεση_ετικετών_μετά.

Το επόμενο ενδιαφέρον χαρακτηριστικό είναι:

needs_subscription = True
...
def get_browser(self):
    ...

Το needs_subscription = True ενημερώνει το calibre ότι η συνταγή αυτή χρειάζεται ένα όνομα χρήστη και ένα κωδικό εξουσιοδότησης για την πρόσβαση στο περιεχόμενο. Αυτό έχει ως αποτέλεσμα το calibre να ζητήσει όνομα χρήστη και κωδικό όποτε προσπαθήσετε να χρησιμοποιήσετε τη συνταγή αυτή. Ο κώδικας στο calibre.web.feeds.news.BasicNewsRecipe.get_browser() ουσιαστικά κάνει την είσοδό σας στην ιστοσελίδα των NYT. Μόλις μπείτε, το calibre θα χρησιμοποιήσει την ίδια, εξουσιοδοτημένη από την ιστοσελίδα διεργασία φυλλομέτρησης, για τη λήψη όλου του περιεχομένου. Κοιτάξτε στο mechanize για να κατανοήσετε τον κώδικα του get_browser.

Το επόμενο νέο χαρακτηριστικό είναι η μέθοδος calibre.web.feeds.news.BasicNewsRecipe.parse_index(). Η δουλειά της είναι να πάει στο https://www.nytimes.com/pages/todayspaper/index.html και να λάβει τη λίστα των άρθρων που εμφανίζονται στη σημερινή εφημερίδα. Αν και πιο σύνθετη από μια απλή χρήση RSS, η συνταγή δημιουργεί ένα ψηφιακό βιβλίο που αντιστοιχεί πολύ στενά στη σημερινή εφημερίδα. Η parse_index κάνει βαριά χρήση του πακέτου BeautifulSoup για τη σάρωση της ιστοσελίδας της σημερινής εφημερίδας. Μπορείτε επίσης να χρησιμοποιήσετε άλλους, πιο σύγχρονους, σαρωτές αν δεν σας αρέσει το BeatifulSoup. Το calibre έρχεται με τους lxml και html5lib, οι οποίοι είναι οι προτεινόμενοι σαρωτές. Για να τους χρησιμοποιήσετε, αντικαταστήστε την κλήση της index_to_soup() ως ακολούθως:

raw = self.index_to_soup(url, raw=True)
# For html5lib
import html5lib
root = html5lib.parse(raw, namespaceHTMLElements=False, treebuilder='lxml')
# For the lxml html 4 parser
from lxml import html
root = html.fromstring(raw)

Το τελευταίο νέο χαρακτηριστικό είναι η μέθοδος calibre.web.feeds.news.BasicNewsRecipe.preprocess_html(). Μπορεί να χρησιμοποιηθεί για να επιφέρει τυχαίους μετασχηματισμούς σε κάθε ληφθείσα σελίδα HTML. Εδώ χρησιμοποιείται για να υπερκεράσει τις διαφημίσεις που σας δείχνουν οι nytimes πριν από κάθε άρθρο.

Συμβουλές για ανάπτυξη νέων συνταγών

Ο καλύτερος τρόπος ανάπτυξης νέων συνταγών είναι με τη χρήση της διεπαφής γραμμής εντολών. Δημιουργήστε τη συνταγή χρησιμοποιώντας τον αγαπημένο σας συντάκτη προγραμμάτων Python, και αποθηκεύστε τη συνταγή σε ένα αρχείο, πχ myrecipe.recipe. Η κατάληξη .recipe απαιτείται. Μπορείτε να λάβετε περιεχόμενο χρησιμοποιώντας τη συνταγή αυτή με την εντολή:

ebook-convert myrecipe.recipe .epub --test -vv --debug-pipeline debug

Η εντολή ebook-convert θα κατεβάσει όλες τις ιστοσελίδες και θα τις αποθηκεύσει στο αρχείο EPUB myrecipe.epub. Η επιλογή -vv κάνει την εντολή ebook-convert να εξάγει πολλές πληροφορίες για το τι ακριβώς κάνει. Η επιλογή ebook-convert-recipe-input --test έχει ως αποτέλεσμα την λήψη λίγων μόνο ζευγών άρθρων, από 2 το πολύ ροές. Επιπροσθέτως, η εντολή ebook-convert θα τοποθετήσει το ληφθέν HTML στο φάκελο debug/input, όπου debug είναι ο φάκελος που καθορίσατε στην επιλογή ebook-convert --debug-pipeline.

Όταν η λήψη ολοκληρωθεί, μπορείτε να κοιτάξετε το ληφθέν HTML ανοίγοντας το αρχείο debug/input/index.html σε ένα φυλλομετρητή. Μόλις είστε ικανοποιημένοι ότι η λήψη και η προεπεξεργασία γίνονται σωστά, μπορείτε να δημιουργήσετε ψηφιακά βιβλία σε διάφορες μορφές όπως φαίνεται παρακάτω:

ebook-convert myrecipe.recipe myrecipe.epub
ebook-convert myrecipe.recipe myrecipe.mobi
...

Αν είστε ικανοποιημένοι με τη συνταγή σας και νοιώθετε πως υπάρχει αρκετή ζήτηση που να δικαιολογεί τη συμπερίληψή της στο σύνολο των ενσωματωμένων συνταγών, αναρτήστε τη συνταγή σας στο φόρουμ συνταγών calibre για να τη μοιραστείτε με άλλους χρήστες του calibre.

Σημείωση

Στο macOS, τα εργαλεία γραμμής εντολών είναι μέσα στο φάκελο εγκατάστασης του calibre, για παράδειγμα, αν εγκαταστήσατε το calibre στο φάκελο /Applications τα εργαλεία γραμμής εντολών είναι στη θέση /Applications/calibre.app/Contents/MacOS/.

Δείτε επίσης

ebook-convert

Η διεπαφή γραμμής εντολών για ολόκληρη τη μετατροπή των ψηφιακών βιβλίων.

Πρόσθετο διάβασμα

Για να μάθετε περισσότερα σχετικά με τη συγγραφή προχωρημένων συνταγών χρησιμοποιώντας κάποιες από τις διαθέσιμες δυνατότητες της κλάσης BasicNewsRecipe, συμβουλευτείτε τις παρακάτω πηγές:

Τεκμηρίωση API

Τεκμηρίωση για την κλάση BasicNewsRecipe και όλες τις σημαντικές μεθόδους και πεδία της.

BasicNewsRecipe

Ο πηγαίος κώδικας της BasicNewsRecipe

Ενσωματωμένες συνταγές

Ο πηγαίος κώδικας για τις ενσωματωμένες συνταγές που έρχονται με το calibre

Το φόρουμ συνταγών calibre

Εκεί συχνάζουν πολλοί συγγραφείς συνταγών calibre που γνωρίζουν καλά το θέμα.