スナックelve 本店

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

タグ付した記事の確認

カテゴリページからタグを取得して一覧にします(URLダブりあり。はてな記法
各カテゴリページの1ページ目だけ対応。
Headless Chromeで動かしてみました。
参考:Windows環境でSeleniumからHeadless Chromeを動かしてみた | Developers.IO

#よくわかってない
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options

from bs4 import BeautifulSoup

import urllib.parse
options = Options()
options.binary_location = 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe'
options.add_argument('--headless')

#タグをゲットするカテゴリ
setTags=['C#','Excel','JavaScript','jQuery','Outlook','php','PowerPoint','python3','vba','Word','FC東京']
with open(r"C:\Users\user\Documents\tagLog.txt", mode='w') as f:
    f.write("|*No|*Tag|*Entry|\n")
    #ログイン画面設定フラグ
    loginFig=False
    #タグ設定画面初回フラグ
    fastTaguSet=False
    #chrome開くよ
    with webdriver.Chrome(options=options) as driver:
        #よくわかってない
        wait = WebDriverWait(driver, 10)
        i=1
        for setTag in setTags:
            #カテゴリページのURL
            driver.get("https://elve.hatenadiary.jp/archive/category/" + urllib.parse.quote(setTag))
            print("==="+setTag+"===")
            WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)#読み込み待ち

            #記事の一覧画面
            html = driver.page_source.encode('utf-8')
            #解析用
            soup = BeautifulSoup(html, 'lxml')
            entrys=soup.find_all("section", class_="archive-entry test-archive-entry autopagerize_page_element")
            for entry in entrys:
                URL=entry.find("a", class_="entry-title-link")
                tag = entry.find("div", class_="archive-entry-tag-label")
                if tag!=None:
                    f.write("|" + str(i) + "|#"+setTag+"|"+"[" + URL["href"] + ":title]|\n")
                i+=1
続きを読む

はてなブログのカテゴリをタグにする

各カテゴリページの1ページ目だけ対応。
FC東京タグ荒らし状態になってしまった。すみません(-_-;)

ログインした後の編集画面では設定済みタグが取れなかったので再読み込みしてます。
なんかたぶん、表示待ちってこうじゃない気がするw

切り貼りなのであまり突っ込まれると困るw

Google Chrome
バージョン: 86.0.4240.75(Official Build) (64 ビット)

Pythonの関数の書き方よくわかってないのでベタ打ちです。

途中でタブ開いたりウィンドウ開いたりすると多分おかしなことになりますのでご注意ください。
基本自己責任でお願いいたします。

#よくわかってない
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import urllib.parse
#タグをセットするカテゴリ(〓〓〓変更してね〓〓〓)
setTags=['C#','Excel','JavaScript','jQuery','Outlook','php','PowerPoint','python3','vba','Word','FC東京']

#ログイン画面設定フラグ
loginFig=False
#タグ設定画面初回フラグ
fastTaguSet=False
#chrome開くよ
with webdriver.Chrome() as driver:
    #よくわかってない
    wait = WebDriverWait(driver, 10)
    i=1
    for setTag in setTags:
        #記事の管理画面のURL(〓〓〓変更してね〓〓〓)
        driver.get("https://elve.hatenadiary.jp/archive/category/" + urllib.parse.quote(setTag))
        print("==="+setTag+"===")
        WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)#読み込み待ち
        # Store the ID of the original window 現在画面のハンドル保存
        original_window = driver.current_window_handle

        #記事の一覧画面
        html = driver.page_source.encode('utf-8')
        #解析用
        soup = BeautifulSoup(html, 'lxml')
        entrys=soup.find_all("section", class_="archive-entry test-archive-entry autopagerize_page_element")
        for entry in entrys:
            print(i,":",entry["data-uuid"])
            driver.execute_script("window.open()")
            driver.switch_to.window(driver.window_handles[-1])
            #(〓〓〓変更してね〓〓〓)
            driver.get("https://blog.hatena.ne.jp/elve/elve.hatenadiary.jp/edit?entry=" + entry["data-uuid"])
            WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)#読み込み待ち
            #ログイン 画面(初回のみ)
            if loginFig==False:
                #(〓〓〓変更してね〓〓〓)
                driver.find_element_by_xpath("//*[@id='login-name']").send_keys("はてなID")
                driver.find_element_by_xpath("//*[@id='container']/div[1]/form[1]/div/div[2]/div/input").send_keys("パスワード")
                driver.find_element_by_xpath("//*[@id='option']/input[2]").send_keys(Keys.RETURN)
                WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)#読み込み待ち
                #(〓〓〓変更してね〓〓〓)
                driver.get("https://blog.hatena.ne.jp/elve/elve.hatenadiary.jp/edit?entry=" + entry["data-uuid"])
                WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)#読み込み待ち
                loginFig=True
                
            #編集画面読み込み
            html2 = driver.page_source.encode('utf-8')
            soup2 = BeautifulSoup(html2, 'lxml')
            item2 = soup2.find("ul", class_="editor-tag-editor_tag-list")
            tags=item2.find_all("li")
            setTagFlg=True
            if tags==None:
                setTagFlg=True
            else:
                for tag in tags:
                    if tag.text=="#"+setTag:
                        setTagFlg=False

            if setTagFlg==True: #タグが付いてない
                #タグをつける
                driver.find_element_by_xpath("//*[@id='tag-editor-root']/div/button").send_keys(Keys.RETURN)
                WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)#読み込み待ち
                if fastTaguSet==False:
                    #初回のみの画面が出ちゃう時
                    driver.find_element_by_xpath("/html/body/div[10]/div/div/div/button").send_keys(Keys.RETURN)
                    WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)#読み込み待ち
                    fastTaguSet=True
                driver.find_element_by_xpath("/html/body/div[11]/div/div/div[1]/div[2]/span/input").send_keys(setTag)
                driver.find_element_by_xpath("/html/body/div[11]/div/div/div[1]/div[2]/span/input").send_keys(Keys.RETURN)
                print(i,"SET:",setTag)
                driver.find_element_by_xpath("/html/body/div[11]/div/div/div[2]/button").send_keys(Keys.RETURN)
                WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)#読み込み待ち
                driver.find_element_by_xpath("//*[@id='submit-button']").send_keys(Keys.RETURN)
                WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)#読み込み待ち
                        
            #Close the tab or window タブを閉じる
            driver.close()
            #Switch back to the old tab or window 保存してた元のハンドラ
            driver.switch_to.window(original_window)
            WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)#読み込み待ち
            i+=1
 

