スナックelve 本店

バツイチ40代女の日記です

pandasでソートしてみた

snack.elve.club

のソートつけたやつ。pandasってのであっという間だった!! しかし多分勿体ない使い方してる(;´Д`)

# -*- coding:utf-8 -*-
import urllib
import codecs
import requests
import json
from lxml import etree
import datetime as dt
import pandas as pd
 
def HtmlOutput(df):
    #ファイルを開く
    f = open('被はてブlist.html', 'wt')
    #最低限のタグ書き込み
    f.write('<html><body><table border="1" style="border-collapse: collapse">')
    #ヘッダ
    f.write('<tr><th>★</th><th>URL</th><th>ユーザー</th><th>日付</th><th>コメント</th>\n')
    #ノードごとに書き込む
    for index, b in df.iterrows():
        bUrl = urllib.parse.quote(b['url'])
       
        f.write('<tr>')

        #死んどる
        f.write('<td>')
        if b['star']==1:
            f.write('★')
        f.write('</td>')

        #書き出し
        try:
            f.write('<td><a href="http://b.hatena.ne.jp/entry/' + bUrl + '" target="_blank">' + b['url'] + '</a></td><td>' + \
            b['user'] + '</td><td>' + b['date'].strftime("%Y/%m/%d") + '</td><td>' + b['comment'] + '</td>')
        except:
            #絵文字があったらどうにかする(消える)
            s = '<td><a href="http://b.hatena.ne.jp/entry/' + bUrl + '" target="_blank">' + b['url'] + '</a></td><td>' + \
            b['user'] + '</td><td>' + b['date'].strftime("%Y/%m/%d") + '</td><td>' + b['comment'] + '</td>'
            b = s.encode('cp932', "ignore")
            f.write(b.decode('cp932'))
            
            
            
        f.write('</tr>\n')

    #後処理
    f.write('</table></body></html>')
    f.close()

#####死んどる#####
def  GetImgIndex(time, eid, user):
    #URL作成
    url = "http://b.hatena.ne.jp/entry/" + str(eid) + "/comment/"
    url = url + user
    url = urllib.parse.quote(url)
    headers = {'User-Agent': 'Sample Header'}
    r = requests.get("http://s.hatena.com/entry.json?uri=" + url, headers=headers).json()
    for st in r['entries']:
        for st2 in st['stars']:
            if st2['name'] == myId:
                return 1
    return 0
##########################################
#検索したいurl: 
myStr="https://elve.hatenadiary.jp/"
#あなたのはてなID
myId = "elve"

#大元のURL読み込み(はてブをURLで検索した結果)rss表示
r = requests.get("http://b.hatena.ne.jp/search/text?safe=off&q=" + urllib.parse.quote(myStr) + "&users=1&mode=rss").text
r = r.encode('utf-8')
root = etree.fromstring(r)

#各記事のノードの束取得
links = root.findall(".//{http://purl.org/rss/1.0/}link")

#データ空に
bmInfos = []

#ノードごとに処理
for link in  links:
    if link != links[0]:
        #適当にヘッダ設定
        headers = {'User-Agent': 'Sample Header'}
        #各記事のブクマページ取得
        json = requests.get("http://b.hatena.ne.jp/entry/jsonlite/?url=" + link.text, headers=headers).json()
        try:
            #ブクマごとの処理
            for bm in json['bookmarks']:

                #タイムスタンプ               
                tdatetime = dt.datetime.strptime(bm['timestamp'], '%Y/%m/%d %H:%M')

                #スターなし(現在機能していない)|ブクマページURL|ユーザー名|日付|コメント
                bmInfo={"star":0,"url":json['url'],"user":bm['user'], "date":tdatetime,"comment":bm['comment']}

                #死んどる
                #bmInfo["star"] = GetImgIndex(tdatetime, json['eid'], bm['user'])

                #データ追加
                bmInfos.append(bmInfo)                
        except:
            #不穏な動き
            print("ERR!!")
            break
df = pd.DataFrame(bmInfos)
df = df.sort_values('date')

#データをHTMLに出力
HtmlOutput(df)
print("END")

「 for index, b in df.iterrows():」のindex忘れてまともに値とれなくて泣きそうになったw
出力はソートしただけなので省略

被はてブのリスト出力

以前作ってた三日はてブの動く版w
絵文字は消える。文字コード昔仕事で使ったのによくわからんw
スター付けたかどうかのところは今のところとれなくなってる。
よって「はてなID」は何入れても同じ罠w

日付でソートしようと思ったらドはまりしそうなので、ひとまずここで上げておく

# -*- coding:utf-8 -*-
import urllib
import codecs
import requests
import json
from lxml import etree
import datetime as dt

 
def HtmlOutput(bmInfos):
    #ファイルを開く
    f = open('被はてブlist.html', 'wt')
    #最低限のタグ書き込み
    f.write('<html><body><table border="1" style="border-collapse: collapse">')
    #ヘッダ
    f.write('<tr><th>★</th><th>URL</th><th>ユーザー</th><th>日付</th><th>コメント</th>\n')
    #ノードごとに書き込む
    for b in bmInfos:
        bUrl = b['url'].replace("http://", "")
        bUrl = b['url'].replace("https://", "s/")
        bUrl = urllib.parse.quote(bUrl)
        
        f.write('<tr>')
        f.write('<td>')
        if b['star']==1:
            f.write('★')
        f.write('</td>')
        try:
            f.write('<td><a href="http://b.hatena.ne.jp/entry/' + bUrl + '" target="_blank">' + b['url'] + '</a></td><td>' + \
            b['user'] + '</td><td>' + b['date'].strftime("%Y/%m/%d") + '</td><td>' + b['comment'] + '</td>')
        except:
            #絵文字があったらどうにかする(消える)
            s = '<td><a href="http://b.hatena.ne.jp/entry/' + bUrl + '" target="_blank">' + b['url'] + '</a></td><td>' + \
            b['user'] + '</td><td>' + b['date'].strftime("%Y/%m/%d") + '</td><td>' + b['comment'] + '</td>'
            b = s.encode('cp932', "ignore")
            f.write(b.decode('cp932'))
            
            
            
        f.write('</tr>\n')

    #後処理
    f.write('</table></body></html>')
    f.close()

#####死んどる#####
def  GetImgIndex(time, eid, user):
    #URL作成
    url = "http://b.hatena.ne.jp/entry/" + str(eid) + "/comment/"
    url = url + user
    url = urllib.parse.quote(url)
    headers = {'User-Agent': 'Sample Header'}
    r = requests.get("http://s.hatena.com/entry.json?uri=" + url, headers=headers).json()
    for st in r['entries']:
        for st2 in st['stars']:
            if st2['name'] == myId:
                return 1
    return 0
##########################################
#検索したいurl: 
myStr="https://elve.hatenadiary.jp/"
#あなたのはてなID
myId = "elve"

#大元のURL読み込み(はてブをURLで検索した結果)rss表示
r = requests.get("http://b.hatena.ne.jp/search/text?safe=off&q=" + urllib.parse.quote(myStr) + "&users=1&mode=rss").text
r = r.encode('utf-8')
root = etree.fromstring(r)

#各記事のノードの束取得
links = root.findall(".//{http://purl.org/rss/1.0/}link")

#データ空に
bmInfos = []

#ノードごとに処理
for link in  links:
    if link != links[0]:
        #適当にヘッダ設定
        headers = {'User-Agent': 'Sample Header'}
        #各記事のブクマページ取得
        json = requests.get("http://b.hatena.ne.jp/entry/jsonlite/?url=" + link.text, headers=headers).json()
        try:
            #ブクマごとの処理
            for bm in json['bookmarks']:

                #タイムスタンプ               
                tdatetime = dt.datetime.strptime(bm['timestamp'], '%Y/%m/%d %H:%M')

                #スターなし(現在機能していない)|ブクマページURL|ユーザー名|日付|コメント
                bmInfo={"star":0,"url":json['url'],"user":bm['user'], "date":tdatetime,"comment":bm['comment']}

                #死んどる
                #bmInfo["star"] = GetImgIndex(tdatetime, json['eid'], bm['user'])

                #データ追加
                bmInfos.append(bmInfo)
        except:
            #不穏な動き
            print("ERR!!")
            break
#データをHTMLに出力
HtmlOutput(bmInfos)
print("END")

出力

f:id:elve:20200301155204p:plain

ツイート用過去記事のタイトルとURLの一覧出力

できた~(*´▽`*)

