Menambah laman sesawang berita kegemaran anda

calibre mempunyai bingkai kerja yang hebat, fleksibel dan mudah digunakan untuk memuat turun berita dari Internet dan menukar ia menjadi e-buku. Yang berikut akan menunjukkan kepada anda, dengan contoh bagaimana hendak dapatkan berita dari pelbagai laman sesawang.

Untuk memahami bagaimana hendak guna bingkai kerja, ikuti contoh yang tersenarai tertib di bawah:

Pemerolehan automatik sepenuhnya

Jika sumber berita anda adalah ringkas, calibre boleh mendapatkannya dengan sepenuhnya secara automatik, apa yang anda perlu sediakan adalah URL. calibre menghimpun semua maklumat yang diperlukan untuk memuat turun sumber berita dalam bentuk resepi. Untuk memberitahu calibre berkenaan sumber beritah, anda perlu cipta resepi untuknya. Ok, mari kita lihat beberapa contoh yang disediakan:

Blog calibre

Blog calibre adalah blog pos yang menjelaskan banyak fitur calibre yang berguna dalam cara yang mudah dan boleh dicapai untuk pengguna baru calibre. Untuk memuat turun blog ini menjadi e-buku, kami bergantung pada suapan RSS blog:

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

Saya perolehi URL RSS dengan meneliti "Subscribe to" di bahagian bawah laman blog dan pilih Posts → Atom. Supaya calibre dapat memuat turun suapan dan menukarkanya menjadi e-buku, anda boleh klik-kanan butang Dapatkan berita kemudian item menu Tambah sumber berita suai dan kemudian butang Resepi Baharu. Satu dialog serupa dengan yang telah ditunjukkan akan dibuka.

_images/custom_news.png

First enter Calibre Blog into the Recipe title field. This will be the title of the e-book that will be created from the articles in the above feeds.

Dua medan berikutnya (Oldest article dan Max. number of articles) membolehkan anda kawal berapa banyak artikel yang patut dimuat turun dari setiap suapan.

Untuk menambah suapan ke dalam resepi, masukkan tajuk suapan dan URL suapan kemudian klik butang Tambah suapan. Selepas itu, hanya klik butang Simpan dan kerja anda telah selesai! Tutup dialog.

