yagooglesearch
は、インテリジェントでリアルな外観の調整可能な Google 検索を実行するための Python ライブラリです。これは、実際の人間の Google 検索動作をシミュレートして、Google によるレート制限 (恐ろしい HTTP 429 応答) を防ぎ、HTTP 429 が Google によってブロックされた場合はバックオフして試行を続行するロジックを提供します。このライブラリは Google API を使用せず、googlesearch ライブラリに大きく基づいています。特徴は次のとおりです。
requests
ライブラリを活用するこのコードは現状のまま提供されており、その使用方法についてはお客様が全責任を負います。 Google 検索結果をスクレイピングすると、利用規約に違反する可能性があります。別の Python Google 検索ライブラリには、興味深い情報や議論がありました。
Google が推奨する方法は、API を使用することです。
pip install yagooglesearch
git clone https://github.com/opsdisk/yagooglesearch
cd yagooglesearch
virtualenv -p python3 .venv # If using a virtual environment.
source .venv/bin/activate # If using a virtual environment.
pip install . # Reads from pyproject.toml
import yagooglesearch
query = "site:github.com"
client = yagooglesearch . SearchClient (
query ,
tbs = "li:1" ,
max_search_result_urls_to_return = 100 ,
http_429_cool_off_time_in_minutes = 45 ,
http_429_cool_off_factor = 1.5 ,
# proxy="socks5h://127.0.0.1:9050",
verbosity = 5 ,
verbose_output = True , # False (only URLs) or True (rank, title, description, and URL)
)
client . assign_random_user_agent ()
urls = client . search ()
len ( urls )
for url in urls :
print ( url )
GUI を通じて Google を検索すると、「約 13,000,000 件の結果」のようなメッセージが表示されますが、 yagooglesearch
それに近いものが見つかるわけではありません。テストによると、最大で約 400 件の結果が返されます。 400 < max_search_result_urls_to_return
を設定すると、警告メッセージがログに出力されます。議論については #28 を参照してください。
yagooglesearch
使用して Google 検索を実行するときは、低速と低速が戦略です。 HTTP 429 応答を受信し始めた場合、Google は正当にあなたをボットとして検出し、一定期間あなたの IP をブロックします。 yagooglesearch
CAPTCHA をバイパスできませんが、ブラウザから Google 検索を実行して人間であることを証明することで手動でバイパスできます。
ブロックされる基準としきい値は不明ですが、一般に、ユーザー エージェントをランダム化し、ページングされた検索結果間で十分な時間待機 (7 ~ 17 秒)、および異なる Google 検索間で十分な時間待機 (30 ~ 60 秒) すれば十分です。ただし、走行距離は確実に異なります。 Tor でこのライブラリを使用すると、すぐにブロックされる可能性があります。
yagooglesearch
Google からの HTTP 429 応答を検出すると、 http_429_cool_off_time_in_minutes
minutes 分間スリープしてから再試行します。 HTTP 429 が検出されるたびに、待機時間はhttp_429_cool_off_factor
の係数で増加します。
目標は、 yagooglesearch
HTTP 429 の検出と回復を考慮させ、それを使用するスクリプトに負担をかけないようにすることです。
yagooglesearch
に HTTP 429 を処理させたくない、自分で処理したい場合は、yagooglesearch オブジェクトをインスタンス化するときにyagooglesearch_manages_http_429s=False
渡します。 HTTP 429 が検出された場合、文字列「HTTP_429_DETECTED」が返されるリスト オブジェクトに追加されます。次のステップをどうするかはユーザー次第です。リスト オブジェクトには、HTTP 429 が検出される前に見つかった URL が含まれます。
import yagooglesearch
query = "site:twitter.com"
client = yagooglesearch . SearchClient (
query ,
tbs = "li:1" ,
verbosity = 4 ,
num = 10 ,
max_search_result_urls_to_return = 1000 ,
minimum_delay_between_paged_results_in_seconds = 1 ,
yagooglesearch_manages_http_429s = False , # Add to manage HTTP 429s.
)
client . assign_random_user_agent ()
urls = client . search ()
if "HTTP_429_DETECTED" in urls :
print ( "HTTP 429 detected...it's up to you to modify your search." )
# Remove HTTP_429_DETECTED from list.
urls . remove ( "HTTP_429_DETECTED" )
print ( "URLs found before HTTP 429 detected..." )
for url in urls :
print ( url )
yagooglesearch
プロキシの使用をサポートしています。提供されたプロキシは、検索のさまざまな部分でさまざまなプロキシをローテーションするのではなく、検索のライフサイクル全体で使用され、より人間らしく見えるようにします。一般的な検索ライフサイクルは次のとおりです。
google.com
への「ブラウジング」をシミュレートプロキシを使用するには、 yagooglesearch.SearchClient
オブジェクトを初期化するときにプロキシ文字列を指定します。
client = yagooglesearch . SearchClient (
"site:github.com" ,
proxy = "socks5h://127.0.0.1:9050" ,
)
サポートされているプロキシ スキームは、Python requests
ライブラリ (https://docs.python-requests.org/en/master/user/advanced/#proxies) でサポートされているものに基づいています。
http
https
socks5
- 「DNS 解決がプロキシ サーバーではなくクライアントで行われるようにします。」すべての DNS ルックアップはプロキシではなくyagooglesearch
が実行されている場所からソースされるため、これはおそらく望ましくないでしょう。socks5h
- "プロキシ サーバー上のドメインを解決したい場合は、スキームとして Socks5h を使用します。" DNS ルックアップと Google 検索はプロキシ IP アドレスから取得されるため、SOCKS を使用している場合はこれが最適なオプションです。 HTTPS プロキシに自己署名証明書を使用している場合、次のいずれかの場合に SSL/TLS 検証を無効にする必要がある可能性があります。
yagooglesearch.SearchClient
オブジェクトをインスタンス化します。 import yagooglesearch
query = "site:github.com"
client = yagooglesearch . SearchClient (
query ,
proxy = "http://127.0.0.1:8080" ,
verify_ssl = False ,
verbosity = 5 ,
)
query = "site:github.com"
client = yagooglesearch . SearchClient (
query ,
proxy = "http://127.0.0.1:8080" ,
verbosity = 5 ,
)
client . verify_ssl = False
複数のプロキシを使用する場合、 yagooglesearch
ライブラリを利用して別のプロキシで新しいyagooglesearch.SearchClient
オブジェクトをインスタンス化するスクリプトに負担がかかります。以下は、プロキシのリストをループする例です。
import yagooglesearch
proxies = [
"socks5h://127.0.0.1:9050" ,
"socks5h://127.0.0.1:9051" ,
"http://127.0.0.1:9052" , # HTTPS proxy with a self-signed SSL/TLS certificate.
]
search_queries = [
"python" ,
"site:github.com pagodo" ,
"peanut butter toast" ,
"are dragons real?" ,
"ssh tunneling" ,
]
proxy_rotation_index = 0
for search_query in search_queries :
# Rotate through the list of proxies using modulus to ensure the index is in the proxies list.
proxy_index = proxy_rotation_index % len ( proxies )
client = yagooglesearch . SearchClient (
search_query ,
proxy = proxies [ proxy_index ],
)
# Only disable SSL/TLS verification for the HTTPS proxy using a self-signed certificate.
if proxies [ proxy_index ]. startswith ( "http://" ):
client . verify_ssl = False
urls_list = client . search ()
print ( urls_list )
proxy_rotation_index += 1
GOOGLE_ABUSE_EXEMPTION
Cookie 値がある場合は、 SearchClient
オブジェクトをインスタンス化するときに、その値をgoogle_exemption
に渡すことができます。
&tbs=
パラメーターは、逐語的フィルターまたは時間ベースのフィルターを指定するために使用されます。
&tbs=li:1
時間フィルター | &tbs= URLパラメータ | 注意事項 |
---|---|---|
過去 1 時間 | qdr:h | |
過去の日 | qdr:d | 過去 24 時間 |
過去 1 週間 | qdr:w | |
先月 | qdr:m | |
過去1年 | qdr:y | |
カスタム | cdr:1、cd_min:2021/1/1、cd_max:2021/6/1 | yagooglesearch.get_tbs() 関数を参照してください。 |
現在、 .filter_search_result_urls()
関数は、「google」という単語を含む URL をすべて削除します。これは、返された検索 URL が Google URL で汚染されるのを防ぐためです。 site:google.com computer
など、URL に「google」が含まれる可能性のある結果を明示的に検索しようとしている場合は、この点に注意してください。
BSD 3 条項ライセンスに基づいて配布されます。詳細については、「ライセンス」を参照してください。
@opsdisk
プロジェクトリンク: https://github.com/opsdisk/yagooglesearch