Qiita API를 사용하여 기사 데이터를 얻는 방법

16757 단어 QiitaAPI파이썬Qiita

소개



【첫 투고】
Qiita에 있는 기사를 태그를 지정해 취득하고 싶다고 하는 것으로 Python으로 구현해 보았습니다.
원래 작업한 이유로 Livedoor 뉴스 코퍼스를 사용하여 기사의 카테고리를 기계 학습으로 분류하고 있고, 비슷한 것을 Qiita의 기사에서도 할 수 있으면 좋겠다는 조언을 받았기 때문입니다. . .
다소 코드를 쓰는 방법에 알기 어려운 점이 있을지도 모릅니다만, 그 때는 코멘트등에서 가르쳐 주시면 좋겠습니다.

Qiita API 정보



Qiita가 제공하고 있는 다양한 데이터의 취득·기사의 투고등을 할 수 있는 Web-API입니다.
htps : // 코 m/아피/v2/도 cs

기사의 취득에는 상한이 있어, 한 번에 page의 상한은 100, per_page(page 마다 몇개의 기사를 취득할까)의 상한은 100이므로, 최대 10000 기사 취득할 수 있는 것입니다.

그러나 사용자 인증이 필요하므로 조심하십시오.

인증하는 상태에서는 사용자당 1시간에 1000회까지, 인증하지 않은 상태에서는 IP 주소당 1시간에 60회까지 요청을 수락합니다. (Qiita API 공식에서)

이번에는 1 페이지마다 1 기사를 합계 900 기사 취득하고 싶으므로 page=100, per_page=1 x 9회 실시합니다.

Qiita API 액세스 토큰을 얻는 방법



우선은, 사용자 인증에 필요한 액세스 토큰을 취득합니다.

· "설정"에서 "응용 프로그램"을 선택


・「개인용 액세스 토큰」→「새로운 토큰 발행」


・이번은, read_qiita만 체크 마크를 넣어 「발행한다」


· 토큰이 발행되므로 복사


Qiita API의 사용자 인증을 수행하는 코드의 예


# ユーザ認証に必要なヘッダー
h = {'Authorization': 'Bearer 【取得したアクセストークン】'}
connect = http.client.HTTPSConnection("qiita.com")
url = "/api/v2/items?"

기사를 얻는 코드의 예


# 取得したいタグを指定
query = "&query=tag%3A" + tag_name
# 検索で指定した期間内に作成された記事数を取得
connect.request("GET", url + query, headers=h)
# 要求に対する応答
res = connect.getresponse()
# 応答の読み出し
res.read()
# サーバーからの応答
print(res.status, res.reason)
total_count = int(res.headers['Total-Count'])
print("total_count: " + str(total_count))
# データを取得してtxtファイルに100個記事を書き出す
for pg in range(100):
    pg += 1
    page = "page=" + str(pg) + "&per_page=1"
    connect.request("GET", url + page + query, headers=h)
    res = connect.getresponse()
    data = res.read().decode("utf-8")
    # jsonファイルのデータをpandas.DataFrame形式で格納
    df = pd.read_json(data)
    # txtファイルの指定
    filename = "./qiita/" + tag_name + "/page/" + str(pg) + ".txt"
    # Qiitaの記事からタイトルと本文を取得
    df.to_csv(filename, columns=[
       'title',
       'body',
    ], header=False, index=False)
    print(str(pg) + "/" + str(100) + " 完了")

위 코드 해설



사용자 인증



사용자 인증의 경우 헤더에h = {'Authorization': 'Bearer 【取得したアクセストークン】'}와 같이 인증을 위한 토큰을 지정해 줄 필요가 있습니다.

json 파일 얻기



Qiita API는 게시된 데이터가 json 파일입니다.
htps : // 코 m/아피/v2/두 cs#%에6%8아%95%에7%아8%BF

우리는 pandas 라이브러리의 read_json 함수를 사용하여 pandas의 DataFrame 형식으로 변환합니다.

지정한 태그의 기사를 900개 취득하는 코드



여기가 코드 전체가됩니다.
# ライブラリのインポート
import http.client
import pandas as pd
import time
# 取得したいページ数
TOTAL_PAGE = 900
TIME = int(TOTAL_PAGE / 100)
PER_PAGE = 1

# ユーザ認証
h = {'Authorization': 'Bearer 【取得したアクセストークン】'}
connect = http.client.HTTPSConnection("qiita.com")
url = "/api/v2/items?"

# 指定するタグ
tag_name = "Java"

# カウント変数
num = 0
pg = 0
count = 0

# tag別に記事をPAGEだけ繰り返し取得
query = "&query=tag%3A" + tag_name
# 検索で指定した期間内に作成された記事数を取得
connect.request("GET", url + query, headers=h)
# 要求に対する応答
res = connect.getresponse()
# 応答の読み出し
res.read()
# サーバーからの応答
print(res.status, res.reason)
print("指定しているタグ: " + tag_name)
total_count = int(res.headers['Total-Count'])
print("total_count: " + str(total_count))

# データを取得してtxtファイルに900個記事を書き出す
for count in range(TIME):
    count += 1
    for pg in range(100):
        pg += 1
        page = "page=" + str(pg) + "&per_page=" + str(PER_PAGE)
        connect.request("GET", url + page + query, headers=h)
        res = connect.getresponse()
        data = res.read().decode("utf-8")
        df = pd.read_json(data)
        filename = "./qiita/" + tag_name + "/page" + str(count) + "-" + str(pg) + ".txt"
        df.to_csv(filename, columns=[
            'title',
            'body',
        ], header=False, index=False)
        print(str(count) + ":" + str(pg) + "/" + str(100) + " 完了")

결과



이해하기 어렵지만 900 기사를 얻을 수있었습니다.



요약



이번에는 기사의 제목과 본문을 지정하여 취득했습니다. 봐!

참고 자료



· Qiita API 공식
htps : // 코 m/아피/v2/도 cs

· Qiita의 기사 정보를 API로 취득하여 CSV에 내보내기
htps : // 코 m / 어이 쿠 쿠 / ms / 94902fc0 686 59cb8c5

좋은 웹페이지 즐겨찾기