🍲
ZENNの”投稿”経験を良くしよう! 第1回 ビューティフル スープで必要なデータを集める。
まえがき
記事を投稿していてどんな記事にいいねがつくのか?知りたい。
投稿する時に トピックを設定するのがめんどくさい。
なので、記事等からいいね数やトピックを予測する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