import os
import urllib.request, urllib.error
from bs4 import BeautifulSoup as bs4

#書き込みファイル
FILE_NAME_A = r'ふるぱす\hatenaAllPostList.txt'

#文字コード
FILE_ENCODING = 'UTF-8'

#文頭文章
HEAD_TEXT = r"#はてなブログ 過去記事です(*'▽')ノ<"

#URL
INPUT_URL = 'https://elve.hatenadiary.jp/'

#ファイル書き込み(文字列をそのまま書き込み)
def write_file_from_str(p_filename, p_mode, p_data):
    file = open(p_filename, p_mode, encoding=FILE_ENCODING)
    file.write(p_data)
    file.close()

#メイン処理

#出力ファイルがあったら削除
if os.path.exists(FILE_NAME_A):
    os.remove(FILE_NAME_A)

p = 1
while 1:
    readPage = INPUT_URL + "archive?page=" + str(p)
    #URL取得
    try:
        f = urllib.request.urlopen(readPage)
    except :
        break;
    
    outputText = ''
    soup = bs4(f)
    #エントリータイトルクラス取得
    ss = soup.findAll(class_='entry-title')
    if ss == []:
        break;  
    for s in ss:
        outputText = outputText + HEAD_TEXT + s.get_text(strip=True) + ' ' + s.find('a').get('href') + '\n'
    #1ページ分ファイル書き込み
    write_file_from_str(FILE_NAME_A, 'a', outputText)
    #次のページへ
    p = p + 1
