このマシュマロの質問解答を集めたScrapboxはどうやって作ったのですか?
質問
解答
恥ずかしながら、マシュマロの質問に対する解答を、まったくローカルに残していなかったので、データを拾い集めるところからはじめました。
まず質問の方は、マシュマロの確認済みのページに残っています。 code:get_questions_from_marshmallow.py
from selenium import webdriver
def get_questions_from_marshmallow():
counter = 1
questions = []
browser.get(root_url%str(counter))
while True:
if '表示できるメッセージがないようです' in browser.find_element_by_css_selector('body > main > div').text:
break
root_now_xpath = '/html/body/main/div/ul/li%s/div/div/div2/a' for i in range(2,33):
now_item = browser.find_elements_by_xpath(root_now_xpath%str(i))
if now_item:
questions.append (now_item0.text) try:
counter += 1
browser.get(root_url%str(counter))
except:
print("NoSuchElementException")
break
return questions
解答の方はTwitter上に流されているので、まずユーザー情報のページに有る「全ツイートの履歴をリクエスト」機能をつかって全ツイートを含むcvsファイルを取得しました。 全ツイートを含むcvsファイルから、マシュマロへの解答ツイートだけを抽出しました。
マシュマロへの解答は1つのツイートだけのものあれば、複数のツイートでできたスレッドによるものもあります。
スレッドになっている解答をあつめるために、解答ツイートのtweet_idをin_reply_to_status_idに含むツイートを集め、さらにそのtweet_idをin_reply_to_status_idに含むツイートを集め…を繰り返して、スレッド解答をまとめました。
code:get_answers_from_tweet_csv.py
import pandas as pd
def get_text(now_id):
return no_retweets[no_retweets'tweet_id' == now_id].text.values0 def thread(now_id):
# 元のidのtextを積む
text_data = get_text(now_id)
# 元のidをin_reply_to_status_idに含むものを探す
while len(has_in_reply_to_status_id)>0:
now_id = has_in_reply_to_status_id.tweet_id.values0 text_data += '\n' + get_text(now_id)
return text_data
def get_answer_from_tweet_csv():
tweets_df = pd.read_csv('tweets.csv')
# expanded_urlsを持つものだけを抽出
no_retweets_with_expanded_urls = no_retweets[no_retweets'expanded_urls'.notnull()] return answers
こうしてできた質問データと解答データを突き合わせて(手作業が少し必要だったのでExcel上でやりました)、
最後にjsonで書き出したものをScrapboxにインポートしました。
code:marshmallow_to_scrapbox.py
import pandas as pd
import json
import re
def qa2dict(now_qa):
book_list = re.findall('『^』+』' , now_answer) book_list = ['+ book + '' for book in book_list]
now_question_list = now_question.split('\n')
now_answer_list = now_answer.split('\n')
qa_dict ={}
qa_dict'lines' = ['','質問'] + now_question_list qa_dict'lines' += ['','解答'] + now_answer_list if book_list:
qa_dict'lines' += ['','文献'] + book_list return qa_dict
mash_df = pd.read_excel('マシュマロ全質問回答.xlsx')
dict_list = []
for mash_qa in mash_list:
dict_list.append(qa2dict(mash_qa))
pages_dict = dict(pages=dict_list)
f2 = open('mash.json', 'w')
json.dump(pages_dict, f2, ensure_ascii=False, indent=4, sort_keys=False)
以上となります。