最新20件の記事のカテゴリをタグに設定する

くっそー。入口間違えたわ。普通に考えて日記タグ700記事とかに付けたらガイドライン違反だもんなぁ・・・。
とりあえず、最新20記事の指定したカテゴリをタグに変えるプログラムです。
ビューティフルスープがうまく使えなくてめちゃ時間かかった(-_-;)

#よくわかってない
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
#タグをセットするカテゴリ
setTags=['C#','Excel','JavaScript','jQuery','Outlook','php','PowerPoint','python3','vba','Word','FC東京']

#chrome開くよ
with webdriver.Chrome() as driver:
    #よくわかってない
    wait = WebDriverWait(driver, 10)
    #記事の管理画面のURL
    driver.get("https://blog.hatena.ne.jp/elve/elve.hatenadiary.jp/entries")
    #ログイン 画面
    driver.find_element_by_xpath("//*[@id='login-name']").send_keys("はてなID")
    driver.find_element_by_xpath("//*[@id='container']/div[1]/form[1]/div/div[2]/div/input").send_keys("パスワード")
    driver.find_element_by_xpath("//*[@id='option']/input[2]").send_keys(Keys.RETURN)
    
    WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)#読み込み待ち

    #記事の管理 画面
    html = driver.page_source.encode('utf-8')
    #解析用
    soup = BeautifulSoup(html, 'lxml')
    # Store the ID of the original window 現在画面のハンドル保存
    original_window = driver.current_window_handle
    
    #テーブルの行
    i=1
    #tr-hoverの行数分ループ(20)
    for row in soup.find_all("tr",class_="tr-hover"):
        items=""#カテゴリ
        item2=""#設定済みタグ
        #カテゴリ取得
        items = row.find_all('td',class_="td-blog-category")
        #編集ボタンを押す
        driver.find_element_by_xpath("//*[@id='admin-main-wrapper-inner']/div[2]/section/div[6]/table/tbody/tr[" + str(i) + "]/td[2]/div/div/a").send_keys(Keys.RETURN)
        WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)#読み込み待ち
        #編集->編集を押す
        driver.find_element_by_xpath("//*[@id='admin-main-wrapper-inner']/div[2]/section/div[6]/table/tbody/tr[" + str(i) + "]/td[2]/div/div/div/ul/li[1]/a").send_keys(Keys.CONTROL,Keys.RETURN)
        WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)#読み込み待ち

        #個別記事の編集画面(別タブ)
        driver.switch_to.window(driver.window_handles[-1])
        #編集画面読み込み
        html2 = driver.page_source.encode('utf-8')
        soup2 = BeautifulSoup(html2, 'lxml')
        item2 = soup2.find_all("ul", class_="editor-tag-editor_tag-list") #tagリスト
        if item2[0].text == "": #タグが付いてない
            #タグをつける
            driver.find_element_by_xpath("//*[@id='tag-editor-root']/div/button").send_keys(Keys.RETURN)
            WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)#読み込み待ち
            try:
                #初回のみの画面が出ちゃう時
                driver.find_element_by_xpath("/html/body/div[10]/div/div/div/button").send_keys(Keys.RETURN)
            except:
                #しょうがないからprint
                print("OK:",i)
            WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)#読み込み待ち
            flg ="false"
            for item in items:
                for tag in setTags:
                    #指定されたタグと同じカテゴリならタグ設定
                    if item.text.replace("\n","")==tag:
                        driver.find_element_by_xpath("/html/body/div[11]/div/div/div[1]/div[2]/span/input").send_keys(item.text)
                        driver.find_element_by_xpath("/html/body/div[11]/div/div/div[1]/div[2]/span/input").send_keys(Keys.RETURN)
                        flg="true"
            if flg=="true":
                #タグ設定してたら更新
                driver.find_element_by_xpath("/html/body/div[11]/div/div/div[2]/button").send_keys(Keys.RETURN)
                WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)#読み込み待ち
                driver.find_element_by_xpath("//*[@id='submit-button']").send_keys(Keys.RETURN)
                WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)#読み込み待ち
        #Close the tab or window タブを閉じる
        driver.close()
        #Switch back to the old tab or window 保存してた元のハンドラ
        driver.switch_to.window(original_window)
        WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)#読み込み待ち
        #次の行へ
        i+=1

