# テーマ別いいね全件データ取得 20220218

 

# Beautifulsoup sleep urllib pandas datetime csv ライブラリインポート

from bs4 import BeautifulSoup

from time import sleep

import urllib

import pandas as pd

import datetime

import csv

 

# Seleniumとwebdriver のインポートと設定

from selenium import webdriver

from selenium.webdriver.common.keys import Keys

from selenium.webdriver.chrome.options import Options

 

#ヘッドレスモードに必要なモジュール

# from selenium.webdriver.chrome.options import Options

# オプションの作成

options = Options()

# Chromeをヘッドレスモードに設定・・・★★★つばきのページはヘッドレスモードでは要素を得られない★★★

# options.add_argument('--headless')

# Cromedriverの設定:コマンドPWDで表示されるパスを設定(現在のパスと同じなら./となる)

# CromedriverはコマンドPWDで表示されるパスのフォルダの中にいれておくこと!!!

path = r'/Users/kabayon/Desktop/Python/chromedriver'

driver = webdriver.Chrome(executable_path=path ,options=options)

 

# CSVへ落とすデータフレームの設定

df=[]

columnlist=['ブログ名','メンバー名','記事タイトル','記事URL','記事日付','評価項目数','いいね','コメント','リブログ','情報取得時刻']

df= pd.DataFrame(columns=columnlist)        

 

# ブログURLリストCSVの読み込み

 

url_in = "./hellomenblog_current_numbers.csv"

# CSVファイルを読み込む

df = pd.read_csv(url_in)

# print(len(df))

# print(df.columns.values)

 

name_blogs = df["name_blog"]

name_themes = df["name_theme"]

kijinums = df["kijinum"]

kijipagestarts = df["kijipagestart"]

kijipageends = df["kijipageend"]

url_heads = df["url_head"]

idhtmls = df["idhtml"]

 

num_themes = len(name_themes)

# print(num_themes)

 

itheme=0

itheme=num_themes

for itheme in range(num_themes):

    # ブログ記事情報リストから1レコード分切り出し

    name_blog = name_blogs[itheme]

    name_theme = name_themes[itheme]

    kijinum = kijinums[itheme]

    kijipagestart = kijipagestarts[itheme]

    kijipageend = kijipageends[itheme]    

    url_head = url_heads[itheme]

    idhtml = idhtmls[itheme]

    

    # メンバー単位で全記事の評価値を書き出すCSVファイルの命名

    name_csvrec = name_blog + "_" + name_theme + ".CSV"

    kiji_evals=[]

    

    for iurl in range(kijipagestart,kijipageend+1):

        if iurl==1:

            url_theme = url_head + idhtml

        else:

            url_theme = url_head +str(iurl)+ idhtml

 

        # print(name_theme,url_theme,kijipagenum)

 

        # 記事url設定

        # url = "https://ameblo.jp/tsubaki-factory/theme-10115236273.html"

        url = url_theme

 

        # getting HTML by UTF-8

        driver.get(url)

        html = driver.page_source.encode('utf-8')

        soup = BeautifulSoup(html, 'html.parser')

 

        # 表示処理のための余裕時間設定

        # ・1秒~3秒設定ではいいね数を読みとれない場合がある

        sleep(5)

        

        # 記事リストのあるクラスの設定

        klistsclass = "skin-borderQuiet"

 

        # 記事リスト部分を抽出:classで検索、その中のすべてのli抽出し、リストklistに格納

        klists=soup.find_all("li",class_=klistsclass)

 

        # 記事リストの記事を一つ抽出し、記事内容を順次抽出

        for klist in klists:

 

            # 記事ごと評価値リストをクリア

            kiji_eval = []

            # 記事ごと評価値リストにブログ名を追加

            kiji_eval.append(name_blog)

            

            # テーマ名と評価値の取得

            kijidls = klist.find_all("dl")

 

            # テーマ名取得

            kijidl = kijidls[1]

            kijidata = kijidl.find("dd")

            # テーマ名取得、評価値リストにテーマ名を追加

            kiji_eval.append(kijidata.text)

 

 

            # 記事名取得(テキスト化のみでOK)

            ktitle = klist.find("h2").text

            # print(ktitle)

            # 評価値リストに記事名を追加

            kiji_eval.append(ktitle)

 

            # 記事URL取得、絶対URLに変換、表示

            kurl = klist.find("h2").find("a").get("href")

            link_url = urllib.parse.urljoin(url,kurl)

            # print(link_url)

            # 評価値リストに記事URLを追加

            kiji_eval.append(link_url)

 

            # 記事年月日取得、表示:pタグで抽出、textのみで表示・・・NEW!はEXCELで削除する。

            ymd = klist.find("p").text

            # print(ymd)

            # 評価値リストに記事年月日を追加

            kiji_eval.append(ymd)

 

            # 記事いいね数、コメント数、リブログ数取得:dlタグ抽出ののち、ddタグで抽出

            kijidls = klist.find_all("dl")

            kijidl = kijidls[0]

            kijidds = kijidl.find_all("dd")

            

            # 評価値項目数を算出

            len_name_evals = len(kijidds)

            # 評価値リストに評価値項目数を追加

            kiji_eval.append(len_name_evals)

 

            # print(len_name_evals)

            # textを順次表示

            for kijidd in kijidds:

                kijidata = kijidd.text

                # print(kijidata)

                kiji_eval.append(kijidata)

            

            # コメント、リブログの情報がない場合の0件記録

            if len_name_evals==2:

                kiji_eval.append("0")

            if len_name_evals==1:

                kiji_eval.append("0")

                kiji_eval.append("0")

            if len_name_evals==0:

                kiji_eval.append("0")

                kiji_eval.append("0")

                kiji_eval.append("0")

 

            

            # 記事情報取得日時を取得、評価値リストに追加

            dt_now = datetime.datetime.now()

            kiji_eval.append(str(dt_now))

            # 記事ページ番号評価値リストに追加

            dt_now = datetime.datetime.now()

            kiji_eval.append(str(iurl))

            

            # 評価値リストをリストに追加格納

            kiji_evals.append(kiji_eval)

            

    num_kiji_evals = len(kiji_evals)

    print(num_kiji_evals)

    

    with open(name_csvrec, 'w', newline='') as csvrec_file:

        writer = csv.writer(csvrec_file)

        ikiji=1

        for ikiji in range(num_kiji_evals):

            # 「評価値リストのリスト」から評価値リストを取り出し、CSVへ1行書き出す

            writer.writerow(kiji_evals[ikiji])

                

# driverを閉じる:Chromeも同時に閉じられる

driver.quit()