import%20marimo%0A%0A__generated_with%20%3D%20%220.23.16%22%0Aapp%20%3D%20marimo.App(width%3D%22full%22)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20pandas%20as%20pd%0A%20%20%20%20import%20plotly.express%20as%20px%0A%0A%20%20%20%20from%20marimo_sandbox.scraper%20import%20GoogleNewsScraper%2C%20save_news_to_file%0A%0A%20%20%20%20return%20GoogleNewsScraper%2C%20mo%2C%20pd%2C%20px%2C%20save_news_to_file%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5%E3%83%9C%E3%83%BC%E3%83%89%0A%0A%20%20%20%20Google%20News%20RSS%20%E3%81%8B%E3%82%89%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9%E3%82%92%E5%8F%96%E5%BE%97%E3%81%97%E3%80%81%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%A8%E3%82%B0%E3%83%A9%E3%83%95%E3%81%A7%E5%8F%AF%E8%A6%96%E5%8C%96%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%201.%20%E5%9B%BD%E3%83%BB%E8%A8%80%E8%AA%9E%E3%83%BB%E4%BB%B6%E6%95%B0%E3%82%92%E9%81%B8%E6%8A%9E%0A%20%20%20%202.%20%E3%80%8C%E5%8F%96%E5%BE%97%E3%80%8D%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%0A%20%20%20%203.%20%E7%B5%90%E6%9E%9C%E3%81%AF%20%60mo.ui.table%60%20%E3%81%A7%E7%A2%BA%E8%AA%8D%E3%80%81%E3%82%BD%E3%83%BC%E3%82%B9%E5%88%A5%E4%BB%B6%E6%95%B0%E3%81%AA%E3%81%A9%E3%82%92%E3%82%B0%E3%83%A9%E3%83%95%E5%8C%96%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%201.%20%E5%8F%96%E5%BE%97%E6%9D%A1%E4%BB%B6%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20country%20%3D%20mo.ui.dropdown(%0A%20%20%20%20%20%20%20%20options%3D%5B%22JP%22%2C%20%22US%22%2C%20%22GB%22%2C%20%22KR%22%2C%20%22FR%22%5D%2C%0A%20%20%20%20%20%20%20%20value%3D%22JP%22%2C%0A%20%20%20%20%20%20%20%20label%3D%22%E5%9B%BD%22%2C%0A%20%20%20%20)%0A%20%20%20%20language%20%3D%20mo.ui.dropdown(%0A%20%20%20%20%20%20%20%20options%3D%5B%22ja%22%2C%20%22en%22%5D%2C%0A%20%20%20%20%20%20%20%20value%3D%22ja%22%2C%0A%20%20%20%20%20%20%20%20label%3D%22%E8%A8%80%E8%AA%9E%22%2C%0A%20%20%20%20)%0A%20%20%20%20max_results%20%3D%20mo.ui.slider(%0A%20%20%20%20%20%20%20%205%2C%2030%2C%20value%3D15%2C%20label%3D%22%E5%8F%96%E5%BE%97%E4%BB%B6%E6%95%B0%22%0A%20%20%20%20)%0A%20%20%20%20fetch_button%20%3D%20mo.ui.run_button(label%3D%22%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9%E5%8F%96%E5%BE%97%22)%0A%20%20%20%20return%20country%2C%20fetch_button%2C%20language%2C%20max_results%0A%0A%0A%40app.cell%0Adef%20_(country%2C%20fetch_button%2C%20language%2C%20max_results%2C%20mo)%3A%0A%20%20%20%20mo.hstack(%5Bcountry%2C%20language%2C%20max_results%2C%20fetch_button%5D)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%202.%20%E5%8F%96%E5%BE%97%E7%B5%90%E6%9E%9C%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(GoogleNewsScraper%2C%20country%2C%20fetch_button%2C%20language%2C%20max_results%2C%20mo%2C%20pd)%3A%0A%20%20%20%20if%20fetch_button.value%3A%0A%20%20%20%20%20%20%20%20scraper%20%3D%20GoogleNewsScraper()%0A%20%20%20%20%20%20%20%20news_list%20%3D%20scraper.get_news(%0A%20%20%20%20%20%20%20%20%20%20%20%20country%3Dcountry.value%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20language%3Dlanguage.value%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20max_results%3Dmax_results.value%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20if%20not%20news_list%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22_%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9%E3%82%92%E5%8F%96%E5%BE%97%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%81%A7%E3%81%97%E3%81%9F%E3%80%82%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E6%8E%A5%E7%B6%9A%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82_%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20news_df%20%3D%20pd.DataFrame(news_list)%0A%20%20%20%20%20%20%20%20news_df%5B%22published_date%22%5D%20%3D%20pd.to_datetime(%0A%20%20%20%20%20%20%20%20%20%20%20%20news_df%5B%22published_date%22%5D%2C%20utc%3DTrue%2C%20errors%3D%22coerce%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20news_df%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%20%20%20%20columns%3D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22title%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22link%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22published_date%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22source%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22description%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20mo.md(%22_%E3%80%8C%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9%E5%8F%96%E5%BE%97%E3%80%8D%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82_%22)%0A%20%20%20%20return%20(news_df%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20%E8%A8%98%E4%BA%8B%E4%B8%80%E8%A6%A7%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20news_df)%3A%0A%20%20%20%20display_df%20%3D%20news_df%5B%5B%22title%22%2C%20%22source%22%2C%20%22published_date%22%5D%5D.copy()%0A%20%20%20%20display_df%5B%22title%22%5D%20%3D%20display_df%5B%22title%22%5D.str%5B%3A60%5D%0A%20%20%20%20if%20not%20display_df.empty%3A%0A%20%20%20%20%20%20%20%20mo.ui.table(%0A%20%20%20%20%20%20%20%20%20%20%20%20display_df%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20label%3D%22%E8%A8%98%E4%BA%8B%E4%B8%80%E8%A6%A7%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20selection%3DNone%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20%E3%82%BD%E3%83%BC%E3%82%B9%E5%88%A5%E4%BB%B6%E6%95%B0%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20news_df%2C%20px)%3A%0A%20%20%20%20if%20not%20news_df.empty%3A%0A%20%20%20%20%20%20%20%20source_counts%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20news_df.groupby(%22source%22).size().reset_index(name%3D%22count%22)%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20fig%20%3D%20px.bar(%0A%20%20%20%20%20%20%20%20%20%20%20%20source_counts%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3D%22source%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3D%22count%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20labels%3D%7B%22source%22%3A%20%22%E3%83%A1%E3%83%87%E3%82%A3%E3%82%A2%22%2C%20%22count%22%3A%20%22%E4%BB%B6%E6%95%B0%22%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20title%3D%22%E3%82%BD%E3%83%BC%E3%82%B9%E5%88%A5%E3%81%AE%E8%A8%98%E4%BA%8B%E6%95%B0%22%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20fig.update_layout(template%3D%22plotly_white%22)%0A%20%20%20%20%20%20%20%20fig%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20mo.md(%22_%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20%E5%85%AC%E9%96%8B%E6%99%82%E5%88%BB%E3%81%AE%E6%8E%A8%E7%A7%BB%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20news_df%2C%20px)%3A%0A%20%20%20%20if%20not%20news_df.empty%20and%20news_df%5B%22published_date%22%5D.notna().any()%3A%0A%20%20%20%20%20%20%20%20time_counts%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20news_df.dropna(subset%3D%5B%22published_date%22%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20.set_index(%22published_date%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20.resample(%221h%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20.size()%0A%20%20%20%20%20%20%20%20%20%20%20%20.reset_index(name%3D%22count%22)%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20fig2%20%3D%20px.line(%0A%20%20%20%20%20%20%20%20%20%20%20%20time_counts%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20x%3D%22published_date%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3D%22count%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20labels%3D%7B%22published_date%22%3A%20%22%E5%85%AC%E9%96%8B%E6%97%A5%E6%99%82%22%2C%20%22count%22%3A%20%22%E4%BB%B6%E6%95%B0%22%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20title%3D%22%E5%85%AC%E9%96%8B%E6%99%82%E5%88%BB%E3%81%94%E3%81%A8%E3%81%AE%E8%A8%98%E4%BA%8B%E6%95%B0%22%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20fig2.update_layout(template%3D%22plotly_white%22)%0A%20%20%20%20%20%20%20%20fig2%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20mo.md(%22_%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20%E4%BF%9D%E5%AD%98%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20save_button%20%3D%20mo.ui.run_button(label%3D%22JSON%20%E3%81%AB%E4%BF%9D%E5%AD%98%22)%0A%20%20%20%20return%20(save_button%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo%2C%20news_df%2C%20save_button%2C%20save_news_to_file)%3A%0A%20%20%20%20if%20save_button.value%20and%20not%20news_df.empty%3A%0A%20%20%20%20%20%20%20%20path%20%3D%20save_news_to_file(%0A%20%20%20%20%20%20%20%20%20%20%20%20news_df.to_dict(orient%3D%22records%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22news_latest.json%22%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20mo.md(f%22%E4%BF%9D%E5%AD%98%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%3A%20%60%7Bpath%7D%60%22)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
aa54ff53fb3d67a2fcbea4a21f10392c