LoginSignup
1
0

More than 5 years have passed since last update.

connpassの2つイベント間で重複する参加者を調べる

Last updated at Posted at 2018-08-20

関連記事
connpassのイベント参加者リストをcsv形式で取得し、重複する参加者を調べる

にて、connpassイベントの参加者一覧をcsvファイルに出力したり、出力したcsvファイルを比較して重複する参加者を出力する処理を紹介しましたが、

csvファイルに保存せずに、2つのイベントの参加者一覧および重複ユーザーをそのまま出力する処理を作成してみました。

GitHub上のソースへのリンク
 get_participant_duplicates.py

スクレイピング処理に関しての留意事項
Webスクレイピングの注意事項一覧
connpass利用規約

1. 2つのイベントの参加者一覧および重複ユーザーの取得方法

HTMLのparse処理にbeautifulsoup4を使用しています。

管理者権限でpip install beautifulsoup4コマンドを実行し、事前にインストールしておいてください。

コマンドの実行方法は、以下のとおりです。
それぞれのイベントの参加者一覧が表示されたあと、重複する参加者が出力されます。

$ python ./get_participant_duplicates.py https://グループ名1.connpass.com/event/イベントID/ https://グループ名2.connpass.com/event/イベントID/

もしくは、

$ chmod u+x get_participant_duplicates.py
$ ./get_participant_duplicates.py https://グループ名1.connpass.com/event/イベントID/ https://グループ名2.connpass.com/event/イベントID/

2. ソース

MS-Windows環境では、1行目は削除し、2行目は# coding: cp932に置き換えると良いと思います。

一般的なWebスクレイピングの手順なので、詳細な解説は割愛させていただこうと思います。

get_participant_duplicates.py
#!/usr/bin/env python
# coding: utf-8

import sys
import urllib.request
import urllib.error
from bs4 import BeautifulSoup


def print_arg_error(commandName):
    """引数エラー時のメッセージ出力"""
    print("Usage: python {cmd} connpassURL1 connpassURL2\n"
          "\n"
          "example)\n"
          "python {cmd} https://GROUP_A.connpass.com/event/xxxxx/"
                      " https://GROUP_B.connpass.com/event/yyyyy/"
          .format(cmd=commandName))
    exit(0)


def is_url(url):
    """URL書式チェック"""
    return url.startswith("https://") or url.startswith("http://")


def participation_url(url):
    """参加者URLに変換"""
    if url.endswith("/participation/"):
        return url
    if url.endswith("/participation"):
        return url + "/"
    if url.endswith("/"):
        return url + "participation/"
    else:
        return url + "/participation/"


def users(tags):
    """ユーザー情報の取得(ユーザ名とユーザURLのCSV形式)"""
    for tag in tags:
        try:
            if tag.text and tag.text != "\n\n":
                href = tag['href']
                if "/open/" in href or "/user/" in href:
                    yield '"{name}","{url}"\n'.format(name=tag.text, url=href)
        except:
            pass


def getDuplicateUsers(users1, users2):
    """2つのcsv配列を比較し、profile URLが一致するレコードを出力する"""
    urls2 = {user2.split(",")[1] for user2 in users2}
    for user1 in users1:
        name1, url1 = user1.split(",")
        if url1 in urls2:
            yield user1


class Connpass:
    """Compassイベント参加者情報"""

    def __init__(self, url):
        self.url = participation_url(url)
        html = urllib.request.urlopen(self.url)
        soup = BeautifulSoup(html, "html.parser")
        tags = soup.find_all("a")
        self.users = list(users(tags))

    def show_users(self):
        """抽出した参加者リストを標準出力に表示する"""
        print("\n===== %s ==== " % self.url)
        for user in self.users:
            print(user, end="")


def main():

    # URL Format
    # "https://xxxxxx.connpass.com/event/xxxxx/"

    cmd, *args = sys.argv
    argc = len(args)
    if argc != 2:
        print_arg_error(cmd)
    url1, url2 = args

    if not is_url(url1) or not is_url(url2):
        print_arg_error(cmd)

    connpass1 = Connpass(url1)
    connpass2 = Connpass(url2)

    connpass1.show_users()
    connpass2.show_users()

    # 重複するユーザーを表示する
    print("\n===== Duplicate Users ==== ")
    for user in getDuplicateUsers(connpass1.users, connpass2.users):
        print(user, end="")
    print()

if __name__ == "__main__":
    main()
1
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0