Upgrade to Pro — share decks privately, control downloads, hide ads and more …

あなたのOrganizationどうなの?Qiita API と スクレイピング

あなたのOrganizationどうなの?Qiita API と スクレイピング

「自分/あの組織が使っている技術がわからない🤔」「QiitaのOrganizationはみつけたけどいまいちよくわからない🧐」という悩みに答えそうなモノ(Pythonスクリプト)を作りました📝

この発表で次の3点ができる…ようになる気がします
1. PythonのrequestsでAPIにGETリクエストを送る
2. PythonのrequestsとBeautifulSoup4でスクレイピングができる
3. Qiita APIとGitHub APIを実践的に使う

ソースコードはこちら
https://github.com/ysd-marrrr/100days-of-code-sample/blob/20190828-pt27-parital/20190807-pt27-scraping-qiita-organization-users/scraping_organization_user.py

Masataka Yoshida

August 29, 2019
Tweet

More Decks by Masataka Yoshida

Other Decks in Technology

Transcript

  1. スクレイピング(Beautiful Soup) !13 import requests response = requests.get(‘https://qiita.com/organizations/opst/ members’) 1.

    HTMLを取得する 2. HTMLをBeautiful Soupに読み込ませる from bs4 import BeautifulSoup html_soup = BeautifulSoup(response.text, features=‘html.parser’) requests.getで取得したHTMLは .text に入っているぞ!!
  2. スクレイピング(Beautiful Soup) !14 member_soup = html_soup.find('ul', attrs={'class', ‘p- organization_memberlist'}) member_list_soup

    = member_soup.find_all('div', attrs={'class', ‘od- MemberCardContent'}) 3. ほしい部分のclassを指定する .find
 一つ指定する .find_all
 すべて指定する
  3. スクレイピング(Beautiful Soup) !15 for m in member_list_soup: id = m.contents[0].find('span',

    attrs={'class', 'od- MemberCardHeaderIdentities_userid'}).contents[0] 4. .contents で中身を取り出す .find.contents -> @derui 必要に応じて更に .find してみたり、
 .contentsリストのインデックスを変えてみたり
 試す
  4. Qiitaに紐付いているGitHub ID • requestsにはレスポンスのJSONをdictに変換
 してくれる .json() がある! • 変換に失敗すると None

    が返ってくる !18 user_req = requests.get(‘https://qiita.com/api/v2/users/derui/’) user = user_req.json() user[‘github_login_name’] ▼ derui(github_login_name)
  5. Qiitaユーザーの投稿 • 投稿順に記事が並ぶ • 記事1件だけを取得したいときは per_page=1&page_1 !19 GET https://qiita.com/api/v2/users/derui/items?page=1&per_page=1 •

    記事の本文(HTML&Markdown) • 記事のタイトル • 記事のタグ • 記事の最終更新日 • 記事のいいね・閲覧数 • 記事を書いたユーザー などなど 記事の本文はまるまる返ってきて
 長いので注意
  6. GitHubのリポジトリ • リポジトリをフォークではなくイチから作っているか folk の値を見る • pushed_at はブランチを問わずpushされた時刻(UTC) !22 [

    { “full_name”: “derui/sxfiler”, “html_url”: “https://github.com/derui/sxfiler”, “folk”: false, “description”: “Simple and eXtensible Two-pane filer”, “language”: “TypeScript”, “pushed_at”: “2019-08-26T12:10:12Z”, … }, …
  7. リポジトリは30件/回のみ取得できる • 30件を超える場合は page パラメーターを設定する !23 Link: <https://api.github.com/user/97231/repos?sort=pushed&page=2>; rel="next", <https://api.github.com/user/97231/repos?

    sort=pushed&page=3>; rel="last" • レスポンスヘッダーの ”Links”に(必要に応じて)
 次・前・最初・最後のページのURLが載っている • rel=“next” が無くなるまでpagesをインクリメントすれ ばいいのでは GET https://api.github.com/users/derui/repos?sort=pushed&page=2
  8. 参考 • Qiita API v2ドキュメント - Qiita:Developer: 
 https://qiita.com/api/v2/docs •

    pythonでさくっとスクレイピング(Requests + Beautiful Soup 4) - Qiita: 
 https://qiita.com/Atupon0302/items/352811a2d92d6ebab8c2
 • Solved: Difference between "updated_at" and "pushed_at" in... - GitHub Community Forum: 
 https://github.community/t5/GitHub-API-Development-and/Difference-between- quot-updated-at-quot-and-quot-pushed-at-quot/td-p/22305
 !27