#author("2024-02-29T01:10:14+00:00","","")
#author("2025-02-26T03:20:08+01:00","","")
[[由利恵]]
#清水さん,滝沢さん,中市さん
*目次 [#q6f8e430]
#CONTENTS
*スクレイピング用準備 [#o2ab7bca]
**Mecab [#t59de1a2]

必要なモジュールをインストールする必要がある~

・mecab~
  言語を分析するモジュール~
・unidic-lite~
  日本語の辞書~
・mecab(exe)~

3つ目以外は~

 pip install mecab

と入れる~

mecab(exe)は[[Mecabダウンロード:https://github.com/ikegami-yukino/mecab/releases/tag/v0.996]]のexeファイルをダウンロード~

ダウンロードしたものは~

 C:\Program Files

に収納されているはず~

また、新規でMecab.exeがあるパスを追加する。~
 C:\Program Files\MeCab\bin\
#ref(n21.png,,30%)

**NEologd [#d5eee5c5]

Mecabには古い辞書しか入っていないため、NEologdというものを入れる必要がある~

#ref(NEologd.zip)
#ref(neologd.zip)

↑をダウンロードして解凍する

neologdの中身のmecab-ipadic-neologdを~

 C:\Program Files\MeCab\dic~

にコピーをする~

・ipadic(もとからある)
・mecab-ipadic-neologd(コピーしてきた)

もののほかに~

①ipadic-UTF-8~
  ipadicの中身をすべてコピーした物~
②neologd~
  中身は空~

のフォルダを作成する~

**実際に行ってみる [#hfce4950]
コマンドプロンプトで~
 mecab
と入力→対話型シェルに入る~

 形態素解析
と入力→Enterを押すと下記の画像のようになる~
#ref(n26.png,,70%)

***文字化けした場合 [#d1c7c720]
 chcp 65001
をコマンドプロンプトに入力した後実行してみる~

*Jupyter [#gd52a58c]
**pythonからJupyterインストール [#z26b958f]
コマンドプロントから~
①pythonのバージョン確認~
 python -V
②Jupyterをインストール~
 pip install jupyter environment_kernels~
③新規でpip.exeがあるパスを追加する(もう追加されていたら飛ばす)~
pip.exeのあるフォルダを探す~
 C:\Users\tc22m064\AppData\Local\Programs\Python\Python39\Scripts\
#ref(n21.png,,30%)~

④Jupyterを起動~
 jupyter-notebook
#ref(n22.png,,30%)~

**実際に行ってみる [#wef83fdc]
pythonでmecabを試す~
 import sys
 import MeCab
 m = MeCab.Tagger ("-Ochasen")
 print(m.parse ("東京特許許可局"))
上の4行を先ほど立ち上げたjupyterで実行する~
#ref(n23.png,,30%)
#ref(n24.png,,30%)
#ref(n25.png,,40%)


*教育支援・教材提示 [#kcf669ec]

**初めに[#h8e98998]

#ref(軽量化三.7z)

ファイルを開き、app.pyを実行させる~
その際に必要となるモジュールを順次入れる~

もし、[[MeCab:https://github.com/ikegami-yukino/mecab/releases/tag/v0.996]]というものが入っていなければ、インストールさせる~

今回入れたのは

 mecab-0.996-64.exe

を入れ、もう1度app.pyを実行させる~

#ref(n1.png,,50%)

が出てきたら

#ref(n2.png,,50%)

をコピペしてGoogleなどに貼り付けて検索をかける~

**新規登録・ログイン [#r89f7c64]
まず、新規登録を行った

#ref(n3.png,,50%)

今回は~

新しいユーザー名:123~
新しいパスワード:1234~
名前:123~

として登録を行った~

登録されたユーザーは軽量化三フォルダの中のusers.csvの中に記入されている

#ref(n6.png,,50%)

**ログイン後[#xb8acee7]

ログイン後以下のような画面に切り替わる~

#ref(n4.png,,30%)
#ref(n5.png,,30%)

**週間勉強予定時間 [#k0987feb]

画像のように曜日・時間の部分をクリックすると緑に変わる~

緑に変わったら右側にある「各曜日の合計時間」にも連携されている~

合計時間を保存を押す~

#ref(n12.png,,30%)

下の画像のようなものが表示されたら更新されたことになる~
「合計時間を保存」を1回押して表示されなければもう1度押してください

#ref(n13.png,,50%)

study.csvに保存されている~
#ref(n7.png,,50%)

**カレンダー [#n4cd57e6]

以下の事を行う~

①予定追加(本日よりも後ろの日付)~
②名前変更(しなくてもよい)~
③書き込み~

#ref(n8.png,,50%)

③を行ったら軽量化三のuserdataフォルダの中の123.csvに保存されている~
Titleが文字化けしちゃった場合はメモ帳で開くと見れます

#ref(n9.png)


**理解度チェック[#uaa8eeae]

・小学生理解度チェックへ~
・中学生理解度チェックへ~
・高校生理解度チェックへ~
のどれかを選択~

今回は小学生理解度チェックを選択した。

#ref(n10.png,,30%)

各科目の単元ごとに分かれている。

・未~
・落単~
・C~
・B~
・A~
・S~

の6種類と、□(チェックボックス)がある~
テスト範囲の単元の場合は□(チェックボックス)をチェックする

小学生算数で実践してみる

#ref(n11.png,,30%)

画面下部にある「更新する」を押すと一旦ログアウトになる~

subjectフォルダの中にある

**スケジュール日程作成 [#d94856c8]

カレンダーに書き込んだスケジュールの日程までに日割りで行う単元が記載されている~

#ref(n14.png,,30%)

単元を押すと教材ページに飛ぶようになっている~

#ref(n15.png,,40%)

**系統図グラフ作成 [#g7eb1294]

#ref(n16.png,,30%)

プルダウンで理解度チェックを行ったものを選択する~

#ref(n17.png,,40%)

・★~
  クリティカルパス~
  (プロジェクトを進めていくうえでスケジュールに影響が出る作業経路)~
・大きい●~
  テスト範囲~
・●~
  単元~

の3種類がある~

#ref(n18.png,,30%)

★や●などの単元を押すと~

#ref(n15.png,,40%)

教材ページに飛べる~

**教材ページ [#k0383722]

#ref(n19.png,,30%)~

#ref(n20.png,,50%)

①評価スコア~
②レビュー本文~
③評価ボタン~

を行うことにより信頼性スコアが変わる~

**プログラム [#l866fe49]

 import time
from pandas.core.frame import DataFrame                                 
from selenium import webdriver             
import chromedriver_binary 
from googleapiclient.discovery import build
import pandas as pd
import os

# 作成したcsvファイルを入れる用のディレクトリの作成
path = './Kyouzai'
os.makedirs(path, exist_ok=True)

# ChromeDriverのパスを新しいものに更新
chromedriver_path = 'C:/Users/tc22m064/Desktop/引継ぎ/(中市さん)/課題①/スクレイピング/chromedriver.exe'
driver = webdriver.Chrome(executable_path=chromedriver_path)  # Chromeのパスを指定する

# utf-8-sigエンコーディングを指定してCSVファイルを読み込む
sub_title = pd.read_csv("KeyWord.csv", encoding="utf-8-sig", header=None)
# 1列目のものをsub_listに追加する(授業タイトル)
sub_list = sub_title.iloc[:, 0]

url_num = 10  # 一つの単語につき何個のwebページを出すか

# HPのタイトルとURL用のリストを15個作成する
hp_title = [[] for _ in range(len(sub_list))]
hp_url = [[] for _ in range(len(sub_list))]


####################### webページを検索 #######################
 for j in range(len(sub_list)):
    driver = webdriver.Chrome()                  #Chromeのパスを指定する
    driver.get("https://www.google.com/")        #Chromeの検索画面を取得する
    
    
    search_box = driver.find_element_by_name('q')    # HTML内で検索ボックス(name='q')を指定する
    search_box.send_keys(str(sub_list[j])+" "+"解説")            # 検索ボックスに検索ワードを送信する
    #print(sub_list[j])
    search_box.submit()                              # 検索を実行する
    time.sleep(10)                                    # 5秒間待機する
    
    def ranking(driver):
        i = 1 #ループ番号,ページ番号を定義する
        i_max = 3 #何ページまで検索するかを定義
        title_list = [] #タイトル用のリストを作成
        link_list = []  #URL用のリストを作成
        title_kouho = []
        link_kouho = []
        
        #現在のページが指定した最大分析ページを超えるまでループする(j_max)
        while i <= i_max:
            #タイトルとリンクはclass="yuRUbf"に格納されている
            class_group = driver.find_elements_by_class_name('yuRUbf')
            print('yuRUbf')
            
            # class="yuRUbf" からタイトルとリンクを抽出し,リストに追加するループ
            for elem in class_group:
                #タイトルは class="LC201b" に格納されている
                #タイトルは class = h3 に格納されている
                title = elem.find_element_by_tag_name('h3').text
                #リンクは aタグの href に格納されている
                link = elem.find_element_by_tag_name('a').get_attribute('href')
                
                if '動画' not in title and '画像' not in title and '説明' not in title:
                    # link に通販サイトのやつらを入らないようにする(アマゾンとか)← 今後追加していく
                    if 'youtube' not in link and 'yodobashi' not in link and 'amazon' not in link:
                        if title != '':
                            #print(link)
                            title_list.append(title)
                            link_list.append(link)
                
             #「次へ」のボタンはひとつしかないがあえてelementsで複数検索. 空のリストであれば最終ページという意味.
            if driver.find_elements_by_id("pnnext") == []:
                i = i_max + 1   # 次のページがなければ,最大ページ数を強制的に越してループ終了
            else:
                # 次ページのURLはid="pnnext"のhref属性
                next_page = driver.find_element_by_id("pnnext").get_attribute("href")
                #  次ページへ遷移する
                driver.get(next_page)
                i = i + 1       # ページを進む
                time.sleep(3)   # 3秒休憩, これを指定の最大ページ数まで繰り返す
        return title_list, link_list 

    #上記で定義したranking()関数を実行する
    title, link = ranking(driver)
    #print(title)

    
    
    print(len(title))
    for i in range(min(url_num, len(title))):
        hp_title[j].append(title[i])
        hp_url[j].append(link[i])


    #print(hp_url[j])

    driver.quit()

    #print(hp_title[j])

 #cledibility_score

 for j in range(len(sub_list)):
    df = pd.DataFrame({'HPtitle':hp_title[j],'HPurl':hp_url[j]})
    df.to_csv(f'./Kyouzai/website_{j}.csv',index=None,encoding='utf-8-sig')

 が実行で通るように編集中

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS