Python
スクレイピング

Python記事の関連タグ番付表(2017年度版)を作成してみた

More than 1 year has passed since last update.


やること

Qiitaをスクレーピングして、Python記事の関連タグを調べ、番付表を作成する。


対象

2017年に投稿された記事


コード


python_tags.py

import requests

from bs4 import BeautifulSoup
import re
import operator
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

def scrape():
baseurl = 'https://qiita.com/tags/Python/items?page={}'
page = 1
tag_dict = {}
is_end = False

while not is_end:
print('page:', page)
url = baseurl.format(page)
html = requests.get(url).text
soup = BeautifulSoup(html, 'lxml')
items = soup.select('article.ItemLink')
cnt = 0

for item in items:
post_date = item.select('div.ItemLink__info')[0].text
post_date = re.search(r'(\S+\s\d+,\s\d+)', post_date).group(1).strip()
if post_date.split(', ')[-1] == '2016':
cnt += 1
if cnt > 5:
is_end = True
break
else:
continue

tags = [x.text.strip() for x in item.select('li.TagList__item')]
for tag in tags:
if tag not in tag_dict:
tag_dict[tag] = 1
else:
tag_dict[tag] += 1

page += 1

with open('python_tags.csv', 'w', encoding='utf-8') as f:
tag_list = sorted(tag_dict.items(), key=operator.itemgetter(1), reverse=True)
for tag in tag_list:
f.write(','.join(map(str, tag)) + '\n')

print('scrape done')

def make_graph():
tags = []
nums = []
with open('python_tags.csv', 'r', encoding='utf-8') as f:
for line in f:
tag, num = line.strip().split(',')
if 'python' not in tag.lower():
tags.append(tag + ' (' + num + ')')
nums.append(num)
if len(tags) == 20: break

tags = tags[::-1]
nums = nums[::-1]
x = np.arange(1, 21)

fig = plt.figure()
fp = FontProperties(fname=r'yugothib.ttf', size=10)
fig.patch.set_facecolor('white')
plt.barh(x, nums, tick_label=tags, align='center')
plt.yticks(fontproperties=fp)
plt.show()

def main():
scrape()
make_graph()

if __name__ == '__main__':
main()



結果

上位20位をプロットしてみた。機会学習・人工知能関連の記事が非常に多く投稿されていることが分かる。

Figure_1.png