Windows10 + Python3.6 + Scrapyの環境構築でハマったところ

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

こんにちは、おてらです。

近頃色々なことに手を出していて何に力を入れればいいのか分からなくなりつつあります。

しかしながらPythonの勉強は続けている訳ですが、最近「Pythonエンジニア ファーストブック」という本が出版されましたので購入して一通り読み進めているところです。

今回はこちらの本の4章でScrapyを利用してスクレイピングを行う場面があるのですが、そちらの環境構築でハマったポイントを記事にしておきます。

Scrapyとは

ScrapyとはPythonでWebスクレイピングやクローリングを行う際のフレームワークです。

詳細な説明は以下のQiitaの記事をご参照ください。(私が書いたものではありません。)

Scrapy入門(1)

私も今回スクレイピングは初めてやってみたのですが、非常に簡単にクローリング、スクレイピングすることが出来ました。

環境構築

仮想環境を作る

前提条件としてPython3.6を利用しています。

まずは例によって例のごとく仮想環境を作成し、そこで環境を構築していきましょう。

C:\Users\path\to\venv> virtualenv scrapy

作成したら仮想環境に入ります。

C:\Users\path\to\venv> scrapy\Scripts\activate

コマンドプロンプトの表示が以下のように変わります。

(scrapy)C:\Users\path\to\venv>

これで仮想環境の準備はOKです。

Scrapyをインストール

続いてScrapyをインストールします。

(scrapy)C:\Users\path\to\venv> pip install scrapy

これでScrapyをインストールできましたのでひとまずScrapyのプロジェクトを作ってサンプルコードを作成しましょう。

ここではその内容は割愛します。

 

で、この状態でサンプルスクリプトを実行すると以下のようなエラーが出ました。

(scrapy)C:\Users\path\to\venv> scrapy crawl brickset
2017-12-13 15:00:36 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: lego_scraper)
2017-12-13 15:00:36 [scrapy.utils.log] INFO: Overridden settings: {'BOT_NAME': 'lego_scraper', 'DOWNLOAD_DELAY': 3, 'HTTPCACHE_ENABLED': True, 'NEWSPIDER_MODULE': 'lego_scraper.spiders', 'ROBOTSTXT_OBEY': True, 'SPIDER_MODULES': ['lego_scraper.spiders']}
2017-12-13 15:00:36 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
 'scrapy.extensions.telnet.TelnetConsole',
 'scrapy.extensions.logstats.LogStats']
Unhandled error in Deferred:
2017-12-13 15:00:36 [twisted] CRITICAL: Unhandled error in Deferred:

2017-12-13 15:00:36 [twisted] CRITICAL:
Traceback (most recent call last):
:
中略
:
  File "c:\users\path\to\venv\lib\site-packages\twisted\internet\stdio.py", line 30, in 
    from twisted.internet import _win32stdio
  File "c:\users\path\to\venv\lib\site-packages\twisted\internet\_win32stdio.py", line 9, in 
    import win32api
ModuleNotFoundError: No module named 'win32api'

win32apiなんてモジュールは存在しないよ~と言われていますね。

どうやらこれはTwistedのバグのようで公式のFAQに掲載されています。

というわけで本題です。

対処法

win32apiのインストール

Windows用にパッケージが配布されているので以下のサイトから自分の環境にあったファイルをダウンロードします。

Python for Windows Extensions

私は「pywin32-221.win-amd64-py3.6.exe」をダウンロードしました。

ダウンロードした後、そのファイルを実行すればインストールが始まりますがそれでは仮想環境には適用されませんので以下のコマンドを実行します。

仮想環境にいる状態で「easy_install」コマンドを実行します。

(scrapy) C:\Users\path\to\venv> easy_install C:\Users\path\to\pywin32-221.win-amd64-py3.6.exe
Processing pywin32-221.win-amd64-py3.6.exe
Demos.__pycache__.win32rcparser_demo.cpython-36: module references __file__
Demos.security.sspi.__pycache__.validate_password.cpython-36: module references __file__
__pycache__._win32sysloader.cpython-36: module references __file__
:
中略
:
Installed c:\users\path\to\venv\lib\site-packages\pywin32-221-py3.6-win-amd64.egg
Processing dependencies for pywin32==221
Finished processing dependencies for pywin32==221

無事にインストールできました。ダウンロードしたファイル名は適宜読み替えてください。

再度スクレイピング

この状態で再度スクレイピングしてみます。

(scrapy)C:\Users\path\to\venv> scrapy crawl brickset
2017-12-13 15:43:15 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: lego_scraper)
2017-12-13 15:43:15 [scrapy.utils.log] INFO: Overridden settings: {'BOT_NAME': 'lego_scraper', 'DOWNLOAD_DELAY': 3, 'HTTPCACHE_ENABLED': True, 'NEWSPIDER_MODULE': 'lego_scraper.spiders', 'ROBOTSTXT_OBEY': True, 'SPIDER_MODULES': ['lego_scraper.spiders']}
2017-12-13 15:43:15 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
 'scrapy.extensions.telnet.TelnetConsole',
:
中略
:
 'start_time': datetime.datetime(2017, 12, 13, 6, 43, 15, 748136)}
2017-12-13 15:43:21 [scrapy.core.engine] INFO: Spider closed (finished)

(scrapy) C:\Users\path\to\venv>

無事成功しました!これで書籍を読み進めることが出来ます!

サンプルプログラムもきちんと動作することが確認できましたのでスクレイピングの勉強が捗ります。

ひとまずこの本を読了するまでは頑張ろうと思います。

 

現場からは以上です!

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。

コメント

  1. 何者 より:

    windows10 home 64bit
    Python 3.6.2
    コマンドプロンプト(管理者)
    仮想環境venv

    上記の条件のもと
    python -m pip install pywin32

    で pywin32(Version 222)のインストールに成功しました。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください