読者です 読者をやめる 読者になる 読者になる

無駄と文化

実用的ブログ

Scrapy のクローリング中に win32api が無くてコケる問題に対処(Windows10, 64bit, Python2.7)

f:id:todays_mitsui:20160827190511p:plain


昨日は Windows で Scrapy 1.1.2 をインストールするために必要な libxml2 のインストールについて解説しました。

blog.mudatobunka.org

が、どうやら Windows ではクローリングを実行するときにもう一つ win32api というライブラリが必要になるようです。
win32api が無いと、クローリングの実行中にコケます...。


状況再現

ひとまず適当な Spider を書いて走らせてみましょう。
月並みですが CNN.co.jp の記事一覧ページ から記事タイトルと URL を抜き出す Spider を書きます。

example/spiders/test.py

# -*- coding: utf-8 -*-

import scrapy


class TestSpider(scrapy.Spider):
    name = "test"
    allowed_domains = ["cnn.co.jp"]
    start_urls = (
        "http://www.cnn.co.jp/archives/",
    )

    def parse(self, response):
        articles = response.xpath("//ul[contains(@class,'story-list')]//a")

        for article in articles:
            title = article.xpath("./text()").extract_first()
            title = title and title.strip()

            url = article.xpath("./@href").extract_first()
            url = response.urljoin(url)

            yield {
                "title": title,
                "url": url,
            }

このように。


で、これを scrapy crawl test で走らせると、

f:id:todays_mitsui:20160828140247p:plain

f:id:todays_mitsui:20160828140254p:plain

コケます。


ImportError: No module named win32api」 というエラーが出ているので、まぁ、win32api が無いんでしょう。


この件については Scrapy の公式ドキュメントの FAQ に情報がありました。

Scrapy crashes with: ImportError: No module named win32api
You need to install pywin32 because of this Twisted bug.

はい、と言うわけで Twisted のバグに対処するために win32api が必要になってるみたいですね。
確かに以前のバージョンではこんなエラー出てなかったもんなぁ!

pywin32 をインストールしてくれと書かれているので、しましょう。


pywin32 をダウンロード

pip で簡単にインストールできないかとやってみたのですが、出来ず。
どうやら Windows 用に exe ファイルが配布されているようです。

こちらで配布されています。

なんかいきなり SourceForge が出てくると不安になるんですけど、どうやら公式の配布元みたいです。


README にも書かれているとおり最新のビルド(Build 220)のディレクトリの中からマシンやPythonのバージョンに合った exe ファイルをダウンロードします。
私は「pywin32-220.win32-py2.7.exe」を使いました。


pywin32 をインストール

exe ファイルなので普通にダブルクリックするだけでインストーラーが立ち上がるんですが、その方法だと virtualenv 環境から参照できません。
virtualenv 環境下にインストールするには、virtualenv 環境に入った状態で easy_install を使います。

env\Scripts\activate
easy_install pywin32-220.win32-py2.7.exe

すると、

f:id:todays_mitsui:20160828143045p:plain

f:id:todays_mitsui:20160828143052p:plain

上手く行ってそうですね。


再びクローリングを実行

気を取り直して scrapy crawl します。

scrapy crawl -o result.json test

今度は無事にクローリングが進んで結果が result.json という名前で保存されます。

result.json

[
  {
    "url": "http://www.cnn.co.jp/world/35088116.html",
    "title": "ボリビアの鉱山スト 交渉役の次官が撲殺、5人を逮捕"
  },
  {
    "url": "http://www.cnn.co.jp/usa/35088113.html",
    "title": "車のトランクから現金300万ドル押収 米・メキシコ国境"
  },

  /* ... 中略 ... */

  {
    "url": "http://www.cnn.co.jp/usa/35088101.html",
    "title": "ネオコン代表格、クリントン氏に投票を検討 「トランプ氏は危険」"
  }
]

データ、取れてます。

もう安心、あなたの顔が見えたから(2回目)


私からは以上です。