tseを使って未投稿があるQiita Advent Calendarをさらす

  • 6
    いいね
  • 0
    コメント

はじめに

この記事は、クローラー/Webスクレイピング Advent Calendar 2016 8日目の記事です。
出遅れてしまってすみませんでしたorz

ここでやること

自分が出遅れたことは棚に上げて、他のAdvent Calendarにも未投稿者がいないかどうか調べてみようと思います。

Pythonによるテキスト整形ツールtsebeautifulsoup4を使って、Qiitaからデータを抽出します。

tseとは?

詳しくはPyCon JP 2015で石本さんが発表されたスライドを見れば、理解できるかと思います。
tse - Pythonによるテキスト整形ユーティリティ

今回使用するtse用例

-ms  -- <モジュール名 import * 形式>でインポートする
-b   -- 起動直後に実行するアクション
{{}} -- インデントするブロックを指定

環境

Python 2.7.10

実際にやってみる

カテゴリ一覧

$ curl http://qiita.com/advent-calendar/2016 | tse -ms 'bs4' -b 'for a in BeautifulSoup(sys.stdin.read(), "lxml").find_all("a", class_="adventCalendarCard_block_showAll"):{{print(a.get("href"))}}' > categories.txt
categories.txt
/advent-calendar/2016/categories/to_be_decided
/advent-calendar/2016/categories/programming_languages
/advent-calendar/2016/categories/libraries
/advent-calendar/2016/categories/databases
/advent-calendar/2016/categories/web_technologies
/advent-calendar/2016/categories/mobile
/advent-calendar/2016/categories/devops
/advent-calendar/2016/categories/iot
/advent-calendar/2016/categories/os
/advent-calendar/2016/categories/editors
/advent-calendar/2016/categories/academic
/advent-calendar/2016/categories/services
/advent-calendar/2016/categories/company
/advent-calendar/2016/categories/miscellaneous

カレンダー一覧

$ cat categories.txt | while read line; do curl http://qiita.com$line | tse -ms 'bs4' -b 'for td in BeautifulSoup(sys.stdin.read(), "lxml").find_all("td", class_="adventCalendarList_calendarTitle"):{{print(td.find_all("a")[-1].get("href"))}}' >> calendars.txt; done
calendars.txt
cat calendars.txt
/advent-calendar/2016/chat-bot
/advent-calendar/2016/idd
/advent-calendar/2016/enough
/advent-calendar/2016/rite
/advent-calendar/2016/befool
~
/advent-calendar/2016/bookthankyou
/advent-calendar/2016/muscle
/advent-calendar/2016/ue4_inside
/advent-calendar/2016/job
/advent-calendar/2016/job2

未投稿カレンダー一覧

$ cat calendars.txt | while read line; do curl http://qiita.com$line | tse -ms 'bs4' -b 'bs=BeautifulSoup(sys.stdin.read(), "lxml"){{}}if bs.find("div", class_="adventCalendarItem_cancelButton"):print("[" + bs.title.string.split("- Qiita")[0].strip().encode("utf-8") + "](http://qiita.com" + bs.find(id="redirect_path").get("value")  + ")")' >> not_post_calendars.md; done

※ 12/10 5:00時点

