O'Reilly(オライリー)の人気ランキングをスクレイピングしてみた

· ☕ 3
🏷️
  • #Python
  • 転職ドラフトの友達紹介の特典で好きなオライリー本がもらえるっていうから、何をもらおうか考えたんですが、オライリーって山ほど出版しているから、何をもらえばいいかわからなくて、各種ランキングをまとめることにした

    で、その中のオライリー公式の売上ランキングを公式サイトからスクレイピングしてきた話。

    なんでわざわざスクリプトで取得?

    なんでわざわざスクレイピングしたかというと、ランキングがこんな感じで出てるんです。

    オライリー人気ランキング

    店舗別、時期別。

    これだと、全部見るの面倒…

    で、半月周期の店舗の集計じゃ、新刊有利説…

    できたら、少し古くても、ロングセラーの良書であればランクインさせたい!

    …ってことで、過去5年分くらいのランキングを全部取得して、出現回数の多い本は人気の本。とすることにしました。

    取得スクリプト

    ちょっと色々と改善の余地はありますが…

    もう一回使うことになったら、その時もう少し改善しますー

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    
    import requests
    from bs4 import BeautifulSoup
    import time
    import json
    
    if __name__ == '__main__':
        href_list = []
     
        for i in range(30):
            idx = i + 1
            if idx == 1:
                idx = ''
            url = f'https://www.oreilly.co.jp/sales/category/ranking{idx}.html'
            r = requests.get(url)
            content_type_encoding = r.encoding if r.encoding != 'ISO-8859-1' else None
            soup = BeautifulSoup(r.content, 'html.parser', from_encoding=content_type_encoding)
            
            ul_list = soup.find_all("ul", class_="simple")
            a_list = []
            [a_list.extend(x.find_all("a")) for x in ul_list]
    
            [href_list.append({"string":x.string,"link":x.get("href").replace("http://","").replace("https://","")}) for x in a_list]
    
            time.sleep(3)
        
        [x.update({"count":list(map(lambda x:x["link"],href_list)).count(x["link"])}) for x in href_list]    
        href_list = list(map(lambda x:json.loads(x),set(map(lambda y:json.dumps(y),href_list))))
        list.sort(href_list, key=lambda x: x["count"], reverse=True)
        print(href_list)
    
        with open('output.json', 'w') as f:
            json.dump(href_list, f, ensure_ascii=False, indent=4)
    

    アウトプット

    リンクにはブレがないんですが、タイトルにはブレがあるので、同じ本が複数出てます…。

    ただ、カウント自体は、リンクでしているので、ランキング自体に問題はないですー

    その辺を綺麗にして、アマゾンのリンク取ってきてくれるようにしたいなぁ

    [
        {
            "string": "リ-ダブルコ-ド",
            "link": "www.oreilly.co.jp/books/9784873115658/",
            "count": 129
        },
        {
            "string": "リーダブルコード",
            "link": "www.oreilly.co.jp/books/9784873115658/",
            "count": 129
        },
        {
            "string": "ゼロから作るDeep Learning",
            "link": "www.oreilly.co.jp/books/9784873117584/",
            "count": 90
        },
        {
            "string": "入門 Python 3",
            "link": "www.oreilly.co.jp/books/9784873117386/",
            "count": 77
        },
        {
            "string": "入門Python 3",
            "link": "www.oreilly.co.jp/books/9784873117386/",
            "count": 77
        },
        {
            "string": "入門Python3",
            "link": "www.oreilly.co.jp/books/9784873117386/",
            "count": 77
        },
        {
            "string": "退屈なことはPythonにやらせよう",
            "link": "www.oreilly.co.jp/books/9784873117782/",
            "count": 58
        },
        {
            "string": "ゼロから作るDeep Learning ②",
            "link": "www.oreilly.co.jp/books/9784873118369/",
            "count": 34
        },
        {
            "string": "ゼロから作るDeep Learning ❷",
            "link": "www.oreilly.co.jp/books/9784873118369/",
            "count": 34
        },
        {
            "string": "ゼロから作るDeep Learning❷",
            "link": "www.oreilly.co.jp/books/9784873118369/",
            "count": 34
        },
        {
            "string": "ゼロから作るDeepLearning 2",
            "link": "www.oreilly.co.jp/books/9784873118369/",
            "count": 34
        },
        {
            "string": "Pythonではじめる機械学習 ",
            "link": "www.oreilly.co.jp/books/9784873117980/",
            "count": 33
        },
        {
            "string": "Pythonではじめる機械学習",
            "link": "www.oreilly.co.jp/books/9784873117980/",
            "count": 33
        },
        {
            "string": "Web API: The Good Parts",
            "link": "www.oreilly.co.jp/books/9784873116860/",
            "count": 31
        },
        {
            "string": "Web API:The Good Parts",
            "link": "www.oreilly.co.jp/books/9784873116860/",
            "count": 31
        },
        {
            "string": "Web API:The Good Parts",
            "link": "www.oreilly.co.jp/books/9784873116860/",
            "count": 31
        },
        {
            "string": "Web API:The Good Parts",
            "link": "www.oreilly.co.jp/books/9784873116860/",
            "count": 31
        },
        {
            "string": "Pythonチュートリアル 第3版",
            "link": "www.oreilly.co.jp/books/9784873117539/",
            "count": 26
        },
        {
            "string": "Pythonチュートリアル 第3版",
            "link": "www.oreilly.co.jp/books/9784873117539/",
            "count": 26
        },
        {
            "string": "Pythonチュートリアル(第3版)",
            "link": "www.oreilly.co.jp/books/9784873117539/",
            "count": 26
        },
        {
            "string": "エンジニアのためのマネジメントキャリアパス",
            "link": "www.oreilly.co.jp/books/9784873118482/",
            "count": 26
        },
        {
            "string": "Pythonチュ-トリアル 第3版",
            "link": "www.oreilly.co.jp/books/9784873117539/",
            "count": 26
        },
        {
            "string": "マイクロサービスアーキテクチャ",
            "link": "www.oreilly.co.jp/books/9784873117607/",
            "count": 22
        },
        {
            "string": "Pythonによるデータ分析入門",
            "link": "www.oreilly.co.jp/books/9784873116556/",
            "count": 19
        },
        {
            "string": "Pythonによるデ-タ分析入門",
            "link": "www.oreilly.co.jp/books/9784873116556/",
            "count": 19
        },
        {
            "string": "Pythonからはじめる数学入門",
            "link": "www.oreilly.co.jp/books/9784873117683/",
            "count": 18
        },
    ~略~
    

    るな
    るな
    エンジニア