*困っていること
teratailで気になること、後で読み返したいこと、忘れそうなことはクリップするようにしています。結果、忘れっぽいので膨大な数のクリップがたまっている状態です。
下記のsuyamaさんのアドバイスを受け、teratailのAPIを使ってデータを取得出来るところまできましたが、件数が20件に絞られています。
(「○○件中20件を検索したよ」のような情報は応答のjson形式の"meta"に収まっているようでした。)
*やりたいこと
サラッと検索できるような方法がありましたら教えていただけないでしょうか?
*調べたこと
少し前にteratail の過去遺産をもっと活用したいという記事があり、APIに目を通しましたが「クリップの検索」はないようでした。
teratailから提供されているAPIの、Python3での検証コード
- 1)
検証時にChromeでURLを直接開くと問題はなかったのですが、Pythonでそのまま走らせるとteratailのAPIがSSLの認証エラーではじかれました。なので、'ssl._create_default_https_context = ssl._create_unverified_context'のくだりを入れています。これはteratailのSSLの設定がおかしい?ということなのでしょうか…
- 2)
**やりすぎるとAPIから403
**されてしまいます。もし試される方が居ましたらやりすぎには気を付けてください。
2017-10-31 コード修正
suyamaさんのアドバイスを受け、ページをクロールしながらタイトルを拾えるところまでできました。ここまでできればあとはwxPythonか何かでGUIをつければOKですね。ここで一区切りにします。Pythonで検索しようとしている人の参考までにコードを載せます。
Python
1# coding: UTF-8 2import os 3import urllib.request 4import json 5import ssl 6import sys 7 8USER_NAME = "slash" 9 10# ------------------- 11# To avoid an error 12# ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:720) 13ssl._create_default_https_context = ssl._create_unverified_context 14 15URL = "https://teratail.com/api/v1/users/" + USER_NAME + "/clips?limit=100&page=" 16 17# ------------------- 18 19def downloader(page): 20 try: 21 # Get clip data from teratail 22 with urllib.request.urlopen(URL + str(page)) as response: 23 html = response.read() 24 text = html.decode('utf-8') 25 26 # Load clip data as json file 27 json_dat = json.loads(text) 28 # print(json.dumps(json_dat, sort_keys = True, indent = 4) 29 30 # Return clip data as dict type 31 return json_dat["meta"], json_dat["questions"] 32 except: 33 sys.exit("The process was terminated. You may got 403 error caused by excess access [30 access / hour * IP address].") 34 35def crop_titles(lst_questions): 36 # Crop dictionary from list 37 for dct in lst_questions: 38 # print( dct["created"] + " " + dct["title"]) 39 print(dct["title"]) 40 41if __name__ == "__main__": 42 # Initialize page index 43 page = 1 44 page_max = 1 45 46 # Crawl each pages 47 while page <= page_max: 48 meta, title = downloader(page) 49 page_max = meta["total_page"] 50 crop_titles(title) 51 page = page + 1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/10/28 12:06
退会済みユーザー
2017/10/29 22:25
退会済みユーザー
2017/10/29 22:31
退会済みユーザー
2017/10/29 22:33
退会済みユーザー
2017/10/30 02:48
退会済みユーザー
2017/10/30 09:36