



【やりたいこと】MongoDBに保存とRobo 3Tでの確認!
スクレイピングがうまくいけば、次はデータの保存です!
MongoDB、Robo 3Tを使用して、データの保存・確認を行います。
では、さっそく、とりかかりましょう!
【10分でできる】keyの設定に注意!
※ダウンロード時間は10分の中に含まれていません。
1.使用したもの
・Virtual box
・Vagrant

・Term Term
・Python3.4
・MongoDB

・PyMongo
・Robo 3T
2.手順
※下記の記事の内容を完了しているものとして、進めていきます。






①記事ページの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で読めます。
コメント