[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のバージョンを切り替えるなりして試してみてください。