###まえがき
・自分は全くの初心者、または学習を始めたばかりの者になります
・自分なりに考察したものを記入していますが、間違えている事があれば指摘して頂けると幸いです
・ほとんどが自分の為の、メモ書きみたいなものになっています
#今回の目的
サイトの中の記事のタイトルとそのタイトルのリンク(url)を取得します
#WEBスクレイピング
・webスクレイピングとは、webサイトから任意の情報を取得する技術
##項目
###requestsについて
requestsはサーバからHTML、XMLを取得するのに使用するライブラリ
###BeautifulSoupについて
BeautifulSoupはスクレイピングを使用するライブラリ
##実践していきながら、解説します
###使用するモジュールやライブラリをimportします
まずは、requestsライブラリとBeautifulライブラリをimportします
コードについては、以下になります
import requests
from bs4 BeautifulSoup
*ちなみにrequestsとBeautifulSoupのインストールが済んでいない方は、インストールを済ませてからじゃないと動きません。インストール方法は記載しませんので、各自で確認して頂けると幸いです。
###スクレイピングするサイトからurlを取得します
*この記事では、https://youtu.be/6F2Po-CCX9cを参考にさせて頂きます
・今回使用するサイトは、「ハムスター速報」になります。
以降はハム速と略していきます。
まずは、ハム速をGoogle Chromeで検索していきます。
ハム速をクリックして、サイト内に入り、urlをクリックからコピーします
すると、http://hamusoku.com/
こちらのurlがコピーできたと思います。
###HTMLからサーバを取得します
先ほど取得したurlで、サーバからHTMLを取得します
page_url = "http://hamusoku.com/"
r = requests.get(page_url)
page_urlにurlを代入します
次に、requestsのget関数でサーバから取得したHTMLをrに代入します
###BeautifulSoupを使用して、HTMLを解析(パーサー)します
soup = BeautifulSoup(r.text, features='html.parser')
BeautifulSoup()の記述方法は、
BeautifulSoup(解析対象のHTML/XML, 利用するパーサー)になります。
今回は第二引数の属性として、featuresを指定してますが、なくても大丈夫だと思います。
soup = BeautifulSoup(r.text, 'html.parser')
###記事タイトルを取得する
記事タイトルを取得するためには、ハム速のHTMLの構造を知る必要があります。
その方法として、
一つ目
・chromeのデベロッパーツールを使用します。
・上のTabバーから表示を選択して、開発/管理を選択、デベロッパーツールを選択します。
・コードが書かれている上の方の、Elementsを選択すると、HTMLのソースが表示されます。
・Elementsの左にある四角と矢印のアイコンをクリックすると、サイト内でマウスを動かすとハイライトされた部分HTMLがなんなのか分かります。
二つ目
・知りたいHTMLに概要する場所を、右クリックして、検証を選択します。
・そして記事タイトルのHTMLを取得します。
取得方法ですが、検証してみるとaタグでurlが記述されているのが分かります。
そして、このaタグはh1タグの中にあります。h1タグのclass名を使えば、全ての記事タイトルの取得できる予想ができます。
aタグでも取得することが、出来ます。
h1_tags = soup.find_all('h1', class_="article-title")
find_allメソッドは、
Tagオブジェクトが持つ子孫要素のうち、引数に一致する全ての要素を取得します。
soup.Tagオブジェクト.find_all(name, attrs, recursive, text, limit, キーワード引数)
今回のfind_allでは、name引数の文字列とキーワード引数が使われています。
h1に該当する文字列とclass_="article-title"に概要するキーワードで取得します。
*classの後ろに_を記述しないといけない
取得できたものを、h1_tagsに代入します。
###色々な出力方法
これを実行すると、指定された引数の記事タイトルの情報を全て取得する
かなりの量なので、ここには記載しないので、自身で確認してもらいたい。
print(h1_tags)
これを実行すると、一番目に指定したものが出力される
[1]の場合は、二番目のもの
print(h1_tags[0])
これは、指定されたh1タグの中にあるaタグだけを取得する
print(h1_tags[0].find_all('a'))
aタグが複数ある場合は、選択することも可能
find_all('a')[0]のように
print(h1_tags[0].find_all('a')[0])
または属性から選択することも可能
attrsはattributes(属性)
print(h1_tags[0].find_all('a', attrs={"rel": "bookmark"}))
# attrs={"key": "varue"}
textのみを取得、またはリンクのみ取得
# text
print(h1_tags[0].find_all('a')[0].text)
# link
print(h1_tags[0].find_all('a')[0].get("href"))