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

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

新規登録して質問してみよう
ただいま回答率
85.35%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

2285閲覧

pymongoが起動しない

Kokku

総合スコア39

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/04/05 11:11

編集2020/04/05 13:32

開発環境
windows10
python3.8

pythonを使い対象のサイトをスクレイピングしようと思いpymongoモジュールをインストールしてコードに書き込み実行すると下記のようなエラーが出てしまいます。(pip install pymongo)とpowershellに入力。

エラー内容

PS C:\Users\shota\documents\scraping> python crawler_2.py Traceback (most recent call last): File "crawler_2.py", line 93, in <module> main() File "crawler_2.py", line 29, in main collection.create_index('key',unique=True) File "C:\Users\shota\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pymongo\collection.py", line 1995, in create_index self.__create_index(keys, kwargs, session, **cmd_options) File "C:\Users\shota\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pymongo\collection.py", line 1881, in __create_index with self._socket_for_writes(session) as sock_info: File "C:\Users\shota\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pymongo\collection.py", line 195, in _socket_for_writes return self.__database.client._socket_for_writes(session) File "C:\Users\shota\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pymongo\mongo_client.py", line 1266, in _socket_for_writes server = self._select_server(writable_server_selector, session) File "C:\Users\shota\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pymongo\mongo_client.py", line 1253, in _select_server server = topology.select_server(server_selector) File "C:\Users\shota\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pymongo\topology.py", line 233, in select_server return random.choice(self.select_servers(selector, File "C:\Users\shota\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pymongo\topology.py", line 192, in select_servers server_descriptions = self._select_servers_loop( File "C:\Users\shota\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pymongo\topology.py", line 208, in _select_servers_loop raise ServerSelectionTimeoutError( pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [WinError 10061] 対象のコンピューターによって拒否されたため、接続できませんでした。

コード

import re #reモジュールをインストールする import time import requests import lxml.html from pymongo import MongoClient def main(): """ クローラーのメイン処理 """ """ session = requests.Session() #複数のページをクロールするのでSessionを使う。 response = session.get('https://gihyo.jp/dp') urls = scrape_list_page(response) for url in urls: time.sleep(1) response = session.get(url) #Sessionを使って詳細ページを取得する。 ebook = scrape_detail_page(response) #詳細ページからスクレイピングして電子書籍の情報を得る。 print(ebook) #電子書籍の情報を取得する。 #break #まず1ページだけで試すため、break文でループを始める。 """ client = MongoClient('localhost',27017) #ローカルホストのMongoDBに接続する。 collection = client.scraping.ebooks #scrapingデータベースのebookコレクションを得る。 #データを一意に識別するキーを格納するkeyフィールドにユニークなインデックスを作成する。 collection.create_index('key',unique=True) response = requests.get('https://gihyo.jp/dp') #一覧ページを取得する。 urls = scrape_list_page(response) #詳細ページのURL一覧を取得する。 for url in urls: key = extract_key(url) #URLからキーを取得する。 ebook = collection.find_one({'key':key}) #MongoDBからkeyに該当するデータを探す。 if not ebook: #MongoDBに存在しない場合だけ、詳細ページをクロールする。 time.sleep(1) response = requests.get(url) ebook = scrape_detail_page(response) collection.insert_one(ebook) #電子書籍の情報をMongoDBに保存する。 print(ebook) #電子書籍の情報を表示する。 def scrape_list_page(response): """ 一覧ページのResponseから詳細ページのURLを抜き出す """ root = lxml.html.fromstring(response.content) root.make_links_absolute(response.url) for a in root.cssselect('#listBook a[itemprop="url"]'): url = a.get('href') yield url def scrape_detail_page(response): """ 詳細ページのResponseから電子書籍の情報をdictで得る。。 """ root = lxml.html.fromstring(response.content) ebook = { 'url': response.url, #URL 'key': extract_key(response.url), #URLから抜き出したキー 'title': root.cssselect('#bookTitle')[0].text_content(), #タイトル 'price': root.cssselect('.buy')[0].text.strip(),#価格(.textで直接の子である文字列のみを取得) 'content': [normalize_sapces(h3.text_content()) for h3 in root.cssselect('#content > h3')], #目次 } return ebook #dictを返す。 def extract_key(url): """ URLからキー(URLの末尾のISBN)を抜き出す。 """ m = re.search(r'/([^/]+)$',url) return m.group(1) def normalize_sapces(s): """ 連続する空白を1つのスペースに置き替え、前後の空白は削除した新しい文字列を取得する。 """ return re.sub(r'\s+', ' ',s).strip() if __name__ == '__main__': main()

このサイトでpymongoと検索をかけ、いろいろ原因を探ってみましたが、windows向けの回答が見つからなくネットで見てもわかりませんでした。

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

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

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

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

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

quickquip

2020/04/05 12:31

mongodbに関する情報(何をインストールしてどう設定してどう実行しているか)も追記しましょう。
Kokku

2020/04/05 13:32

ご指摘ありがとうございます。 追記しました。
quickquip

2020/04/05 14:46

mongodbの情報が一切書いてませんよ? mongodbが入っていなかったりしますか?
guest

回答1

0

念のために確認ですが、WindowsのサービスでMongoDBは実行中になっていますか?
もしなっていなければ、サービスを開始する必要があります。

イメージ説明

投稿2020/04/06 00:26

autumn_nsn

総合スコア335

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問