開発環境
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向けの回答が見つからなくネットで見てもわかりませんでした。