見出し画像

片想いリスト / 両想いリスト / 愛されリストを作った!→ダメっぽ→いやできた

2020/01/26 追記 非公式APIで実現しました


2021/01/26 追記 フォロワー400ユーザ分しか取得できませんでした

ウェブスクレイピングだとフォロワー一覧が20ページ分(400ユーザ)しか取得できないため、限定的にしか使えないプログラムでした。フォロワーがそんなにいなく、気づくことができず、すみません。

非公式APIだとできるかもなので、もう少し考えてみます。

記事詳細

うれしいことにnoteでフォロワーの方が増えてきました。紹介文には書いていないですが、フォロバ100%状態です。

だがしかし、エラーになってしまいフォロバできていない方がいます。近日中に必ずフォローすると意気込んでいます

さらにだがしかし、フォロバできていない方を探すとなると、フォロワー一覧を1ページずつ開く必要があるんですね、noteって。

今後改善されるのかもしれませんが、まぁ、メンドクサイ。単純作業がかなり嫌い。

そんなわけで、WEBスクレイピングを使って、フォローしていない人リスト(通称、愛されリスト)作るプログラムを作ってみました。

ちょっと捻るだけで、相互フォローをしている人のリスト、自分がフォローしていて相手がフォローしていない人のリスト(片想いリスト)も作れたので、自動生成するようにしました

これって同じように悩んでいる人いるんでしょうかね。悩んでいる人がいたら、スキかコメントください。

いっぱいいたら、何かサービス作るかなー

※参考程度ですが、今回のプログラムです。pythonとHTMLが分かる方なら、さして難しくないはず。メソッドの結合が疎になり切れていないのがいまいち納得できていない。noteのHTMLをつぶさに見たわけではないので、拾いきれない or 出すぎてしまう人がいそう。

-- 2021/01/26 コードを修正

・excel出力だと文字コードエラーになるユーザがいるので、csv出力に変更。合わせて、ファイル名称を変更
# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import requests
from os import path
import time
import pandas as pd
from tqdm import tqdm

# リスト作成共通処理
def createUserList(user_url):

 # スクレイピング
 res = requests.get(user_url)
 soup = BeautifulSoup(res.text,'html.parser')

 # 最大ページ数の取得

 # ページ表示の要素取得
 pages = soup.select('.m-paginate__item')

 # ページのtext情報を取得後、最大ページ数を取得
 max_page = 0
 for page in pages:
   page_num = str(page.text.strip())
   if(page_num.isdecimal()):
     tgt_page = int(page_num)
     if max_page <= tgt_page :
       max_page = tgt_page

 # dfに変換するためのユーザ名とURLのリスト生成
 list_name = list()
 list_url = list()

 # フォロワーページをすべてスクレイピングし、ユーザリストの作成
 label = 1
 # クエリー設定
 query_page = '?page='

 for page in tqdm(range(max_page)):
   res = requests.get(user_url + query_page + str(page+1))
   soup = BeautifulSoup(res.text,'html.parser')

   # ユーザ情報を取得
   urls = soup.select('.m-userListItem__link')
   names = soup.select('.m-userListItem__nameLabel')

   ind = 0

   for url in urls:
     list_name.append(names[ind].text.strip())
     list_url.append(url.get('href'))
     ind = ind + 1
     label = label + 1
   
   # note様のサーバ負荷にならないよう1秒スリープ
   time.sleep(1)

 # dfへの変換
 df = pd.DataFrame({'name': list_name,
                  'url':list_url})
 # 重複行を削除
 df.drop_duplicates(subset='url', inplace=True)

 return df


if __name__ == '__main__':

 print('START')

 #ユーザ名  - 「XXXXX」を自分のIDに書き換える
 user_name = 'XXXXX'

 # URL設定
 top_url = 'https://note.com/' + user_name
 followers_url = top_url + '/followers'
 followings_url = top_url + '/followings'

 # フォロワーの一覧作成
 df_followers = createUserList(followers_url)
 df_followers.rename(columns={'name': 'followers_name'}, inplace=True)

 # フォローの一覧作成
 df_followings = createUserList(followings_url)
 df_followings.rename(columns={'name': 'followings_name'}, inplace=True)

 # 両想いユーザ
 df_ryouomoi = pd.merge(df_followers, df_followings, on='url', how='inner')
 df_ryouomoi.to_csv(user_name + '_note_ryouomoi.csv')

 # 片想いユーザ
 df_kataomoi = pd.merge(df_followings, df_followers, on='url', how='left')
 df_kataomoi = df_kataomoi[df_kataomoi['followers_name'].isnull()]
 df_kataomoi.to_csv(user_name + '_note_kataomoi.csv')

 # 愛されユーザ
 df_aisare = pd.merge(df_followers, df_followings, on='url', how='left')
 df_aisare = df_aisare[df_aisare['followings_name'].isnull()]
 df_aisare.to_csv(user_name + '_note_aisare.csv')

 print()
 print('END')


この記事が参加している募集

最近の学び

この記事が気に入ったらサポートをしてみませんか?