場合を考えて、ウェブサイトを頻繁にクロールしたいのですが、ある日/制限の後にIPアドレスがブロックされました。
それでは、IPアドレスやその他のアイデアを動的に変更するにはどうすればよいですか?
Scrapy を使用するアプローチでは、RandomProxy
とRotateUserAgentMiddleware
の2つのコンポーネントを使用します。
DOWNLOADER_MIDDLEWARES
を次のように変更します。 settings.py
に新しいコンポーネントを挿入する必要があります。
DOWNLOADER_MIDDLEWARES = {
'scrapy.contrib.downloadermiddleware.retry.RetryMiddleware': 90,
'tutorial.randomproxy.RandomProxy': 100,
'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 110,
'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware' : None,
'tutorial.spiders.rotate_useragent.RotateUserAgentMiddleware' :400,
}
scrapy-proxies
を使用できます。このコンポーネントは、リストからランダムプロキシを使用してScrapyリクエストを処理し、IP禁止を回避し、クロール速度を向上させます。
簡単なインターネット検索からプロキシリストを作成できます。要求されたURL形式に従って、list.txt
ファイル内のリンクをコピーします。
スクレイピーリクエストごとに、事前に定義したリストからランダムなユーザーエージェントが使用されます。
class RotateUserAgentMiddleware(UserAgentMiddleware):
def __init__(self, user_agent=''):
self.user_agent = user_agent
def process_request(self, request, spider):
ua = random.choice(self.user_agent_list)
if ua:
request.headers.setdefault('User-Agent', ua)
# Add desired logging message here.
spider.log(
u'User-Agent: {} {}'.format(request.headers.get('User-Agent'), request),
level=log.DEBUG
)
# the default user_agent_list composes chrome,I E,firefox,Mozilla,opera,netscape
# for more user agent strings,you can find it in http://www.useragentstring.com/pages/useragentstring.php
user_agent_list = [
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
]
詳細 こちら 。
プロキシサーバーを使用して、ブロックされないようにすることができます。作業プロキシを提供するサービスがあります。私が試したベストは https://gimmeproxy.com です-さまざまなパラメーターのプロキシを頻繁にチェックします。
それらからプロキシを取得するには、次のリクエストを行うだけです。
https://gimmeproxy.com/api/getProxy
それらは、必要に応じて後で使用できるすべてのプロキシデータでJSON応答を提供します。
{
"supportsHttps": true,
"protocol": "socks5",
"ip": "179.162.22.82",
"port": "36915",
"get": true,
"post": true,
"cookies": true,
"referer": true,
"user-agent": true,
"anonymityLevel": 1,
"websites": {
"example": true,
"google": false,
"Amazon": true
},
"country": "BR",
"tsChecked": 1517952910,
"curl": "socks5://179.162.22.82:36915",
"ipPort": "179.162.22.82:36915",
"type": "socks5",
"speed": 37.78,
"otherProtocols": {}
}
Curlで次のように使用できます。
curl -x socks5://179.162.22.82:36915 http://example.com
Rを使用している場合、TORを介してWebクロールを実行できます。 TORはIPアドレスを10分ごと(?)に自動的にリセットすると思います。 TORに短い間隔でIPを変更させる方法があると思いますが、それはうまくいきませんでした。代わりに、TORの複数のインスタンスをセットアップしてから、独立したインスタンスを切り替えることができます(ここで、TORの複数のインスタンスをセットアップする方法の適切な説明を見つけることができます: https://tor.stackexchange.com/questions/ 2006/how-to-run-multiple-tor-browsers-with-different-ips )
その後、Rで次のようなことができます(独立したTORブラウザーのポートとユーザーエージェントのリストを使用します。「getURL」関数を呼び出すたびに、ポート/ユーザーエージェントのリストを循環します)
library(RCurl)
port <- c(a list of your ports)
proxy <- paste("socks5h://127.0.0.1:",port,sep="")
ua <- c(a list of your useragents)
opt <- list(proxy=sample(proxy,1),
useragent=sample(ua,1),
followlocation=TRUE,
referer="",
timeout=timeout,
verbose=verbose,
ssl.verifypeer=ssl)
webpage <- getURL(url=url,.opts=opt)
一部のVPNアプリケーションでは、次のような設定間隔で2分ごとにIPアドレスを新しいランダムIPアドレスに自動的に変更できます。 HMA!Pro VPN とVPN4ALLソフトウェアの両方がこの機能をサポートしています。
VPNに関する警告の言葉、利用規約を注意深く確認してください。VPNを使用したスクレイピングはユーザーポリシーに反するためです(そのような例の1つはAstrillです)。スクレイピングツールを試し、アカウントをロックしました
パブリックIPがある場合。インターフェイスにそれらを追加し、Linuxを使用している場合は、それらのパブリックIPを切り替えるためにIptablesを使用します。
2つのIPのiptablesサンプルルール
iptables -t nat -A POSTROUTING -m statistic --mode random --probability 0.5 -j SNAT --to-source 192.168.0.2
iptables -t nat -A POSTROUTING -m statistic --mode random --probability 0.5 -j SNAT --to-source 192.168.0.3
4つのIPがある場合、確率は0.25になります。
簡単な手順で独自のプロキシを作成することもできます。
これらのルールにより、プロキシサーバーは発信IPSを切り替えることができます。