gotutiyan’s blog

競技プログラミングをやったりopenframeworksでお絵かきをしたりしています。

requestsとbeautifulSoup4でスクレイピングをしてみた

スクレイピングとは

webサイトから必要な情報を抜き出してくることです。

requestsとは

pythonのモジュールの一つで、httpの通信ができます

pip install requests

beautifulSoupとは

pythonのモジュールの一つで、webサイトのデータを入力して、それを解析し、良い感じに表示してくれるものです。 今回はbeautifulSoup4を使います。インストール時には、bs4で指定します。

pip install bs4

今回は、はてなブログのトップページを例に、webサイトの見出しとかリンクとかの文章を取ってきたいと思います。

いざ、スクレイピング

スクレイピングをするときには、requestsを用いてwebサイトのhtmlデータを取って来て、それをbeautifulSoupに投げることで、必要箇所を良い感じに抜き出します。

import requests
from bs4 import BeautifulSoup

res=requests.get("https://hatenablog.com")
res.encoding='utf-8'
bf=BeautifulSoup(res.text,'html.parser')

2つのモジュールをimportし、まずはwebサイトのhtmlを取ってきます。これはrequests.get(サイトのURL)で行えます。今回ははてなブログのトップページのURLを入れます。
これの返り値resはResponseオブジェクトと言って、url先のwebサイトの色々な情報が入ったものになります。

次にこれをbeutifulSoupに解析させます。res.textとすると、webサイトのhtmlがそのまま得られるので、これを入力にします。また、これに合わせて第2引数をhtml.parserにします。

これで、解析結果がbfの変数に入りました。bfにも、様々な情報が入っています。 bf.find_all(タグ名)を使うと、htmlタグを指定して、当てはまるものを全て閲覧できます。試しに、aタグを指定してみます。

for e in bf.find_all('a'):
    print(e)

結果は以下のようになります。

<a href="https://hatenablog.com/guide/pro?plus_via=service_top_nav">はてなブログPro</a>
<a href="https://blog.hyouhon.com/entry/2019/09/09/143003">タコの丸ごとピザを焼きました</a>
<a href="https://blog.hyouhon.com/entry/2019/09/09/143003">私的標本:捕まえて食べる</a>
<a href="https://blog.hyouhon.com/entry/2019/09/09/143003">// またタコ釣りに行ってきました。 楽しかったです。 ということで、タコのピザを焼いてみます。 タコは生のまま冷…</a>
......
<a href="https://itunes.apple.com/jp/app/hatenablog/id583299321" target="_blank"><img alt="Download on the App Store" src="https://cdn.blog.st-hatena.com/images/banner/Download_on_the_App_Store_Badge_US-UK_135x40.svg?version=5eb1a238a24f928783bfdf3e8b093e1b38aebe88&amp;env=production"/></a>
<a href="https://play.google.com/store/apps/details?id=jp.ne.hatena.blog" target="_blank"><img alt="Get it on Google Play" height="40px" src="https://cdn.blog.st-hatena.com/images/banner/google-play-badge.png?version=4576ad6d91e1b649ca7282cb6fffa97a00d3f9c4&amp;env=production"/></a>

aタグであるような部分が全て取れていることがわかります。最後にはgoogle playへのリンクまでありました。

でも、これではまだ見にくいので、getText()の関数を使います。

for e in bf.find_all('a'):
    print(e.getText())

結果は以下です。

はてなブログとは
はてなブログPro
『ぼくたちは勉強ができない』126話 感想、小美浪あすみにとって唯我成幸とは...?
ふわふわな日記
ぼく勉 問126 感想「先人はかの日に備え[x]を蓄積する」 『ぼくたちは勉強ができない』 最新話 感想 ネタバレ注意 今…






タコの丸ごとピザを焼きました
私的標本:捕まえて食べる
.....
カラースター
はてなダイアリー
日本語
English

htmlの性質上、<a>タグの中には単なるテキストだけではなくて、画像が入ることもあります。(<a><img src="hoge"></a>のようなパターン。)この時は、空行になります(多分)。

これは適当にif文でマシにすることはできます。(getText() != '' みたいな処理を挟めばいいので)

最後にコード全体です。

import requests
from bs4 import BeautifulSoup

res = requests.get("https://hatenablog.com")
res.encoding = 'utf-8'
bf = BeautifulSoup(res.text, 'html.parser')
for e in bf.find_all('a'):
    if e.getText() != '':
        print(e.getText())

他にも適当にURLを変えたり、all_find('h1')、all_find('p')など、色々変えて見ると面白いかもしれません。