やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Pythonニュース取得が遅いので、重複時はHTML取得しないようにした

 RSSから30件のニュースを得て本文を抽出するまで10分近くかかった。20秒/1件。遅すぎる。

成果物

対策

 ない。たぶんURL先から新たなHTMLを取得するところに最も時間がかかっているのだろう。なら、できるだけHTML取得する頻度を下げるしかない。妥協。

重複ニュースを事前に検知する

 HTMLを取得する前に、RSSpublishedurlが同一レコードがDBに存在するか確認する。もしあれば、HTML取得せず、DB挿入対象にもしない。

 if news_db.is_exists(published,url): continueがポイント。

get_news.py

for entry in entries:
    ...
    if news_db.is_exists(published,url): continue
    body = extractor.extract(get_html.get_html(url))
    news_db.append_news(published, url, title, body);
news_db.insert();

mod/NewsDb.py

class NewsDb:
    ...
    def is_exists(self, published, url):
        count = (self.conn.cursor().execute(
            'select count(*) from news where published=? and url=?;'
            ,(published, url)).fetchone()[0])
        return False if 0 == count else True
    ...

結果

 重複が0件のときは4秒くらいで終わるようになった。劇的。というか、これは論理的にみて当然。

問題

 重複しないところは以前として遅い。むしろ、それこそが問題の本質。

 サーバ負荷を考慮してURLごとに1秒待機させているが、それにしても20秒/1件は遅すぎる。待機時間いらないだろ。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux