2018/11/25
タグクラウドを設置する
ブログでよく見かける「タグクラウド」を設置しました。
記事ごとにユーザタグを入力して、ブログ再登録を繰り返しました。

ユーザタグを入力し終えた後に、「プラグインの設定」を選択し、




2018/11/25
2018/11/22
import pandas as pd5行目でDataFrameとして読み込んだresult.csvは4つの項目列(ニックネーム/ホスト名,都道府県,アクセス数,グラフ)があります。第1項目のデータは文字が途中で切れているものもあり(画像上では隠しています)、不完全であることが分かりました。こんな感じです。
import numpy as np
# file load
df = pd.read_csv('result.csv', sep=',')
# information pickup
host_data = []
pref_data = []
access_count = []
for i in range(0, len(df.index)):
str_temp = df.iloc[i,0]
#print(str_temp)
start_position = int((str_temp).find('(')) + 1
end_position = int((str_temp).find(')')) + 1
host_data.append(str_temp[start_position:end_position-1])
#print(x_str[i])
pref_data.append(df.iloc[i,1])
access_count.append(df.iloc[i,2])
res_data = np.vstack([host_data, pref_data, access_count])
df1 = pd.DataFrame(data=res_data).T
df1.to_csv('access_list1.csv', header=False, index=False)
# Calculation1
host_sum = df1[0].value_counts()
count_total = sum(host_sum)
access_count_res = []
access_count_res_percentage = []
for i in range(0, len(host_sum)):
data_temp = df1[df1[0]==host_sum.index[i]]
count_temp = 0
for j in range(0, len(data_temp)):
count_temp = count_temp + int(data_temp.iloc[j,2])
access_count_res.append(count_temp)
access_count_res_percentage.append(round(count_temp/count_total*100,2))
res_data = np.vstack([host_sum.index, access_count_res, access_count_res_percentage])
df2 = pd.DataFrame(data=res_data).T
df2.to_csv('access_list2.csv', header=False, index=False)
# Calculation2
host_pref = df1[1].value_counts()
count_host_pref_total = sum(host_pref)
res_data1 = np.vstack([host_pref.index, host_pref, round(host_pref/count_host_pref_total*100, 2)]).T
df3 = pd.DataFrame(data=res_data1)
df3.to_csv('access_list3.csv', header=False, index=False)
2018/11/22
from selenium import webdriver26行目までは前回と同じ流れで、それ以降が今回追加したコードです。26行目のss1.pngはログインして入った「管理ページ」で、
from selenium.webdriver.firefox.options import Options
from bs4 import BeautifulSoup
import time
import csv
options = Options()
options.set_headless()
driver = webdriver.Firefox(options=options)
username = "Your username"
password = "Your Password"
# Login Page
driver.get('https://fc2.com/ja/login.php?ref=blog')
login_username = driver.find_element_by_id("id")
login_username.clear()
login_username.send_keys(username)
login_password = driver.find_element_by_id("pass")
login_password.clear()
login_password.send_keys(password)
login_password.submit()
time.sleep(3)
driver.save_screenshot("ss1.png")
# Ranking Page
driver.get('https://id.fc2.com/?mode=login&done=analyzer')
time.sleep(3)
driver.save_screenshot("ss2.png")
monthdata = 11 # November
for daydata in range(1, 16): # 11/1 - 11/15
url='https://analysis.fc2.com/index.php?lim=500&mode=admin&func=host_ranking&year=2018&month=' + str(monthdata) + '&date=' +str(daydata) + '&hrg=0'
driver.get(url)
time.sleep(2)
driver.save_screenshot((str(monthdata) + "_" + str(daydata) + ".png"))
time.sleep(2)
html = driver.page_source
# BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
tables = soup.find_all("table")
print(str(len(tables)))
#print(str(tables[3]))
rows = tables[3].findAll("tr")
#print(len(rows))
# CSV file output
csvFile = open("result.csv", 'a', newline = '', encoding = 'utf-8')
writer = csv.writer(csvFile)
try:
for row in rows:
csvRow = []
for cell in row.findAll(['td', 'th']):
str_temp = ''.join((cell.get_text()).split())
csvRow.append(str_temp)
writer.writerow(csvRow)
finally:
csvFile.close()
driver.quit()
2018/11/11
sudo apt-get -y install firefox-esrインストール後に、前回作成したプログラムを実行させましたが、うまく動きません。試行錯誤しているなかで、FirefoxではなくChromiumならうまく行くとの記事を見つけたので、プログラムをChromium版に修正しました。同時に、chromedriverもインストールしたのですが、古いネット記事を参考にしたため、またもや動かずに大変難儀しました。結局、最新版のchromium-browserをインストールすることで問題が解決しました。
pip3 install selenium
pip3 install beautifulsoup4
sudo apt-get install chromium-browser
import sys前回から変更した箇所は、以下の通りです。
sys.path.append('/home/pi/.local/lib/python3.5/site-packages/')
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time
import csv
options = Options()
options = webdriver.ChromeOptions()
options.add_argument("--headless")
#options.add_argument("--no-sandbox")
driver = webdriver.Chrome(executable_path='/usr/lib/chromium-browser/chromedriver', chrome_options=options)
username = "Your username"
password = "Your password"
# Login Page
driver.get('https://fc2.com/ja/login.php?ref=blog')
login_username = driver.find_element_by_id("id")
login_username.clear()
login_username.send_keys(username)
login_password = driver.find_element_by_id("pass")
login_password.clear()
login_password.send_keys(password)
login_password.submit()
time.sleep(5)
# Ranking Page
driver.get('https://admin.blog.fc2.com/control.php?mode=ranking&sidemenu')
time.sleep(3)
html = driver.page_source
driver.quit()
# BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
exdate = soup.find('div',{'class': 'rank_day'}) #date
exdate_out_position = int((exdate.string).find(':')) + 1
exdate_out = (exdate.string)[exdate_out_position:(exdate_out_position+10)]
exword = soup.find_all('td',attrs={'class': 'rank_number_td'})
exword_out = [[0 for i in range(2)] for j in range(2)]
for i in range(0, len(exword)):
exword_rn = exword[i].find('span',{'class': 'rank_number'}).extract()
exword_rp = exword[i].find('span',{'class': 'rank_people'}).extract()
exword_out[i][0] = str(exword_rn.get_text())
exword_out[i][1] = str(exword_rp.get_text())
with open('/home/pi/blog_ranking_data.csv', 'a') as f:
f.write(exdate_out + ',' + exword_out[0][0] + ',' + exword_out[0][1]+ ',' + exword_out[1][0]+ ',' + exword_out[1][1] + '\n')
2018/11/10,206,(昨日:181位) / 14347人中,30,(昨日:27位) / 2577人中
2018/11/11,260,(昨日:206位) / 14781人中,30,(昨日:30位) / 2659人中
crontab -e
crontab -lまた、そもそもcronがシステムで稼働していることは次のコマンドで確認できます。
sudo chkconfig cron
2018/11/04
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from bs4 import BeautifulSoup
import time
options = Options()
options.set_headless()
driver = webdriver.Firefox(options=options)
username = "Your username"
password = "Your password"
# Login Page
driver.get('https://fc2.com/ja/login.php?ref=blog')
login_username = driver.find_element_by_id("id")
login_username.clear()
login_username.send_keys(username)
login_password = driver.find_element_by_id("pass")
login_password.clear()
login_password.send_keys(password)
login_password.submit()
time.sleep(5)
driver.save_screenshot("ss1.png")
# Ranking Page
driver.get('https://admin.blog.fc2.com/control.php?mode=ranking&sidemenu')
time.sleep(3)
driver.save_screenshot("ss2.png")
html = driver.page_source
driver.quit()
# BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
# File save
f = open('html_source.html', mode='x')
f.write(str(soup))
f.close()
exword = soup.find_all('td',attrs={'class': 'rank_number_td'})
print("extraction number : "+ str(len(exword)))
for i in range(0, len(exword)):
print("Extraction word : " + str(exword[i]))
exword_rn = exword[i].find('span',{'class': 'rank_number'}).extract()
exword_rp = exword[i].find('span',{'class': 'rank_people'}).extract()
print("exword_rn :" + str(exword_rn))
print("exword_rp :" + str(exword_rp))
print(exword_rn.get_text())
print(exword_rp.get_text()) 前半の34行目までは、Seleniumを用いて、ログイン名、パスワードを入れて管理ページに入る所です。10、11行目に自分のログイン名、パスワードを入れます。14行目はアクセスするログイン画面のURLです。手動でこのURLにアクセスした時の画面は以下の通りです。次に、このページにログイン名(メールアドレス/ブログID)とパスワードを入力しますが、それぞれのInput要素(テキストボックス)の名前は、直接ソースコードで探すのもありですが、以下の「開発ツール」で簡便に調べられます。
Firefoxの場合、目的のオブジェクト(テキストボックス)を選択し、「右クリック - 要素を調査」を実行すると、開発ツールが立ち上がります。
パスワードはこの方法でうまく行かなかったので、結局ページのソースコードから調べました。ページ上のオブジェクトのない所で、「右クリック - ページのソースを表示」を実行すると「ソースコード」が表示されます。
その中から、パスワードのテキストボックスの名前を探します。"pass"であることが分かりました。
<li>メールアドレス/ブログID:</li>プログラムの16、20行目の”id”と”pass”はこれに対応しています。必要事項を入力後は、23行目で実行。実行後はタイマー待ちを入れておき、ページの画像保存も行いました。
<li><input name="id" type="text" id="id" value="" class="input_fc2id_login" /></li>
<li>パスワード:</li>
<li><input name="pass" type="password" id="pass" class="input_fc2id_login" /></li>問題なく、自動でログイン成功したようです。次に、赤枠で囲んだ「ランキング」にアクセスします。事前に目的のページに手動でアクセスし、URLを把握しておきます。これも問題なく表示されました(プログラムのss2.png)。
この画像の表中の数字を抽出します。40〜42行目で保存したソースコードを解読し、以下の部分が該当していることが分かりました。
<tr>td要素で抽出できそうなので、その路線で進め、目的の値を絞り込んでいきました。
<td><a href="/control.php?mode=ranking&process=genre">コンピュータ</a></td>
<td class="rank_number_td"><span class="rank_number down">197</span>位 <span class="rank_people">(昨日:195位) / 14334人中</span> </td>
</tr>
<tr>
<td><a href="/control.php?mode=ranking&process=subgenre">プログラミング</a></td>
<td class="rank_number_td"><span class="rank_number down">30</span>位 <span class="rank_people">(昨日:28位) / 2538人中</span> </td>
</tr>
プログラム実行結果は以下の通りです。<td> extraction number : 2途中経過の文字出力があり、鬱陶しいですが、最終結果は、6、7、12、13行目です。うまく抽出できました。
Extraction word : <td class="rank_number_td">
<span class="rank_number down">197</span>位 <span class="rank_people">(昨日:195位) / 14334人中</span> </td>
exword_rn :<span class="rank_number down">197</span>
exword_rp :<span class="rank_people">(昨日:195位) / 14334人中</span>
197
(昨日:195位) / 14334人中
Extraction word : <td class="rank_number_td">
<span class="rank_number down">30</span>位 <span class="rank_people">(昨日:28位) / 2538人中</span> </td>
exword_rn :<span class="rank_number down">30</span>
exword_rp :<span class="rank_people">(昨日:28位) / 2538人中</span>
30
(昨日:28位) / 2538人中
スクレイピングは今回初めてでしたが、何かと応用ができそうな技術ですね。別の案件で試してみようと思いました。ご訪問者数
(Since 24 July, 2016)タグクラウド
プロフィール
![]()
Author: Dr.BobT
興味のおもむくままに生涯考え続けるエンジニアでありたい。月別アーカイブ
- 2023年 12月(1)
- 2023年 11月(5)
- 2023年 10月(9)
- 2023年 09月(6)
- 2023年 08月(7)
- 2023年 07月(7)
- 2023年 06月(2)
- 2023年 05月(10)
- 2023年 04月(7)
- 2023年 03月(5)
- 2023年 02月(3)
- 2023年 01月(3)
- 2022年 12月(11)
- 2022年 11月(2)
- 2022年 10月(5)
- 2022年 09月(4)
- 2022年 08月(7)
- 2022年 07月(4)
- 2022年 06月(2)
- 2022年 05月(4)
- 2022年 04月(2)
- 2022年 03月(3)
- 2022年 02月(5)
- 2022年 01月(4)
- 2021年 12月(5)
- 2021年 11月(4)
- 2021年 10月(4)
- 2021年 09月(2)
- 2021年 08月(5)
- 2021年 07月(3)
- 2021年 06月(3)
- 2021年 05月(6)
- 2021年 04月(2)
- 2021年 03月(1)
- 2021年 02月(3)
- 2021年 01月(7)
- 2020年 12月(6)
- 2020年 11月(3)
- 2020年 10月(3)
- 2020年 09月(4)
- 2020年 08月(5)
- 2020年 07月(2)
- 2020年 06月(5)
- 2020年 05月(10)
- 2020年 04月(2)
- 2020年 03月(3)
- 2020年 02月(2)
- 2020年 01月(6)
- 2019年 12月(4)
- 2019年 11月(3)
- 2019年 10月(6)
- 2019年 09月(4)
- 2019年 08月(4)
- 2019年 07月(2)
- 2019年 06月(4)
- 2019年 05月(7)
- 2019年 04月(4)
- 2019年 03月(2)
- 2019年 02月(6)
- 2019年 01月(5)
- 2018年 12月(3)
- 2018年 11月(5)
- 2018年 10月(7)
- 2018年 09月(7)
- 2018年 08月(5)
- 2018年 07月(7)
- 2018年 06月(3)
- 2018年 05月(6)
- 2018年 04月(3)
- 2018年 03月(7)
- 2018年 02月(4)
- 2018年 01月(7)
- 2017年 12月(3)
- 2017年 11月(6)
- 2017年 10月(9)
- 2017年 09月(5)
- 2017年 08月(4)
- 2017年 07月(4)
- 2017年 06月(2)
- 2017年 05月(6)
- 2017年 04月(5)
- 2017年 03月(3)
- 2017年 02月(4)
- 2017年 01月(2)
- 2016年 12月(2)
- 2016年 11月(5)
- 2016年 10月(6)
- 2016年 09月(4)
- 2016年 08月(9)
- 2016年 07月(5)
- 2016年 06月(6)
- 2016年 05月(5)
- 2016年 04月(11)
- 2016年 03月(5)
- 2016年 02月(6)
- 2016年 01月(10)
- 2015年 12月(13)
- 2015年 11月(25)
- 2015年 10月(7)
メールフォーム