【スクレイピング】スクレイピングしたデータをMongoDBに保存した後、Robo 3Tで確認

スクレイピング
スクレイピングMongoDB準備記事
関連記事

【やりたいこと】MongoDBに保存とRobo 3Tでの確認!

スクレイピングがうまくいけば、次はデータの保存です!

MongoDB、Robo 3Tを使用して、データの保存・確認を行います。

では、さっそく、とりかかりましょう!

【10分でできる】keyの設定に注意!

※ダウンロード時間は10分の中に含まれていません。

1.使用したもの

・Virtual box

Oracle VM VirtualBox

・Vagrant

Vagrant by HashiCorp
Vagrant enables users to create and configure lightweight, reproducible, and portable development environments.

・Term Term

Tera Term (テラターム) プロジェクト日本語トップページ - OSDN
Tera Term は、オリジナルの Tera Term Pro 2.3 の原作者公認の後継版です。オープンソースで開発されており、UTF-8 表示に対応しています。 また、SSH1 対応モジュール TTSSH を拡張し、SSH2 プロトコルをサポートしています。

・Python3.4

・MongoDB

The most popular database for modern apps
We're the creators of MongoDB, the most popular database for modern apps, and MongoDB Atlas, the global cloud database on AWS, Azure, and GCP. Easily organize, ...

・PyMongo

・Robo 3T

Robo 3T - formerly Robomongo — native MongoDB management tool (Admin UI)

2.手順

※下記の記事の内容を完了しているものとして、進めていきます。

【スクレイピング】仮想マシンの起動
【やりたいこと】仮想マシンを起動させたい! 今回は、初めてのスクレイピング記事になります。 スクレイピング記事の大まかな流れとしては、 仮想マシンを構築→スクレイピング 以上の流れで進めていきます。 今回は、1記事...
【スクレイピング】仮想マシンでPythonスクリプトファイルの実行
【やりたいこと】Pythonスクリプトファイルを仮想マシンで実行させたい! 前回の記事「【スクレイピング】仮想マシンの起動」の続きです。 ホストOSでPythonスクリプトファイルを実行するには、そのファイルがあるフォルダに...
【スクレイピング】MongoDBに保存
スクレイピング準備記事 【やりたいこと】スクレイピングしたデータをMongoDBに保存してみたい! これまでのスクレイピング記事では、データをPCの共有フォルダに保存していました。 今回は、スクレイピン...
【スクレイピング】MongoDBに保存したデータを確認する方法(Robo 3T)
スクレイピング準備記事 関連記事 【やりたいこと】MongoDBに保存したデータを確認したい! 前回、抽出したデータをMongoDBに保存しました。 しかし、保存された場所...
【スクレイピング】記事ページからスクレイピング
スクレイピング準備記事 【やりたいこと】記事ページをスクレイピングしたい! 今までは、ブログのトップページからスクレイピングを行ってきました。 今回は、トップページから1記事選び、その記事のURL・タイ...
【スクレイピング】記事ページをクロール
スクレイピング準備記事 関連記事 【やりたいこと】複数の記事ページを取得したい! 前回は、トップページから1つの記事をスクレイピングしました。 今回は、トップページにあるすべての記...

①記事ページのURL確認

本サイトの記事ページを開き、URLを確認します。

記事ページは、トップページと違い、URLの後半にarchives/816が追加されています。

同様に他の記事ページも確認すると、記事ページ毎に、最後の数字がそれぞれ違うことが分かります。

②Pythonスクリプトファイルの作成

import time
import re

import requests
import lxml.html
from pymongo import MongoClient


def main():
"""
クローラーのメインの処理。
"""

client = MongoClient('localhost', 27017) # ローカルホストのMongoDBに接続する。
collection = client.scraping.pages # scrapingデータベースのpagesコレクションを得る。
# データを一意に識別するキーを格納するkeyフィールドにユニークなインデックスを作成する。
collection.create_index('key', unique=True)

session = requests.Session()
response = session.get('https://hk-ryukyu.club/hideto/') # トップページを取得する。
urls = scrape_list_page(response) # 記事ページのURL一覧を得る。
for url in urls:

key = extract_key(url) # URLからキーを取得する。

page = collection.find_one({'key': key}) # MongoDBからkeyに該当するデータを探す。

if not page: # MongoDBに存在しない場合だけ、記事ページをクロールする。
time.sleep(1)
response = session.get(url)
page = scrape_detail_page(response)
collection.insert_one(page) # 記事の情報をMongoDBに保存する。

print(page) # 記事の情報を表示する。


def scrape_list_page(response):
"""
トップページのResponseから記事ページのURLを抜き出す。
"""
root = lxml.html.fromstring(response.content)
root.make_links_absolute(response.url)

for a in root.cssselect('a[class="entry-card-wrap a-wrap cf"]'):
url = a.get('href')
yield url


def scrape_detail_page(response):
"""
詳細ページのResponseから記事の情報をdictで取得する。
"""
root = lxml.html.fromstring(response.content)
page = {
'url': response.url, # URL
'key': extract_key(response.url), # URLから抜き出したキー
'title': root.cssselect('h1[class="entry-title"]')[0].text_content(), # タイトル
'content': root.cssselect('div[class="toc-content"]')[0].text_content(), # 目次
}
return page # dictを返す。


def extract_key(url):
"""
URLからキーを抜き出す。
"""
m = re.search(r'(archives/\d+)', url)
return m.group(1)

if __name__ == '__main__':
main()

Pythonクローリング&スクレイピング サンプルコードpython_crawler_final.pyを参考 ※一部変更

上記のスクリプトを作成します。着目してほしい点は、以下の2つです。

1.

'key': extract_key(response.url), # URLから抜き出したキー

2.

def extract_key(url):

m = re.search(r'(archives/\d+)', url)
return m.group(1)

 

【1解説】

取得するデータにkeyを加えます。今回は、このkeyを①で確認した記事ページURLの後半部分にします。

【2解説】

正規表現を使用し、記事ページURLの後半部分を抽出します。抽出した文字列を返り値にします。

③実行と確認

②で作成したスクリプトを実行した結果、

複数の記事ページのURL・タイトル・目次を取得し、MongoDBに保存することができました。

Robo 3Tで実際に保存されているか確認しましょう。

確認した結果、

抽出した「URL・タイトル・目次・key」が保存されていることが分かります。

3.追記

うまくいかない場合は、Print()関数で変数を1つ1つ表示させてみましょう。

自分の思ったように表示されない変数があれば、それが悪さをしている可能性が高いです。

自分でエラーを解決できるようになると、もっと色んなことを勉強したくなります!

【最後に】参考図書の紹介

以下の書籍は、私がPythonスクレイピングを勉強するにあたって、使用した書籍です。

「Python逆引き大全」は、秀和システムの技術書読み放題サービス「10×Eng」で読めます。最初の2週間は無料、それ以降は、月額900円で利用できます。

「プログラミング超初心者が初心者になるためのPython入門」はkindle unlimitedで読めます。

 

コメント

タイトルとURLをコピーしました