Untuk menguji resepi baharu anda, klik butang Dapatkan berita dan pada sub-menu Suai sumber baharu klik calibre Blog. Selepas beberapa minit, e-buku baharu dimuat turun akan muncul dalam paparan pustaka utama (jika anda memiliki pembaca yang telah bersambung, ia akan dimasukkan ke dalam pembaca selain dari ke dalam pustaka). Pilih e-buku tersebut dan tekan butang :guilabel:`Lihat' untuk membaca!

Sebab apa proses ini menghasilkan e-buku yang baik, kerana blog ini menyediakan suapan RSS dengan kandungan-lengkap iaitu, kandungan artikel sebenar terbenam dalam suapan itu sendiri. Bagi kebanyakan sumber berita yang menyediakan berita dengan suapan dengan kandungan-lengkap, anda tidak perlu buat lebih kerja untuk menukar ia menjadi e-buku. Sekarang kita lihat sumber berita yang tidak menyediakan suapan dengan kandungan-lengkap. Suapan sebegini, artikel lengkap berada dalam laman sesawang dan suapan hanya menyediakan pautan ke laman sesawang dengan ringkasan pendek artikel berkenaan.

bbc.co.uk

Let's try the following two feeds from The BBC:

Ikuti prosedur yang digariskan dalam Blog calibre seperti di atas untuk menghasilkan resepi untuk The BBC (menggunakan suapan tersebut). Berdasarkan pada e-buku yang dimuat turun, didapati calibre telah melakukan kerja yang bagus hanya mengekstrak kandungan yang dikehendaki bagi setiap artikel dalam laman sesawang. Walaubagaimanapun, proses pengekstrakan ini tidaklah seratus peratus sempurna. Kadangkala ia meninggalkan kandungan yang tidak dikehendaki seperti menu dan bantuan navigasi atau ia telah buang kandungan yang sepatutnya diambil seperti tajuk artikel. Untuk memastikan pengekstrakan kandungan menepati kehendak anda, kita perlu suaikan proses mendapatkan artikel, yang dijelaskan pada seksyen yang berikutnya.

Penyuaian proses mendapatkan artikel

Bila anda mahukan proses muat turun yang sempurna, atau muat turun kandungan dari laman sesawang yang kompleks, anda perlu biasakan dengan bingkai kerja resepi yang fleksibel. Untuk membuatnya, pada dialog Tambah sumber berita suai, hanya klik butang Tukar ke mod Lanjutan.

Penyuaian termudah dan paling produktif ialah dengan menggunakan versi cetak artikel atas-talian. Versi cetak biasanya kurang kompleks dan mudah diterjemah menjadi e-buku. Cuba guna versi cetak daripada The BBC.

Menggunakan versi cetak bbc.co.uk

Langkah pertama adalah melihat e-buku yang telah dimuat turun sebelum ini daripada bbc.co.uk. Dipenghujung setiap artikel, dalam e-buku terdapat lokasi artikel dimuat turun. Salin dan tampal URL tersebut ke dalam pelayar. Sekarang laman sesawang artikel akan menuju ke "Versi Boleh Cetak". Klik padanya untuk melihat versi cetak artikel. Ia kelihatan lebih kemas! Sekarang bandingkan kedua-dua URL yang mana:

Jika mahukan versi cetak, kita perlu tambah setiap URL artikel dengan:

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

Anda dapati medan dari Mod asas telah diterjemah dalam kod bahasa Python. Kita perlu tambah arahan ke dalam resepi ini supaya dapat guna versi cetak artikel. Apa yang diperlukan adalah dengan menambah dua baris berikut:

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

Ini adalah bahasa Python, oleh itu penggunaan indentasi adalah penting. Selepas anda menambah baris, ia sepatutnya kelihatan seperti berikut:

_images/bbc_altered.png

In the above, def print_version(self, url) defines a method that is called by calibre for every article. url is the URL of the original article. What print_version does is take that url and replace it with the new URL that points to the print version of the article. To learn about Python see the tutorial.

Sekarang, klik butang Tambah/kemaskini resepi dan perubahan yang anda buat akan disimpan. Muat semula e-buku. E-buku tersebut telah diperkemaskan. Salah satu masalah dengan versi baharu ialah fon yang digunakan pada versi cetak terlalu kecil. Ia dibaiki secara automatik bila menukar menjadi e-buku, tetapi selepas proses pembaikan, saiz fon bagi menu dan palang navigasi menjadi terlalu besar berbanding teks artikel. Untuk membaikinya, kita perlu lakukan lagi penyuaian, pada seksyen berikutnya.

Menggantikan gaya artikel

Dalam seksyen terdahulu, kita dapati saiz fon artikel dalam versi cetak The BBC terlalu kecil. Dalam kebanyakan laman sesawang, The BBC juga, saiz fon ini ditetapkan melalui lembaran gaya CSS. Kita boleh lumpuhkan pengambilan lembaran gaya tersebut dengan menambah baris:

no_stylesheets = True

Resepi kini kelihatan seperti:

_images/bbc_altered1.png

Versi baharu kelihatan menarik. Jika anda mementingkan kesempurnaan, anda perlu baca seksyen berikutnya yang melibatkan pengubahsuaian sebenar kandungan muat turun.

Menghiris dan mencincang

calibre memiliki keupayaan yang hebat dan fleksibel bila memanipulasikan kandungan muat turun. Sebagai contoh, kita rujuk kembali The BBC sekali lagi. Berdasarkan pada kod sumber (HTML) beberapa artikel (versi cetak), didapati mereka mempunyai pengkaki yang tidak diperlukan, terkandung didalamnya

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

Ia boleh dibuang dengan menambah:

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

ke dalam resepi. Akhir sekali, gantikan beberapa CSS yang telah dilumpuhkan sebelum ini, dengan CSS anda sendiri yang sesuai dengan penukaran sesebuah e-buku:

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

With these additions, our recipe has become "production quality".

Resepi ini hanya menjelajah sebahagian kecil sahaja bila dibandingkan kelebihan yang ada pada calibre. Untuk menjelajah lebih mendalam keupayaan calibre kita perlu menyelidiki contoh sebenar yang lebih kompleks pada seksyen berikutnya.

Contoh sebenar

Contoh sebenar yang benar-benar kompleks yang mendedahkan lebih API BasicNewsRecipe adalah resepi untuk The 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'))

Kami melihat beberapa fitur baharu dalam resepi ini. Mula-mula, kita perlu:

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

Ini tetapkan masa paparan pada muka hadapan e-buku yang dihasilkan dalam format, Day, Day_Number Month, Year. Sila rujuk timefmt.

Kemudian kita lihat sekumpulan arahan untuk membersihkan HTML dimuat turun:

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

Ia membuang segalanya sebelum <h1> tag pertama dan segalanya selepas tag pertama yang mana id ialah footer. Sila rujuk remove_tags, remove_tags_before, remove_tags_after.

Fitur menarik berikutnya ialah:

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

needs_subscription = True memberitahui calibre bahawa resepi ini perlukan nama pengguna dan kata laluan supaya ia dapat capai kandungan tersebut. Oleh itu, calibre meminta nama pengguna dan kata laluan bila anda cuba guna resepi ini. Kod di dalam calibre.web.feeds.news.BasicNewsRecipe.get_browser() sebenarnya mendaftar masuk ke laman sesawang the NYT. Seusai mendaftar masuk, calibre akan menggunakannya semula untuk dapatkan semua kandungan. Sila rujuk mechanize untuk memahami kod di dalam get_browser.

The next new feature is the calibre.web.feeds.news.BasicNewsRecipe.parse_index() method. Its job is to go to https://www.nytimes.com/pages/todayspaper/index.html and fetch the list of articles that appear in todays paper. While more complex than simply using RSS, the recipe creates an e-book that corresponds very closely to the days paper. parse_index makes heavy use of BeautifulSoup to parse the daily paper webpage. You can also use other, more modern parsers if you dislike BeautifulSoup. calibre comes with lxml and html5lib, which are the recommended parsers. To use them, replace the call to index_to_soup() with the following:

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)

Fitur baharu terakhir ialah kaedah calibre.web.feeds.news.BasicNewsRecipe.preprocess_html(). Ia boleh digunakan untuk melakukan transformasi arbitari pada setiap halaman HTML dimuat turun. Di sini ia digunakan untuk melangkaui iklan yang mana nytimes paparkan sebelum setiap artikel.

Petua untuk membangunkan resepi baharu

Cara terbaik membangunkan resepi baharu adalah dengan penggunaan antaramuka baris perintah. Cipta resepi mengguna penyunting Python kegemaran anda dan simpan ia ke dalam fail seperti resepisaya.recipe. Sambungan .recipe diperlukan. Kemudian anda boleh muat turun kandungan menggunakan resepi dengan perintah:

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

Perintah ebook-convert akan muat turun semua laman sesawang dan simpan ia ke dalam fail EPUB resepisaya.epub. Pilihan -vv menjadikan ebook-convert buang banyak maklumat berkenaan kerjanya. Pilihan --test menyuruh ia muat turun hanya beberapa pasangan artikel paling banyak dari dua suapan. Selain itu, ebook-convert akan masukkan HTML dimuat turun ke direktori debug/input, iaitu debug adalah direktori yang anda nyatakan dalam pilihan ebook-convert --debug-pipeline.

Selepas muat turun selesai, anda boleh lihat HTML dimuat turun dengan membuka fail debug/input/index.html di dalam pelayar. Jika anda puashati dengan muat turun dan pra-pemprosesan yang berlaku sepertimana yang diharapkan, anda boleh jana e-buku dalam format berlainan seperti di bawah:

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

Jika anda puashati dengan resepi anda, dan anda dapati masih terdapat ruang untuk ruang penambahbaikan dalam set resepi terbina-dalam, poskan resepi anda ke forum resepi calibre recipes untuk berkongsi ia dengan lain-lain pengguna calibre.

Note

Pada MacOS, alat baris perintah disediakan dalam berkas calibre, contohnya, jika anda memasang calibre di dalam /Applications alat baris perintah berada di dalam /Applications/calibre.app/Contents/MacOS/.

See also

ebook-convert

Antaramuka baris perintah untuk semua pertukaran format e-buku.

Bacaan lanjutan

Untuk mengetahui lebih lanjut berkenaan penulisan resepi lanjutan dengan menggunakan beberapa fasiliti, yang tersedia dalam BasicNewsRecipe anda perlu ke beberapa sumber berikut:

Dokumentasi API

Dokumentasi kelas BasicNewsRecipe dan semua kaedah dan medan pentingnya.

BasicNewsRecipe

Kod sumber BasicNewsRecipe

Resepi terbina-dalam

Kod sumber untuk resepi terbina-dalam yang disertakan dengan calibre

Forum resepi calibre

Lebih banyak penulis resepi calibre yang berpengetahuan datang ke sini.