37
38

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PythonでTorを用いてスクレイピングする

Last updated at Posted at 2020-02-01

注意

この記事はTorを用いたスクレイピングを推奨するものではありません。

スクレイピングは基本的に問題ありませんが、対象のサイトの利用規約で禁止されていたり、対象のサイトのサーバーに過度な負荷をかけた場合、罪に問われる可能性があります。

Torとは

接続経路を匿名化する技術です。理論上、Torを使用してアクセスした場合、誰がアクセスしたか特定することは困難です。

実行環境

Homebrew 2.2.4
pip 20.0.2
Python 3.7.3

1. IPアドレスを取得

最初に、Torなしの状態でグローバルIPアドレスを確認しましょう。
グローバルIPアドレスはここ、Torを使用しているかどうかはここからHTMLを取得することで確認できます。

Beautiful Soupを使用するので、インストールしてください。

# pipでbeautifulsoup4をインストール
$ pip install beautifulsoup4
# 確認
$ pip list | grep beautifulsoup4
beautifulsoup4 4.7.1
import urllib.request, urllib.error
from bs4 import BeautifulSoup

# URLからHTMLを返す
def fetch_html(url):
  res = urllib.request.urlopen(url)
  return BeautifulSoup(res, 'html.parser')

# 現在のグローバルIPアドレスを返す
def get_ip_addr():
  html = fetch_html('http://checkip.dyndns.com/')
  return html.body.text.split(': ')[1]

# Torを使っているかを返す
def check_use_tor():
  html = fetch_html('https://check.torproject.org/')
  return html.find('h1')['class'][0] != 'off'

print('You are using tor.' if check_use_tor() else 'You are not using tor.')
print('Current IP address is ' + get_ip_addr())

実行結果

You are not using tor.
Current IP address is XXX.XXX.XX.XXX

2. Torをインストールする

MacOSを使用している場合は、Homebrewでインストールできます。
また、brew services startを使用してデーモンとして起動させています。

$ brew install tor
$ brew services start tor
# 確認
$ tor --version
Tor version 0.4.2.6.
$ brew services list | grep tor
tor started your_name /Users/your_name/Library/LaunchAgents/homebrew.mxcl.tor.plist

Torを停止させる場合、再起動させる場合は以下のコマンドを実行してください。

$ brew services stop tor
$ brew services reload tor

また、この記事では触れませんが、設定ファイルは/usr/local/etc/tor/torrcです。

3. Torを介してスクレイピングを行う

PySocksを使用するので、インストールしてください。

$ pip install PySocks
# 確認
$ pip list | grep PySocks
PySocks 1.7.1

Torはプロキシとしてsocks5://localhost:9050を使用しているので、 1. のコードに以下を追加します。

import socks, socket

socks.set_default_proxy(socks.PROXY_TYPE_SOCKS5, '127.0.0.1', 9050)
socket.socket = socks.socksocket

実行結果

You are using tor.
Current IP address is YY.YYY.YYY.YY

表示されるグローバルIPアドレスが 1. で実行したときと異なっていることを確認してください。
Tor使用時のIPアドレスは、一定時間ごとに切り替わります。

37
38
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
37
38

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?