web-dev-qa-db-ja.com

Python--IP禁止の防止

私はPythonを使用してページをスクレイピングしています。今まで私は複雑な問題を抱えていませんでした。

私がスクレイピングしようとしているサイトは、多くのセキュリティチェックを使用しており、スクレイピングを防ぐためのいくつかのメカニズムがあります。

Requestslxmlを使用して、IPで禁止される前に約100〜150ページをこすることができました。時々私は最初のリクエストを禁止することさえあります(以前に使用されていない新しいIP、異なるCブロック)。ヘッダーのスプーフィングを試み、リクエスト間の時間をランダム化しましたが、同じです。

私はSeleniumを試してみましたが、はるかに良い結果が得られました。 Seleniumを使用すると、禁止される前に約600〜650ページを削ることができました。ここでもリクエストをランダム化しようとしました(3〜5秒の間、および300番目のリクエストごとにtime.sleep(300)を呼び出します)。それにもかかわらず、私は禁止されました。

ここから、そのサイトには、1つの開いているブラウザーセッションなどでXページ以上を要求した場合にIPを禁止するメカニズムがあると結論付けることができます。

あなたの経験に基づいて、他に何を試すべきですか? Seleniumでブラウザを閉じたり開いたりすると役立ちます(たとえば、100回のリクエストごとにブラウザを閉じて開いた後)。私はプロキシを試してみようと考えていましたが、ページは数百万あり、非常に拡張されます。

13
RhymeGuy

Scrapy web-scraping framework に切り替えると、禁止を防止して対処するために作成された多くのことを再利用できます。

これは、ScrapyサーバーとクロールするWebサイトの両方の負荷に基づいて、クロール速度を自動的に調整する拡張機能です。

リクエストごとにfake-useragentによって提供されるランダムなユーザーエージェントを使用する

14
alecxe

プロキシを使用できます。

非常に安価で数百のIPを購入でき、以前と同じようにSeleniumを使用できます。さらに、使用するブラウザーやその他のユーザーエージェントパラメーターを変更することをお勧めします。

単一のIPアドレスを繰り返し使用して、xページのみをロードし、禁止される前に停止することができます。

def load_proxy(PROXY_Host,PROXY_PORT):
        fp = webdriver.FirefoxProfile()
        fp.set_preference("network.proxy.type", 1)
        fp.set_preference("network.proxy.http",PROXY_Host)
        fp.set_preference("network.proxy.http_port",int(PROXY_PORT))
        fp.set_preference("general.useragent.override","whater_useragent")
        fp.update_preferences()
        return webdriver.Firefox(firefox_profile=fp)
5
par

私もこの問題を抱えていました。 python3urllibtorとともに使用しました。

  1. ダウンロード とブラウザへのインストール
  2. testing tor

ターミナルを開いて入力:

curl --socks5-hostname localhost:9050 <http://site-that-blocked-you.com>

あなたが結果を見ればそれはうまくいった。

  1. これで、Pythonでテストする必要があります。今、このコードを実行します
import socks
import socket
from urllib.request import Request, urlopen
from bs4 import BeautifulSoup

#set socks5 proxy to use tor

socks.set_default_proxy(socks.SOCKS5, "localhost", 9050)
socket.socket = socks.socksocket
req = Request('http://check.torproject.org', headers={'User-Agent': 'Mozilla/5.0', })
html = urlopen(req).read()
soup = BeautifulSoup(html, 'html.parser')
print(soup('title')[0].get_text())

あなたが見れば

おめでとう。このブラウザーはTorを使用するように構成されています。

pythonでも動作し、これはWebスクレイピングにTorを使用していることを意味します。

3
Mohammad Reza