次のページに行こうとしたらページじゃなくて下に読み込むんだもーん(-_-;)うぅぅう
たぶん記事の管理画面から行こうとしたのが間違いで
https://elve.hatenadiary.jp/archive/category/カテゴリー
から記事を開いてタグ付だな。

明日やる

最初の一歩

タグ付のテストもかねて。←失敗した
もしかして記事内に #Python3 とか書いたらつく?←つかない
Enterが足りなかった・・・。これプログラムでできるかな?

やりたいこと

過去記事の編集画面を開いて、タグが入ってたらスルー、入ってなかったらカテゴリーと同じ文字を入れる。
もうちょっと詳しく書くとログインしているものとして

https://blog.hatena.ne.jp/elve/elve.hatenadiary.jp/entries
を開く

  • ページ分ループ
    • そのページ内の記事数分ループ
      • カテゴリを取得
      • 記事の編集画面を開く
      • タグをつけるボタンがあれば押す(なければ戻る)
      • 取得したカテゴリを入力してエンター押下相当の処理
    • 次のページへを押す

だな。
apiとかは未対応っぽいから、Pythonでブラウザを触れれば何とかなるかな?
フォームに入力してボタン押す必要がありそう・・・。
google:python web フォーム 自動入力

ふむふむ。
参考:pythonで自動入力、スクレイピングをしてみる - Qiita
環境:python3.8.6+visual studio code 1.50


ターミナルに下記を入力してOK

pip install selenium

これがどこに入れてもエラーになるんでよくわからん。
brewなんてコマンドないぜって言われるのでなんか根本から違うのかも。

brew tap homebrew/cask
brew install chromedriver

Downloads - ChromeDriver - WebDriver for Chrome
ここから落としてきて解凍したファイルはソースファイルと同じドキュメントに置く。

f:id:elve:20201009184931p:plain
これで動いた。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.expected_conditions import presence_of_element_located

#This example requires Selenium WebDriver 3.13 or newer
with webdriver.Chrome() as driver:
    wait = WebDriverWait(driver, 10)
    driver.get("https://google.com/ncr")
    driver.find_element(By.NAME, "q").send_keys("cheese" + Keys.RETURN)
    first_result = wait.until(presence_of_element_located((By.CSS_SELECTOR, "h3>div")))
    print(first_result.get_attribute("textContent"))
  

メンヘラ、ペアーズに敗れる

僕は、失恋したら頭がおかしくなるんだと思っていたんだけど、どうも恋愛モード入った時点で狂ってるみたいなんだよね。そういえば、10年前もそんな感じだったな、とか思って。10年ぶりだったのでちょっと忘れてたよね。
躁鬱で普段は薬で躁になるのを抑えてるけど、人を好きと認識した時点でドーパミンがドバドバで躁になってるんだろうね。

これはもう、恋愛モードに慣れるしかないね。←薬増やせw

そんなことを朝ふと思い立ってペアーズに登録しました。出社前に。はい、時間ないwwwww
というわけで最低限の入力しかしてない状態だったのに、そこそこ「いいね」が付いたんですよ。
www.pairs.lv

これはもう、気合い入れて自己紹介しなくてはいけない、と思いまして、帰ってきてから「おっすおら躁鬱病!!」みたいな自己紹介を書いたんですよ。すごい長文で。

全く「いいね」が来なくなりました。
でも足跡はめっちゃつくんですよ・・・。
どっかに晒されてる?(;'∀')

f:id:elve:20201008214658p:plain

操作

むつかしい。おばさんにはむつかしい

左から右へスワイプすると「いいね!」を送信する

自分や相手のプロフィール写真を確認する – Pairsヘルプ

これがよくわかってなくて最初のマッチングは操作ミスということになったw
そしてその人にメアドを教えたが返答はない。

本人認証

STEP1(年齢確認)、STEP2で2回も免許証の写真を撮らされる。しかも、NGだった(´;ω;`)ウッ…
というわけで3回目でようやく本人と認められる。
f:id:elve:20201008215304p:plain

お前ら・・・

メンヘラは見世物じゃないんだぞ!
自己紹介更新後に2件「いいね」が来たので物好きキタ――(゚∀゚)――!!と思って即メアド送ったのに放置ですよ。
なに、これはこれで男子警戒してるわけ? 自己紹介ろくに読まずにいいねして後悔してるって感じなわけ?
今週末デートしようよ!!!!!←台風です。

ペアーズで男子がさばけなくなってきたら

メンヘラアピールするとモーセになれるよ(/・ω・)/