質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

1132閲覧

djangoプロジェクト内にある他のフレームワークにデータを渡す場合DBで問題ないでしょうか。それよりいい方法があれば教えていただきたい

grilled_python

総合スコア237

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/09/18 12:39

編集2018/09/19 13:22

djangoのviewsで取得したURL(リストで最大50件)をscrapyに渡してスクレイピングするという方法を取っています。

同じプロジェクト内の異なるアプリ同士のデータのやり取りに付いての方法についてお聞きしたいです。

質問1つ目
DBに保存が必要ないデータを(しかしscrapyを動かすのには必要)、同じプロジェクト内の別のフレームワーク間でやり取りする場合どのようにするのがベストなのでしょうか?速度、メモリなど
保存しなくてもいい情報をDBに保存するのは速度的によくないと思っているのですが、
あまり気にしなくてもいいのでしょうか?

質問2つ目
sessionは一時的に使う情報を取り扱う場所との認識がありますが、このような使い方は間違っていたりするのでしょうか?

質問3つ目
io.StriongIO、pickle、shelveなどが(この3つは使用したことがまだありません)
使用できる様な気がするのですが間違ってますでしょうか?
ご教授頂ければ幸いです。よろしくお願いいたします。

この様な構成のプロジェクトがあります。
my_project
|_config
|_apps
|_main_app
| |_models.py
| |_views.py
| |以下省略
| |
...
|_scrapy_app

一見隣同士に見えるmin_app(django)とscrapy_app。最初はdjangoの様にデータが受け渡せると勘違いしておりました。

そこでscrapy_appのsettigs.pyに書きの三行をいれてdjangoの設定を使えるようにしました。
myproject/apps/scrapy_app/scrapy_app/settigs.py

import os import sys import django sys.path.append(os.path.dirname(os.path.abspath('../'))) os.environ['DJANGO_SETTINGS_MODULE'] = 'config.settings' django.setup()

これでscrapy内でモデルなどdjangoと同じ様に使えるようになりました。

from apps.main_app.models import SiteData #モデルが使用できるようになった! def start_requests(self): # データベースから取り出した文字列から不必要なものを取り除いてlistにしてscrapyに渡している 中身はhttpsから始まるurlのリスト site_data = SiteData.objects.get(pk=self.unique_id) google_results = site_data.google_results urls = google_results.translate(str.maketrans({"[": None, "]": None, "'": None, ",": None})).split() for url in urls: yield Request(url=url, callback=self.parse)

djangoのviewsでurlを取得 => DB => scrapy という流れです。
最初はsessionにurlを保存してscrapyへという流れで動かしたのですが、sessionの使い方として正しくない様な気がしてDBに保存しました。
しかし、このURLはscrapyを動かすのに使うだけでDBに保存するようなものでもないような気がします。
1.django viewsでURLの取得の処理
2.DBに保存するか、なんらかのモジュールを使ってデータを保持
3.scrapy内でURLを使用

ご回答のほどよろしくお願いいたします。

win10
python3.6.5
django2.0
scrapy1.5
sqlite3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

詳細はしっかり読めてませんが簡単な回答を示します。

A1. 早すぎる最適化は悪という格言があります。実際にボトルネックになるまではDBに保存して他のフレームワークとやり取りするのがベターだと思います。
A2. その認識でOKです。 (すいませんが、コードはちゃんと読んでません。)
A3. スクレイピングした結果をshelveなどで保存するという意味でしょうか。
自分の場合ですとshelve, pickleはpythonでしか取扱えないデータフォーマットなので後々python以外の言語を使いたいという事になったときに困ったことになります。なので、言語にしばられないデータフォーマット、例えばjsonといったどの言語でも簡単に扱えるデータフォーマットでデータを保存するのが良いように思います。

投稿2018/09/23 12:18

yuokada

総合スコア550

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

grilled_python

2018/09/23 15:06

回答ありがとうございます。経験がないものですから色々と無駄に考えてしまっていたようです。とりあえずDBを使用していこうと思います。
guest

0

dbに保存するべきかpickleに保存するべきかという疑問に対して、「Pythonクックブック」にそのまま答えが乗っていたのでアウトプットを兼ねて書いておきます。

以下 「Pythonクックブック」から抜粋

データベースとpickleのどちらを使うべきか。

データベースは「データ」に関するものだ。つまりは、文字列や数字のような基本的なデータを蓄えたり、引き出したりする際に用いる。
選択や検索をする手助けもしてくれるし、Python以外の言語からも利用することができる。
これらのデータベースとシリアライズという2つのアプローチは一緒に使う事もできる。
お互いを補完する関係なのだ。

今回の場合だと取得してきたurlは選択や検索を必要としないのでDBに保存せずpickleなどで一時的に保存。

またスクレイピングで取得してきた情報は再利用の可能性があれば、uokada様の回答の様にjsonなどで保存するのがベストだと考えました。
重ねてお礼申し上げます。

投稿2018/09/28 12:47

grilled_python

総合スコア237

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問