print("終わり!")

結果

900件以上出力があったのに登録できるの700件までだった(´;ω;`)ウゥゥ
f:id:elve:20200301113345p:plain

そうだ、過去記事をツイートさせよう

そう思いだった日曜の6:30。私はよくわからない状態になっていたVisual Studio 2017とVisual Studio codeをアンインストールして最新のものを入れなおす。
www.microsoft.com

Visual Studio 2019は重い割にさくっとpython動かなかったのでVisual Studio codeで行きます。

www.du-soleil.com

こちらを参考にtwittbot - enjoyにログイン。くぅ、認証系は怖いが信じるぜ!!w
手順2がうまく動かなくてつまる。archiveカード形式にしてるからかな?
Yahoo Pipes 終了のためとのこと
作ったで‼︎はてなブログの過去記事500件取得するよ - スナックelve 本店

とりあえずRSSからタイトルとURL取得しましょう。そうしましょう。
コピペでポンと行けるはず。
PythonでRSSのフィードのデータを取得する方法【初心者向け】 | TechAcademyマガジン
「pip install feedparser」をターミナルってとこに貼り付けてenterでなんかインストールされた。
おけおけ。

えっと出力はCSVに吐くか。
Pythonのファイル書き込み・読み込みの基本まとめ [コピペサンプルコード付き] | KodoCode
コピペ、おけおけ。

えっと、if分の書き方わからん(爆)
if文 (条件分岐) | Python-izm

import feedparser
import csv
import os
from datetime import datetime

CSV_NAME_W    = r'ふるぱす\hatenaPostList.csv' # 書き込みCSV名。
FILE_ENCODING = 'UTF-8'      # デコード・エンコードで使う文字コード。
RSS_URL = 'https://elve.hatenadiary.jp/rss'

# ファイル書き込み(CSV)
def write_csv_from_list(p_filename, p_mode, p_data):
    file = open(p_filename, p_mode, encoding=FILE_ENCODING)
    csv_file = csv.writer(file, lineterminator='\n')
    for i in range(len(p_data)):
        csv_file.writerow(p_data[i])
    file.close()    


# メイン処理
# ファイルがあったら削除
if os.path.exists(CSV_NAME_W):
    os.remove(CSV_NAME_W)
# RSS読み込み
d = feedparser.parse(RSS_URL)

for entry in d.entries:
    # CSV吐き出し
    write_csv_from_list(CSV_NAME_W, 'a', [["#はてなブログ 過去記事です(*'▽')ノ<"+entry.title+" "+entry.link]])

出力結果

#はてなブログ 過去記事です(*'▽')ノ<マリさんと私は男の後ろで踊るよりはパジャマパーティー https://elve.hatenadiary.jp/entry/2020/03/01/002110
#はてなブログ 過去記事です(*'▽')ノ<閏日? 4年前は・・・ https://elve.hatenadiary.jp/entry/2020/02/29/184049
#はてなブログ 過去記事です(*'▽')ノ<メール(物理)もいいよいいよー! https://elve.hatenadiary.jp/entry/2020/02/29/113500
#はてなブログ 過去記事です(*'▽')ノ<こんなの私のスカーレットじゃない!! https://elve.hatenadiary.jp/entry/2020/02/26/234329
#はてなブログ 過去記事です(*'▽')ノ<なぜそれで寒くないと思った? https://elve.hatenadiary.jp/entry/2020/02/25/232215
#はてなブログ 過去記事です(*'▽')ノ<インプットとアウトプット https://elve.hatenadiary.jp/entry/2020/02/24/164722
#はてなブログ 過去記事です(*'▽')ノ<よーく考えてもわからないことはトラウマなんだって https://elve.hatenadiary.jp/entry/2020/02/24/114840
#はてなブログ 過去記事です(*'▽')ノ<炎は舞い上がる https://elve.hatenadiary.jp/entry/2020/02/23/110053
#はてなブログ 過去記事です(*'▽')ノ<人の金でイールイーター&フグ https://elve.hatenadiary.jp/entry/2020/02/21/203902
#はてなブログ 過去記事です(*'▽')ノ<日記 https://elve.hatenadiary.jp/entry/2020/02/19/003835
#はてなブログ 過去記事です(*'▽')ノ<流せない https://elve.hatenadiary.jp/entry/2020/02/18/001700
#はてなブログ 過去記事です(*'▽')ノ<ブクマのブクマ https://elve.hatenadiary.jp/entry/2020/02/16/220841
#はてなブログ 過去記事です(*'▽')ノ<test https://elve.hatenadiary.jp/entry/2020/02/16/213211
#はてなブログ 過去記事です(*'▽')ノ<人の顔を認識する能力が低い https://elve.hatenadiary.jp/entry/2020/02/16/192921
#はてなブログ 過去記事です(*'▽')ノ<オマケ https://elve.hatenadiary.jp/entry/2020/02/15/204842
#はてなブログ 過去記事です(*'▽')ノ<俺にとってのバレンタインは今日だ!! https://elve.hatenadiary.jp/entry/2020/02/15/202449
#はてなブログ 過去記事です(*'▽')ノ<頼むよ https://elve.hatenadiary.jp/entry/2020/02/13/214044
#はてなブログ 過去記事です(*'▽')ノ<フィルターで抽出後データがないとき https://elve.hatenadiary.jp/entry/2020/02/13/203528
#はてなブログ 過去記事です(*'▽')ノ<安易に神認定する日々 https://elve.hatenadiary.jp/entry/2020/02/12/190902
#はてなブログ 過去記事です(*'▽')ノ<2月も高速移動してる感じだね https://elve.hatenadiary.jp/entry/2020/02/12/000014
#はてなブログ 過去記事です(*'▽')ノ<ジュレマスク・・・なかなかいい感じ! https://elve.hatenadiary.jp/entry/2020/02/11/123205
#はてなブログ 過去記事です(*'▽')ノ<感謝したことがなかったことに衝撃を受けた https://elve.hatenadiary.jp/entry/2020/02/10/100332
#はてなブログ 過去記事です(*'▽')ノ<13まんの大きな家 https://elve.hatenadiary.jp/entry/2020/02/10/010404
#はてなブログ 過去記事です(*'▽')ノ<お勉強中 https://elve.hatenadiary.jp/entry/2020/02/09/133930
#はてなブログ 過去記事です(*'▽')ノ<保湿保湿 https://elve.hatenadiary.jp/entry/2020/02/08/222301
#はてなブログ 過去記事です(*'▽')ノ<スカーレットについて https://elve.hatenadiary.jp/entry/2020/02/08/182917
#はてなブログ 過去記事です(*'▽')ノ<はちぃぃぃぃ https://elve.hatenadiary.jp/entry/2020/02/08/095844
#はてなブログ 過去記事です(*'▽')ノ<焦らされてる https://elve.hatenadiary.jp/entry/2020/02/07/212558
#はてなブログ 過去記事です(*'▽')ノ<朝ドラ「スカーレット」のハチは駄目! https://elve.hatenadiary.jp/entry/2020/02/06/233024
#はてなブログ 過去記事です(*'▽')ノ<今月はスカートが可愛い https://elve.hatenadiary.jp/entry/2020/02/06/073000

これをbotに食わせればツイートしてくれる・・・のかな?(未確認)

課題

  • RSSの続きの読み方わからねぇ!!←ないっぽい
  • CSVにする必要ねぇ!!
  • 時間かかりすぎ!!w

マリさんと私は男の後ろで踊るよりはパジャマパーティー

脱線しまくる話
わたくしの永遠の敵であるところのワベさんに
シュークリームシュを見るとエルベさんとマリさんを思い出す
と言われました。米米CLUBのダンサーチームさんの名前なんですね。知りませんでした。
示された動画だとなんつーか・・・胸強調した衣装の女性が男性の後ろで踊るって感じで・・・。ワベさん的には仲良さそうに楽しそうに踊ってるらしいがw

You And Me~って歌詞で、マリさんと私なら、Me &My だよなぁと思ってw 同じセクシー路線ならガツンと行きたいw

この曲元彼の愛なんていらねぇとか女二人で歌ってる感じがパジャマパーティーな感じしません?
こう、女二人で元彼の悪口言いながらわきゃわきゃしてるのがパジャマパーティーのイメージになってるのは「ラムネ&40」のキャラソンのせいですw

Dub-i-dubのジャケット写真トレスです。マリさんが怖くなったw 帽子の構造がよくわからんくて適当に書いたら随分違うなw
f:id:elve:20200301001524p:plain

何で昔のアニメってキャラソンとかエンディングとかでキャラもストーリーも無視したちょっと大人っぽい曲入ってるんでしょうね?(今のアニメは知らない)