Windows10+Anaconda環境にscrapyをインストールする

スポンサーリンク

[実行環境]
Win10
Anaconda 4.8.3
python 3.7.7
scrapy 1.6.0

Anaconda

python3.8.4+pipenvの組み合わせでscrapy2.1.0のインストールにチャレンジしていたんですけど、なんかTwistedの依存関係みたいなのでこけます。
中国のサイトではうまくいった報告も多数あるんですけど、自分の環境では無理でした。残念。
win10 python3.8安装scrapy 仅需两步_ruokeqx-CSDN博客
win10 python3.8 安装Scrapy_fire_lch316的博客-CSDN博客

そこでscrapy公式が推奨するAnaconda
インストールしてWinスタートよりAnaconda Promptを起動。
【初心者向け】Anacondaで仮想環境を作ってみる - Qiita
Anaconda でよく使うコマンド一覧 - Qiita

condaというコマンドを使います。
デフォルトは(base)という仮想開発環境がすでに用意されていて、すでに多くのパッケージがインストールされています。

まずはconda本体をアップデートして最新の環境を用意する。

(base) C:\Users\XXX>conda update -n base -c defaults conda
......略

condaのバージョン確認。

(base) C:\Users\XXX>conda --version
conda 4.8.3

デフォルトの環境は汚さずに、新しく仮想環境を作成。

(base) C:\Users\XXX>conda create --name samp_env
Collecting package metadata (current_repodata.json): done
Solving environment: done
......略

仮想環境一覧表示。samp_envが新しくできました。

(base) C:\Users\XXX>conda info --env
# conda environments:
#
base                  *  C:\Users\XXX\anaconda3
samp_env                 C:\Users\XXX\anaconda3\envs\samp_env

作った仮想環境を有効化。

(base) C:\Users\XXX>conda activate samp_env
(samp_env) C:\Users\XXX>

インストールしたいパッケージがあるかを検索。今回はscrapy。

(samp_env) C:\Users\XXX>conda search scrapy
Loading channels: done
# Name                       Version           Build  Channel
scrapy                         1.4.0  py27h4eaa785_1  pkgs/main
scrapy                         1.4.0  py35h054a469_1  pkgs/main
scrapy                         1.4.0  py36h764da0a_1  pkgs/main
scrapy                         1.5.0          py27_0  pkgs/main
scrapy                         1.5.0          py35_0  pkgs/main
scrapy                         1.5.0          py36_0  pkgs/main
scrapy                         1.5.1          py27_0  pkgs/main
scrapy                         1.5.1          py35_0  pkgs/main
scrapy                         1.5.1          py36_0  pkgs/main
scrapy                         1.5.1          py37_0  pkgs/main
scrapy                         1.5.2          py27_0  pkgs/main
scrapy                         1.5.2          py36_0  pkgs/main
scrapy                         1.5.2          py37_0  pkgs/main
scrapy                         1.6.0          py27_0  pkgs/main
scrapy                         1.6.0          py36_0  pkgs/main
scrapy                         1.6.0          py37_0  pkgs/main
scrapy                         1.6.0          py38_0  pkgs/main

Anacondaでは最新がscrapy1.6.0のようです。
仮想環境にはpythonすらもなく空っぽらしいので、併せてインストールします。
以前pipenv環境では3.8.4を使ってうまくいかなかったので3.7系を使うことにします。

(samp_env) C:\Users\XXX>conda install python==3.7.* scrapy==1.6.*
......略

仮想環境にインストールしたパッケージを一覧表示。
scrapyと依存関係にあるパッケージも自動的にインストールされます。