儀式 Advent Calendar 2016
Dart Advent Calendar 2016
F# Advent Calendar 2016
Java Puzzlers Advent Calendar 2016
JavaScript Advent Calendar 2016
Lisp Advent Calendar 2016
Perl 5 Advent Calendar 2016
PHP Advent Calendar 2016
PHPで何かを作る Advent Calendar 2016
Pythonでマイクラ風FPS AOSを遊び倒す Advent Calendar 2016
Smalltalk Advent Calendar 2016
Clojure Advent Calendar 2016
D言語 Advent Calendar 2016
Go Advent Calendar 2016
Go (その3) Advent Calendar 2016
Haskell Advent Calendar 2016
mruby Advent Calendar 2016
R Advent Calendar 2016
Rust その2 Advent Calendar 2016
Scala Advent Calendar 2016
Swift その2 Advent Calendar 2016
一人PHP総復習 Advent Calendar 2016
A-Frame Advent Calendar 2016
Django Advent Calendar 2016
Docker2 Advent Calendar 2016
Grimoire.js Advent Calendar 2016
GStreamer Advent Calendar 2016
phina.js Advent Calendar 2016
React Native Advent Calendar 2016
ROS Advent Calendar 2016
RxJava Advent Calendar 2016
RxSwift Advent Calendar 2016
Angular Advent Calendar 2016
Laravel Advent Calendar 2016
Ruby on Rails Advent Calendar 2016
Unity Assets Advent Calendar 2016
Vue.js Advent Calendar 2016
Firebird Advent Calendar 2016
MySQL Casual Advent Calendar 2016
eZ Publish / eZ Platform Advent Calendar 2016
jupyter notebook Advent Calendar 2016
Markdown Advent Calendar 2016
Microservices Advent Calendar 2016
Webサイトパフォーマンス Advent Calendar 2016
Windows Device Portal Advent Calendar 2016
アドエビスエンジニアの集い Advent Calendar 2016
フロントエンドエンジニア Advent Calendar 2016
CSS Advent Calendar 2016
TECHSCORE Advent Calendar 2016 Advent Calendar 2016
クローラー/Webスクレイピング Advent Calendar 2016
一人PostCSS Advent Calendar 2016
Appcelerator Titanium Advent Calendar 2016
IBM MobileFirst Advent Calendar 2016
Androidその2 Advent Calendar 2016
iOS Advent Calendar 2016
iOS その2 Advent Calendar 2016
iOS その3 Advent Calendar 2016
Xamarin Advent Calendar 2016
PowerShell Advent Calendar 2016
SORACOM Advent Calendar 2016
JavaScript Robotics Advent Calendar 2016
myThings Advent Calendar 2016
Raspberry Pi による乳児モニタリングシステムの開発 Advent Calendar 2016
Windows 10 IoT Core Advent Calendar 2016
NetBSD Advent Calendar 2016
Solaris Advent Calendar 2016
Linux Advent Calendar 2016
Emacs Advent Calendar 2016
Visual Studio Code Advent Calendar 2016
オーバレイネットワーク Advent Calendar 2016
なんでもセキュリティ Advent Calendar 2016
ヒューマンコンピュータインタラクション論文紹介 Advent Calendar 2016
Machine Learning Advent Calendar 2016
機械学習に必要な高校数学やり直しアドベントカレンダー Advent Calendar 2016
言語実装 Advent Calendar 2016
DevRel Advent Calendar 2016
DIVE INTO CODE Advent Calendar 2016
GitLab Advent Calendar 2016
IDCF Cloud Advent Calendar 2016
Google Cloud Platform(1) Advent Calendar 2016
Kubernetes Advent Calendar 2016
Microsoft Azure Advent Calendar 2016
クソアプリ Advent Calendar 2016
BRIGHT VIE エンジニア Advent Calendar 2016
dotstudio Advent Calendar 2016
Engraphia Advent Calendar 2016
Fablic Advent Calendar 2016
Fujitsu extended Advent Calendar 2016
Hortonworks Advent Calendar 2016
ids-info (東京大学教養学部学際科学科総合情報学コース) Advent Calendar 2016
iRidge Advent Calendar 2016
KAYAC Advent Calendar 2016
KOIL CSC Advent Calendar 2016
Morning Project Samurai Advent Calendar 2016
N高 Advent Calendar 2016
Okinawa.go Advent Calendar 2016
Okinawa.rb Advent Calendar 2016
Perl入学式 Advent Calendar 2016
Scoville Engineers Advent Calendar 2016
Seattle Consulting Advent Calendar 2016
TokyoSW Advent Calendar 2016
Wondershake Advent Calendar 2016
アラタナ Advent Calendar 2016
ランサーズ Advent Calendar 2016
情報科学専門学校 Advent Calendar 2016
数理システム Advent Calendar 2016
日本情報クリエイト Engineers Advent Calendar 2016
東京理科大学 Advent Calendar 2016
Atrae Advent Calendar 2016
eureka Advent Calendar 2016
Goodpatch Advent Calendar 2016
HAL Advent Calendar 2016
IT勉強会/コミュニティ運営 Advent Calendar 2016
mixiグループ Advent Calendar 2016
Opt Technologies Advent Calendar 2016
Sansan Advent Calendar 2016
Yahoo! JAPAN Tech Advent Calendar 2016
インタープリズムの面々が、普段の業務に役立つ記事を丹精込めて書き上げる! Advent Calendar 2016
フューチャーアーキテクト Advent Calendar 2016
炎の型工房 ScratchとDartでゲームプログラム入門 Advent Calendar 2016
CloudAnalytics Advent Calendar 2016
Hunachi^shoujin0^algorithm0 Advent Calendar 2016
Product Manager Advent Calendar 2016
Product Owner Advent Calendar 2016
Stream Processing Advent Calendar 2016
Student Advent Calendar 2016
test Advent Calendar 2016
レイトレ Advent Calendar 2016
下請けCOBOLERとして生きていた頃のノウハウ Advent Calendar 2016
個人開発者 Advent Calendar 2016
可視化 / Data Visualization Advent Calendar 2016
絵文字 / Emoji Advent Calendar 2016
acairojuni Advent Calendar 2016
Aizu Advent Calendar 2016
FLASHer Advent Calendar 2016
HoloLens Advent Calendar 2016
Serverless(2) Advent Calendar 2016
チャットボット Advent Calendar 2016
ひとりVRカレンダー Advent Calendar 2016
ポエム Advent Calendar 2016
技術書献本大感謝 Advent Calendar 2016

おわりに

全て 未投稿
509 141

結果はこのようになりました。

現時点では全体の28%です。
2016年を気持ちよく終えられるよう、後日投稿・代理投稿を駆使して未投稿カレンダーの割合を減らせるよう皆さん張り切っていきましょう!