# テーマ別いいね全件データ取得 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()