Python3

[Python]Scrapyを動かした時にSyntaxError: invalid syntaxとエラーが出る場合の対処法

タイトル通りですが、Scrapyを試しに使っているとSyntaxError: invalid syntaxというエラーが出たのでその解決方法を紹介します。

実際に起こったこと

「Pythonクローリング&スクレイピング」という書籍で本腰入れてクローラーの作成を勉強していたのですが、Scrapyの章でエラーが発生しました。

ちなみにこの書籍で引用されているscrapyのお試しコードはscrapyの公式から拝借したものなので、この書籍の読者だけではなくscrapyを利用しようとしている人は当てはまると思います。

余談ですが、「Pythonクローリング&スクレイピング」の書籍すごく良いですね。買って良かった。

 

で、該当のScrapy公式のサンプルコードを動かそうとすると以下のようなエラーが発生します。

(scraping) x-no-MBP:~ x$ scrapy runspider myspider.py -o items.jl
2018-09-23 13:37:21 [scrapy.utils.log] INFO: Scrapy 1.5.1 started (bot: scrapybot)
2018-09-23 13:37:21 [scrapy.utils.log] INFO: Versions: lxml 4.2.5.0, libxml2 2.9.8, cssselect 1.0.3, parsel 1.5.0, w3lib 1.19.0, Twisted 18.7.0, Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 26 2018, 23:26:24) - [Clang 6.0 (clang-600.0.57)], pyOpenSSL 18.0.0 (OpenSSL 1.1.0i  14 Aug 2018), cryptography 2.3.1, Platform Darwin-17.7.0-x86_64-i386-64bit
2018-09-23 13:37:21 [scrapy.crawler] INFO: Overridden settings: {'FEED_FORMAT': 'jl', 'FEED_URI': 'items.jl', 'SPIDER_LOADER_WARN_ONLY': True}
Traceback (most recent call last):
 ~~中略~~
    from twisted.conch import manhole, telnet
  File "/Users/x/scraping/lib/python3.7/site-packages/twisted/conch/manhole.py", line 154
    def write(self, data, async=False):
                              ^
SyntaxError: invalid syntax

あら、と思い心当たりを潰していきました。Scrapyはlxmlに依存しているようなのでちゃんとインストールしていたかな?と思いましたが、ちゃんとしている。

 

原因はTwistedがPython3.7に対応していないこと?

ScrapyはTwistedというフレームワークをベースにしているようですが、このTwistedがPython3.7ではエラーが起きてしまっているようです。

Githubのページでそのやり取りがされていました。

ユーザー「Python3.7でエラーが起きるんだけど」

Scrapy側「Hi これはTwisted側のissueでScrapy側のissueじゃないよ」

 

とのことです。もし、同じようなエラーが再現している人はPythonのバージョンを確認してみてください。

x-no-MBP:x$ python --version
Python 3.7.0

ああ、思いっきりPython3.7でした・・・

Python3.6のバージョンで動かしてみたら問題なく動きましたので、Pythonのバージョンを切り替えるなりして試してみてください。

 

-Python3

© 2020 Code Ocean