pysearch-masterを導入したいのですが、pymongoでエラーが出ます。
以前の投稿で、QtWebKit
の画像や動画を見られるようにするには?という質問を出し、ご指摘を受けましたので質問を分ける事にしました。
したいこと
Google検索エンジンなどのように、文字などを適当なラインにいれれば、検索候補を出してくれるようなものを自分のアプリに備え付けたいと思っています。現在QtWebKit
で、簡易的なブラウザを作っていて、ここに装着するようにしたいです。
見付けた手がかり
自分のパソコンでpython検索エンジンを動かしたい!
質問を出してしまってからこの質問の存在に気づいたので、以前の質問よりは大幅に内容を変更しました。ですが、これと同じような仕組みを導入したいので、これと全く同じものを、とにかく備え付けてみようと考えました。(なお、自分はまだこれを備え付けた事がないので、どれほどのものかはわからないのですが・・・。多分調べても、これ以上のものは見つからないと思います。)
二の舞
そこで、このコードを実行してみようと思い、ダウンロードをして導入して、crawler.pyを実行してみると、私も、このようなエラーが起きてしまいました。
ImportError: cannot import name 'MONGO_URL'
そこで、リンク先にあるように、from ..config import MONGO_URL
と打ってみました。
すると、
ValueError: attempted relative import beyond top-level package
となりました。
リンク先の質問では、ここはうまくいっていたように思えたのですが、自分ではこのようなエラーが発生してしまったのです。
リンク先の回答では、
MONGO_URL = 'mongodb://localhost:27017/test'
とするように書いてあったのでそうしてみました。それで上記のようなエラーが出ます。
要は、このMONGO_URLの名前を別の空間から取得したいのだろうと思ったものですから、
try:
from config import MONGO_URL
except ImportError as e:
MONGO_URL = 'mongodb://localhost:27017/test'
モジュール的な段階を完全に無視して、直接同一モジュール内で、MONGO_URLに値を入れ込んでやりました。ここで何かを大きく間違えた気がしていますが、(製作者の意図に沿わない方法なのではないかと考えています。)そのうえで、再度crawler.pyを実行してみました。
エラーは全く発生しませんでしたが、その代わり、何も発生しませんでした。(トップモジュールではないからですね。)
私の経験値
bs4,janome,pymongo,urllib.request,requests,config,argparse,flask
**全て使った経験がありません。**経験値0です。レベル1でロマリアに行く感じ。
しかし、質問者が、ここで、python manage.py crawler
とコマンドを打っておられるのを看まして、自分も見様見真似で、同じようにしてみました。
すると、
F:\pysearch-master>python manage.py crawler
Traceback (most recent call last):
File "manage.py", line 12, in <module>
crawl_web('http://docs.sphinx-users.jp/contents.html', 2)
File "F:\pysearch-master\web_crawler\crawler.py", line 72, in crawl_web
add_page_to_index(page_url, html)
File "F:\pysearch-master\web_crawler\crawler.py", line 60, in add_page_to_index
add_to_index(word, url)
File "F:\pysearch-master\web_crawler\crawler.py", line 41, in add_to_index
entry = col.find_one({'keyword': keyword})
File "C:\Users\***\Anaconda3\lib\site-packages\pymongo\collection.py", line 1262, in find_one
for result in cursor.limit(-1):
File "C:\Users\***\Anaconda3\lib\site-packages\pymongo\cursor.py", line 1189, in next
if len(self.__data) or self._refresh():
File "C:\Users\***\Anaconda3\lib\site-packages\pymongo\cursor.py", line 1087, in _refresh
self.__session = self.__collection.database.client._ensure_session()
File "C:\Users\***\Anaconda3\lib\site-packages\pymongo\mongo_client.py", line 1558, in _ensure_session
return self.__start_session(True, causal_consistency=False)
File "C:\Users\***\Anaconda3\lib\site-packages\pymongo\mongo_client.py", line 1511, in __start_session
server_session = self._get_server_session()
File "C:\Users\***\Anaconda3\lib\site-packages\pymongo\mongo_client.py", line 1544, in _get_server_session
return self._topology.get_server_session()
File "C:\Users\***\Anaconda3\lib\site-packages\pymongo\topology.py", line 427, in get_server_session
None)
File "C:\Users\***\Anaconda3\lib\site-packages\pymongo\topology.py", line 199, in _select_servers_loop
self._error_message(selector))
pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [WinError 10061] 対象のコンピューターによって拒否されたため、接続できませんでした。
一体何が起きているのでしょうか?
素直な初見では、階層構造がよくわからないし、製作者の意図がわからなかったです。
1.config
モジュールが別階層で2つ存在している点。
2.web_crawler
モジュールから、collection
の名前を呼び出しているのに、
web_crawler
モジュール内に、collection
という名前のファイルが存在しない点。
(私は、web_crawler
というモジュール(このpysearch-masterに元々あるやつではないもの)を、インストールしました。これと同じモジュールがconda install
できたからです。しかし、製作者は個人で同じ名前のモジュールを作成しています。そのどちらにも、collection
という名前はなかったのですが・・・。)
3.name == "main"コードが、manage.py
と、drop_collection.py
の
両方に存在しているため、どちらをトップレベルのモジュールとして想定していたのかが私からは判断しにくかったということ。
4.drop_connection
モジュールの中で、url_parse
という定義されていない変数が普通に使われていること。
5.col
を、collection as col
として呼び出しているのに、その後にすぐ、col = ...
という形で、名前を生成し、変数をいれこんでいること。
6.後、conda install config
も出来た気がします。
私よりもずっとレベルが高い人が書いたコードでしょうから、謎が多いのですが、全てのモジュールの外観を最低でもつかむ必要があるかもしれません。しかし、既に解決済みの質問をなぞっていくとできるかなと思ったのですが、やはりそんな甘いものではありませんでした。コードの全体量は、合わせてもせいぜい100行程度なのですが・・・。
Windows-10
python3.6.3