(samp_env) C:\Users\XXX>conda list
# packages in environment at C:\Users\XXX\anaconda3\envs\samp_env:
#
# Name                    Version                   Build  Channel
atomicwrites              1.4.0                      py_0
attrs                     19.3.0                     py_0
automat                   0.8.0                      py_0
bcrypt                    3.1.7            py37he774522_1
ca-certificates           2020.1.1                      0
certifi                   2020.4.5.1               py37_0
cffi                      1.14.0           py37h7a1dbc1_0
colorama                  0.4.3                      py_0
constantly                15.1.0           py37h28b3542_0
cryptography              2.9.2            py37h7a1dbc1_0
cssselect                 1.1.0                      py_0
hyperlink                 19.0.0                     py_0
idna                      2.9                        py_1
importlib-metadata        1.6.0                    py37_0
importlib_metadata        1.6.0                         0
incremental               17.5.0                   py37_0
libiconv                  1.15                 h1df5818_7
libxml2                   2.9.10               h464c3ec_1
libxslt                   1.1.34               he774522_0
lxml                      4.5.1            py37h1350720_0
more-itertools            8.3.0                      py_0
openssl                   1.1.1g               he774522_0
packaging                 20.3                       py_0
parsel                    1.5.2                    py37_0
pip                       20.0.2                   py37_3
pluggy                    0.13.1                   py37_0
py                        1.8.1                      py_0
pyasn1                    0.4.8                      py_0
pyasn1-modules            0.2.7                      py_0
pycparser                 2.20                       py_0
pydispatcher              2.0.5                    py37_1
pyhamcrest                1.9.0                    py37_2
pyopenssl                 19.1.0                   py37_0
pyparsing                 2.4.7                      py_0
pytest                    5.4.2                    py37_0
pytest-runner             5.2                        py_0
python                    3.7.7                h81c818b_4
pywin32                   227              py37he774522_1
queuelib                  1.5.0                    py37_0
scrapy                    1.6.0                    py37_0
service_identity          18.1.0           py37h28b3542_0
setuptools                47.1.1                   py37_0
six                       1.15.0                     py_0
sqlite                    3.31.1               h2a8f88b_1
twisted                   20.3.0           py37he774522_0
vc                        14.1                 h0510ff6_4
vs2015_runtime            14.16.27012          hf0eaf9b_2
w3lib                     1.21.0                     py_0
wcwidth                   0.1.9                      py_0
wheel                     0.34.2                   py37_0
wincertstore              0.2                      py37_0
zipp                      3.1.0                      py_0
zlib                      1.2.11               h62dcd97_4
zope                      1.0                      py37_1
zope.interface            4.7.1            py37he774522_0

scrapy

ここからはscrapyによる操作。
Scrapy Tutorial — Scrapy 1.6.0 documentation
Python, Scrapyの使い方(Webクローリング、スクレイピング) | note.nkmk.me

scrapyのプロジェクトを作成。デフォルトだとC:\Users\XXX直下にプロジェクトが作られてしまうため、scrapy startproject [name] [dir]みたいにディレクトリを指定。

(samp_env) C:\Users\XXX>scrapy startproject scrapy_tutorial C:\workspace\project
New Scrapy project 'scrapy_tutorial', using template directory 'C:\Users\XXX\anaconda3\envs\samp_env\lib\site-packages\scrapy\templates\project', created in:
    C:\workspace\project

You can start your first spider with:
    cd C:\workspace\project
    scrapy genspider example example.com

以降のコマンドは作成されたscrapyプロジェクトから実行するので、ディレクトリを移動。

(samp_env) C:\Users\XXX>cd C:\workspace\project

スパイダーと呼ばれるクローラーの雛形を作成します。
クローリングする対象サイトは公式が準備してくれているQuotes to Scrapeとします。

(samp_env) C:\workspace\project>scrapy genspider quotes quotes.toscrape.com
Created spider 'quotes' using template 'basic' in module:
  scrapy_tutorial.spiders.quotes

spidersフォルダ配下にquotes.pyというファイルが作成されました。

# -*- coding: utf-8 -*-
import scrapy


class QuotesSpider(scrapy.Spider):
    name = 'quotes'
    allowed_domains = ['quotes.toscrape.com']
    start_urls = ['http://quotes.toscrape.com/']

    def parse(self, response):
        pass

parseの部分を以下のように変更。
responseオブジェクトから任意のテキストを抜き出します。
Scrapy 備忘メモ - yFujitaのブログ

    def parse(self, response):
        print('>>>>>>>>>>>> parse start >>>>>>>>>>>>')
        print(response.selector.css('span.text').xpath('string()').get())
        print('>>>>>>>>>>>> parse finish >>>>>>>>>>>>')

トップページ最上部にあるアインシュタインの言葉を取得してみます。

f:id:always_amefuri:20200618085551p:plain

クロールコマンドでスパイダーを走らせます。
すると、だだーっとログが表示されます。目的のテキストがうまく取得できてるようです。

(samp_env) C:\workspace\project>scrapy crawl quotes
2020-06-18 08:46:56 [scrapy.utils.log] INFO: Scrapy 1.6.0 started (bot: scrapy_tutorial)
...略...
>>>>>>>>>>>> parse start >>>>>>>>>>>>
“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”
>>>>>>>>>>>> parse finish >>>>>>>>>>>>
2020-06-18 08:46:57 [scrapy.core.engine] INFO: Spider closed (finished)
...略...

condaのその他コマンド

仮想環境から出る。

conda deactivate [env_name]

仮想環境を削除する。

conda remove --name [env_name] --all