ストックドッグ

KatoTakahiro。金融系の会社で働くSEが株やPython、その他諸々について書いています。サービスも運営してます→http://fmbrain.work

BeautifulSoupで東証一部の会社をかき集める 〜Python〜

OS:Ubuntu
言語:Python3系

BeautifulSoupを使って、ウェブサイトからスクレイピングし、東証一部の会社を全てcsvファイルに書き込みます。

なぜこんなことをするかというと、株を売買するさいの会社選びを楽にするためです。
私は、東証一部に上場している会社の株しか買わないので、CSVファイルにまとめておくと、あとはそこから条件で絞り込んだりするだけで済むので楽なのです。

前置きはさておき、今回はこちらのウェブサイトをスクレイピングします。
www.jpubb.com


このサイトを見てみるとわかるとおり、だいたい2000近くの企業が東証一部に上場しています。
このサイトでは、2000の企業を40ページに分けて掲載しているようです。

とりあえず、BeautifulSoupをインポートします。
urllibは、URLを読み込む際に使用するので、合わせてインポートします。
pandasは、読み込んだウェブサイトの内容を保存するために使用します。
ま、わからなくてもあとで解説するので、とりあえずインポートしときましょう笑

from bs4 import BeautifulSoup
from urllib.request import urlopen
import pandas as pd

このサイトのURLの構造なのですが、いたってシンプルで、
http://www.jpubb.com/list/list.php?se=tou1&pageID= + ページ番号
となっています。
例えば、
http://www.jpubb.com/list/list.php?se=tou1&pageID=5
これで5ページ目が表示されます。

なので、for文でページ番号分ぶん回して、ページ内容をとってくることにしました。
とってきたページに載っている会社の「証券コード」と「企業名」を、codeとnameのリストに入れています。

code = []
name = []
for page in range(1,41):
	url = "http://www.jpubb.com/list/list.php?se=tou1&pageID=" + str(page)  #ページURL + ページ番号
	html = urlopen(url)  #urllibのurlopenを使って、URLを読み込む
	soup = BeautifulSoup(html, "lxml")  #BeautifulSoupでHTMLを読み込む

	for i in soup.find_all("td", class_="code"):  #証券コードをcode=[]に入れる
		code.append(i.string)

	for o in soup.find_all("td", class_="name"):  #企業名をname=[]に入れる
		name.append(o.string)

これで、40ページ分の証券コードと企業名がリストに入りました。
なので、これをpandasのDataFrameの形式で保存します。
DataFrame形式にすることでCSVファイルにしやすくなります。

df = pd.DataFrame({"name":name, "code":code})

保存したデータの内容はこんな感じです。
f:id:doz13189:20160821153330p:plain

仕上げに先ほどDataFrameに保存した内容をCSVファイルに書き込みます。

df.to_csv("tosho1.csv", header=False, index=False)

保存したCSVファイルはこんな感じになっていると思います。
f:id:doz13189:20160821153523p:plain

ソースコードをまとめて貼っておきます。

from bs4 import BeautifulSoup
from urllib.request import urlopen
import pandas as pd


code = []
name = []
for page in range(1,3):
	url = "http://www.jpubb.com/list/list.php?se=tou1&pageID=" + str(page)
	html = urlopen(url)
	soup = BeautifulSoup(html, "lxml")

	for i in soup.find_all("td", class_="code"):
		code.append(i.string)

	for o in soup.find_all("td", class_="name"):
		name.append(o.string)


df = pd.DataFrame({"name":name, "code":code})

print(df)
df.to_csv("tosho1_fake.csv", header=False, index=False)

とりえあず、今回はここまでです。
私はこのファイルに売買高や1株の価格などを追加して、ソートしています。
あとは個人個人、自由にやっていただければ、って感じですね!