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&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&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')など、色々変えて見ると面白いかもしれません。