🍲

ZENNの”投稿”経験を良くしよう! 第1回 ビューティフル スープで必要なデータを集める。

2024/09/02に公開

まえがき

記事を投稿していてどんな記事にいいねがつくのか?知りたい。
投稿する時に トピックを設定するのがめんどくさい。
なので、記事等からいいね数やトピックを予測するAIを作ろうと思います。
できたらトピック設定をseleniumで自動化もしたい。
とか思ってググったら、LLMで追加学習なしで、回帰分析ができる論文見つけたので、それも書く。
まずはざっくり作って、精度あげるための細かい追加は、後の回に追加で記載していく。
この内容でシリーズで書いていこう思います。

対象読者

  • ビューティフル スープやセレニウムでデータの収集や自動化をしたい人
  • ネット上のデータでAIを作りたい人
  • LLMの回帰分析力を知りたい人

第1回 ビューティフル スープで必要なデータを集める。

作るもの

記事等からいいね数やトピックを予測するAIを作るためのデータとして、最新記事からタイトル、いいね数、トピック、本文をいいねが1以上ある記事を持ってきてCSVにするプログラムを作る

まずはビューティフル スープに慣れる

慣れるために、"課題解決にAIも考えてみよう!(祝500ビュー!)"の記事にアクセスして トピックの一覧を取るプログラムを作った。

import pprint
from bs4 import BeautifulSoup    
import requests

# 変数urlに、"課題解決にAIも考えてみよう!(祝500ビュー!)"の記事のURLを入れる
url = 'https://zenn.dev/personal/articles/d5507acead3a4c'
d_list = []
# urlへのアクセス結果を、変数rに格納
r = requests.get(url)
article_soup = BeautifulSoup(r.text, 'html.parser')
#自分が調べた時はView_topicName____nYpがクラス名だった。 ここは変わるかも?
topics = article_soup.find_all('div',class_='View_topicName____nYp')
topicsList = ','.join([line.text for line in topics])
d = {
    'topics': topicsList,
}
d_list.append(d)
d_list

では本番!必要なデータを持ってきてCSVにするプログラムを作る!

最新記事~5つ前の記事はスキップして、そこから3記事の一覧にアクセスして、その中でいいねが一つ以上あるページもさらにアクセスして、タイトル、いいね数、トピック一覧、本文(ここ少しいい加減かも)を取って、dataforAI.csvにutf-8で保存するプログラム。
いいね数は、投稿時期で加減したほうが良さそうだがここではしていない。
他の記事を試す場合やこの投稿から時間が経っている場合は、html構造が変わって、クラス名等は変わっている場合は、都度htmlを確認する必要あり!

from bs4 import BeautifulSoup
import requests
import pandas as pd
from time import sleep
# 変数urlに、Zenn新着ページのURLを入れる
url = 'https://zenn.dev/articles?page={}'
base_url = 'https://zenn.dev'
# 変数d_listに空のリストを作成する
d_list = []
#ページ番号i  5ページまでスキップする(記事が新しすぎるか?と思ったので)
i=5
while True:
    i +=1
    # アクセスするためのURLをtarget_urlに格納する
    target_url = url.format(i)
    if i > 8 :
        break
    # target_urlへのアクセス結果を、変数rに格納
    r = requests.get(target_url)
    if r.status_code == 200:
        print('d_listの大きさ:', len(d_list))
        # print()してtarget_urlを確認する
        print(target_url)

        # 取得結果を解析してsoupに格納
        soup = BeautifulSoup(r.text)
        # ArticleList_content__a7csXクラスを持ったdivタグをすべて取得して、変数contentsに格納
        contents = soup.find_all('div', class_='ArticleList_content__a7csX')
        #1秒ウェイトを入れる
        sleep(1)
        for content in contents:
            link_element = content.find('a', class_='ArticleList_link__4Igs4')
            title_element = content.find('h2', class_='ArticleList_title__mmSkv')
            like_element = content.find('span', class_='ArticleList_like__7aNZE')
            if title_element and like_element and link_element:
                title = title_element.text
                score = like_element.text.strip()
                link = link_element['href'] if link_element else 'No link'
                full_link = base_url + link
                # 各記事ページにアクセス
                article_r = requests.get(full_link)
                article_soup = BeautifulSoup(article_r.text, 'html.parser')
                # 'code-line'クラスを持つ要素を抽出
                code_lines = article_soup.find_all(class_='code-line')
                statement = '\n'.join([line.text for line in code_lines])
                topics = article_soup.find_all('div',class_='View_topicName____nYp')
                topicsList = ','.join([line.text for line in topics])
                d = {
                    'title': title,
                    'iine_number': score,
                    'topics': topicsList,
                    'statement': statement
                }
                d_list.append(d)
    else:
        break
# 変数d_listを使って、データフレームを作成する
df = pd.DataFrame(d_list)
# to_csv()を使って、データフレームをCSV出力する
df.to_csv('dataforAI.csv', index=None, encoding='utf-8')

次回以降(書いたら追加)

第2回 記事等からトピック一覧を予測するAIを作る!  (書いたらリンクにします)

あとがき

  • 記事よかったら、いいね! または フォローしてくれたら嬉しい!

Discussion