highlight.js

2017年8月5日土曜日

Scrapy + ProxyMesh を使って SSL (https) サイトを分散スクレイピング

Scrapy を ProxyMesh 経由で使った際にハマったので、メモを残したいと思います。

環境

  • Python 3.3
  • Scrapy 1.3.3

Scrapy とは?

Scrapy は Python のスクレイピングフレームワークです。
ググるとたくさん情報が出てきますので、詳しくはそちらにお任せします。(手抜きすぎw)

ProxyMesh とは?

ProxyMesh はHTTP の Proxy で IP を分散してくれます。
こちらもググるとそこそこ情報が出てきますので、詳しくはそちらにお任せします。(丸投げすぎw)

何がハマった?

それで、何にハマったかというと、SSL (https) サイトのスクレイピングです。
ProxyMesh のドキュメントでは、Scrapy の場合、以下のように書かれています。
For the scrapy crawling framework, you must set http_proxy environment variable, as shown above, then activate the HttpProxyMiddleware.
なので、環境変数にProxyMeshを指定して、非SSL (http) サイトでテストすると、IP が ProxyMesh で分散されることを確認できました。
次に、SSL (https) サイトでテストすると、 ProxyMesh の IP ではなく、自分の IP でアクセスしていました。
半日ほど調べましたが、結局わからず途方に暮れていましたが、もしかしてと思い、https_proxy 環境変数に変えてみると、うまく動きました。
原因は、未だに不明ですが、きっと urllib とかが関係している気がしています。(全然違うかもしれませんが)

まとめ

ということで、Scrapy + ProxyMesh で SSL (https) サイトをスクレイピングするとき、環境変数は、 http_proxy ではなく、https_proxy を使いましょう。私の環境だけだっだりして、、、