2019年12月22日日曜日

昨日は、ずーっと

パイソンでグーグル検索をしたかったので、ググってたが

駄目だった、お話。

グーグルの検索をすると、以下のようなURLが生成されて検索を行なうんだけど、それをパイソンからやりたい

https://www.google.com/search?sxsrf=ACYBGNS-CNUdGsRy00ztrhjYGMrzgWx_fw%3A1576904614957&source=hp&ei=pqf9XfCWOMuQr7wP5oWF8Ag&q=%E6%97%A5%E6%9C%AC%E4%BB%A3%E8%A1%A8%E3%80%80%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9&oq=%E6%97%A5%E6%9C%AC%E4%BB%A3%E8%A1%A8%E3%80%80%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9&gs_l=psy-ab.3..0i4i70i253j0i4j0i30l6.4111.15509..16120...6.0..0.168.2794.17j11......0....1..gws-wiz.....10..35i362i39j35i39i19j35i39j0i131i4j35i305i39j0i4i37j0i131j0i131i4i37j0j0i4i37i70i253j0i4i30j0i8i4i30j0i13j0i13i30j0i5i4i30.SHMKKOxm5HQ&ved=0ahUKEwjwgau7-8XmAhVLyIsBHeZCAY4Q4dUDCAg&uact=5


結論!
ウインドウズのクライアントからは問題なし

vps(間借りのサーバー...)はダメ、ブラックリストの登録されているみたいです。
(期間はあるのかは、わかりませんが)


ソースコード
# -*- coding: utf-8 -*-
from google import search
def google_search(query, limit=3):
for url in search(query, lang="jp", num=3):
print url
def main():
google_search("kennsaku naiyou")
if __name__ == '__main__':
main()

上はダメで、最終的にはこちら

from googlesearch import search
for url in search('"python"simple-and-useful.net', stop=20):
print(url)


VPSでのエラーメッセージ
Traceback (most recent call last):
  File "/var/www/html/netpdb/pdbexe.py", line 194, in main
    pdb._runscript(mainpyfile)
  File "/usr/lib/python3.6/pdb.py", line 1548, in _runscript
    self.run(statement)
  File "/usr/lib/python3.6/bdb.py", line 431, in run
    exec(cmd, globals, locals)
  File "<string>", line 1, in <module>
  File "/var/www/html/netpdb/146/あああ", line 2, in <module>
    from googlesearch import search
  File "/usr/local/lib/python3.6/dist-packages/googlesearch/__init__.py", line 312, in search
    html = get_page(url, user_agent)
  File "/usr/local/lib/python3.6/dist-packages/googlesearch/__init__.py", line 176, in get_page
    response = urlopen(request)
  File "/usr/lib/python3.6/urllib/request.py", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/lib/python3.6/urllib/request.py", line 532, in open
    response = meth(req, response)
File "/usr/lib/python3.6/urllib/request.py", line 642, in http_response    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python3.6/urllib/request.py", line 564, in error
    result = self._call_chain(*args)
  File "/usr/lib/python3.6/urllib/request.py", line 504, in _call_chain
    result = func(*args)
  File "/usr/lib/python3.6/urllib/request.py", line 756, in http_error_302
    return self.parent.open(new, timeout=req.timeout)
  File "/usr/lib/python3.6/urllib/request.py", line 532, in open
    response = meth(req, response)
  File "/usr/lib/python3.6/urllib/request.py", line 642, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python3.6/urllib/request.py", line 570, in error
    return self._call_chain(*args)
  File "/usr/lib/python3.6/urllib/request.py", line 504, in _call_chain
    result = func(*args)
  File "/usr/lib/python3.6/urllib/request.py", line 650, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 429: Too Many Requests



悩んでいる人がいますが、適切な回答がまだありません
https://stackoverflow.com/questions/59084382/error-when-using-googlesearch-python-library-http-error-429-too-many-requests

I am trying to run this code:

try: 
    from googlesearch import search
except ImportError:
    print("No module named 'google' found") 

# to search
query = "Geeksforgeeks"

for j in search(query, tld="co.in", num=10, stop=1, pause=2):
    print(j)
On Ubuntu 16.04, Python version 3.5.2

and here is what I get:

Traceback (most recent call last):
  File "test.py", line 9, in <module>
    for j in search(query, tld="co.in", num=10, stop=1, pause=2):
  File "/usr/local/lib/python3.5/dist-packages/googlesearch/__init__.py", line 288, in search
    html = get_page(url, user_agent)
  File "/usr/local/lib/python3.5/dist-packages/googlesearch/__init__.py", line 154, in get_page
    response = urlopen(request)
  File "/usr/lib/python3.5/urllib/request.py", line 163, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/lib/python3.5/urllib/request.py", line 472, in open
    response = meth(req, response)
  File "/usr/lib/python3.5/urllib/request.py", line 582, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python3.5/urllib/request.py", line 504, in error
    result = self._call_chain(*args)
  File "/usr/lib/python3.5/urllib/request.py", line 444, in _call_chain
    result = func(*args)
  File "/usr/lib/python3.5/urllib/request.py", line 696, in http_error_302
    return self.parent.open(new, timeout=req.timeout)
  File "/usr/lib/python3.5/urllib/request.py", line 472, in open
    response = meth(req, response)
  File "/usr/lib/python3.5/urllib/request.py", line 582, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python3.5/urllib/request.py", line 510, in error
    return self._call_chain(*args)
  File "/usr/lib/python3.5/urllib/request.py", line 444, in _call_chain
    result = func(*args)
  File "/usr/lib/python3.5/urllib/request.py", line 590, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 429: Too Many Requests
The exact same code runs perfectly well on my Windows 10 machine, Python version 3.5.4

What could be the issue on my Ubuntu machine?

python python-3.x ubuntu-16.04 http-status-code-429
shareimprove this question
asked Nov 28 at 8:17

Vincent Roye
2,00577 gold badges2525 silver badges4444 bronze badges
Possible duplicate of How to avoid HTTP error 429 (Too Many Requests) python – furkanayd Nov 28 at 8:22
How can the exact same code run well on my Windows 10 machine and not on my Ubuntu 16.04 machine? – Vincent Roye Nov 28 at 8:24
Could it be because my Ubuntu VPS tries to access Google's server directly from a public address whereas my Windows machine is within a local network? – Vincent Roye Nov 28 at 8:35
Possibly, you are not using enough wait between your requests. python File "/usr/lib/python3.5/urllib/request.py", line 696, in http_error_302 return self.parent.open(new, timeout=req.timeout) in these lines search function shows that timeout for 302 error executed. Check this out : developer.mozilla.org/en-US/docs/Web/HTTP/Status/302 – furkanayd Nov 28 at 8:49 
Does this answer your question? Why does this program throw errors? – SitiSchu Nov 28 at 9:32
add a comment



私はこのコードを実行しようとしています:

試してください:
    googlesearchからインポート検索
ImportErrorを除く:
    print( "'google'という名前のモジュールが見つかりません")

# 検索する
クエリ= "Geeksforgeeks"

検索のj(クエリ、tld = "co.in"、num = 10、stop = 1、pause = 2):
    print(j)
Ubuntu 16.04では、Pythonバージョン3.5.2

ここに私が得るものがあります:

トレースバック(最後の最後の呼び出し):
  ファイル「test.py」、9行目、<module>
    検索のj(クエリ、tld = "co.in"、num = 10、stop = 1、pause = 2):
  ファイル「/usr/local/lib/python3.5/dist-packages/googlesearch/__init__.py」、288行目を検索
    html = get_page(url、user_agent)
  get_pageのファイル「/usr/local/lib/python3.5/dist-packages/googlesearch/__init__.py」の154行目
    応答= urlopen(request)
  ファイル「/usr/lib/python3.5/urllib/request.py」、163行目、urlopen
    opener.open(url、data、timeout)を返します
  ファイル「/usr/lib/python3.5/urllib/request.py」、行472、オープン
    応答= meth(req、response)
  http_responseのファイル「/usr/lib/python3.5/urllib/request.py」、行582
    「http」、リクエスト、レスポンス、コード、メッセージ、hdrs)
  ファイル「/usr/lib/python3.5/urllib/request.py」、504行目、エラー
    結果= self._call_chain(* args)
  _call_chainのファイル「/usr/lib/python3.5/urllib/request.py」、行444
    結果= func(* args)
  ファイル「/usr/lib/python3.5/urllib/request.py」、行696、http_error_302
    self.parent.open(new、timeout = req.timeout)を返します
  ファイル「/usr/lib/python3.5/urllib/request.py」、行472、オープン
    応答= meth(req、response)
  http_responseのファイル「/usr/lib/python3.5/urllib/request.py」、行582
    「http」、リクエスト、レスポンス、コード、メッセージ、hdrs)
  ファイル「/usr/lib/python3.5/urllib/request.py」、510行目、エラー
    self._call_chain(* args)を返します
  _call_chainのファイル「/usr/lib/python3.5/urllib/request.py」、行444
    結果= func(* args)
  ファイル「/usr/lib/python3.5/urllib/request.py」、590行目、http_error_default
    HTTPErrorを発生させます(req.full_url、code、msg、hdrs、fp)
urllib.error.HTTPError:HTTPエラー429:リクエストが多すぎます


私のWindows 10マシン、Pythonバージョン3.5.4でまったく同じコードが完全に実行されます

Ubuntuマシンで何が問題になるのでしょうか?

python python-3.x ubuntu-16.04 http-status-code-429
この質問を共有する
11月28日8時17分に尋ねた

ヴィンセント・ロイ
2,00577ゴールドバッジ2525シルバーバッジ4444ブロンズバッジ
HTTPエラー429(Too Many Requests)python-furkanayd Nov 28 at 8:22を回避する方法の重複
Ubuntu 16.04マシンではなく、Windows 10マシンでまったく同じコードを実行するにはどうすればよいですか? –ビンセントロイ11月28日8:24
私のUbuntu VPSがパブリックアドレスからGoogleのサーバーに直接アクセスしようとするのに対し、私のWindowsマシンはローカルネットワーク内にあるためでしょうか? –ビンセントロイ11月28日8時35分
リクエストの間に十分な待機時間を使用していない可能性があります。 pythonファイル「/usr/lib/python3.5/urllib/request.py」、http_error_302の696行目、これらの行の検索関数でself.parent.open(new、timeout = req.timeout)を返すと、302エラーのタイムアウトが示されます。実行されました。これをチェックしてください:developer.mozilla.org/en-US/docs/Web/HTTP/Status/302 – furkanayd Nov 28 at 8:49
これはあなたの質問に答えますか?このプログラムがエラーをスローするのはなぜですか? – SitiSchu 11月28日9:32
コメントを追加



グーグルはいろいろなサービスをパイソンのモジュールで提供しています。
使用してはもらいたいが、制約を付けないと自分のサーバーが大変です。

VPSなどからのアクセスは、頻繁に使用される可能性が高いので制約対象になると思われます。
(あくまでの自分の考え)
vpsが制限を掛けているのかもしれません、こちらも可能性はあります
※「ここからは、いろいろ検討した結果なので、文書散漫!」を参照


ググってみると翻訳、スカラーなど制約で悩んでいる人がいます。
翻訳などは制約する回数などが明記されていましたが...

また、
 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0'})の
ユーザーエージェントが無いIPアドレスからのアクセスは、除外されているかもしれません!
以前、ユーチューブでダウンロードのプログラム作成時に、同様な問題が発生した。
こちらは、vpsとは関係がなくあくまでもユーチューブからアクセスが拒否されていた。
どうしてダメかと思ったとき、普通のブラウザとパイソンの違いから、ユーザーエージェントの設定
だと気が付いた!
以下の参考ソースには、指定がちゃんとある!
class Google:
    def __init__(self):
        self.GOOGLE_SEARCH_URL = 'https://www.google.co.jp/search'
        self.session = requests.session()
        self.session.headers.update({
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0'})

つまり、以下のモジュール(googlesearch)には、無いか、何か問題がある可能性がある、
ソースを見てみるのもいいのかもしれませんね!

from googlesearch import search
for url in search('"python"simple-and-useful.net', stop=20):
print(url)




あれやこれやで、
自分でクローリングするのが一番かな、人には頼らない



https://qiita.com/derodero24/items/949ac666b18d567e9b61

参考にさせて頂きましたソースです。
vps上で動作は問題が発生しません!
(ただし、BeautifulSoupのインストールなどlxmlのバージョンでうまくいかなかった
        soup = BeautifulSoup(html, 'lxml')

まぁ、それは何とでもなりそうな気がします。

import json
from urllib import parse
import requests
from bs4 import BeautifulSoup


class Google:
    def __init__(self):
        self.GOOGLE_SEARCH_URL = 'https://www.google.co.jp/search'
        self.session = requests.session()
        self.session.headers.update({
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0'})

    def Search(self, keyword, type='text', maximum=100):
        '''Google検索'''
        print('Google', type.capitalize(), 'Search :', keyword)
        result, total = [], 0
        query = self.query_gen(keyword, type)
        while True:
            # 検索
            html = self.session.get(next(query)).text
            links = self.get_links(html, type)

            # 検索結果の追加
            if not len(links):
                print('-> No more links')
                break
            elif len(links) > maximum - total:
                result += links[:maximum - total]
                break
            else:
                result += links
                total += len(links)

        print('-> Finally got', str(len(result)), 'links')
        return result

    def query_gen(self, keyword, type):
        '''検索クエリジェネレータ'''
        page = 0
        while True:
            if type == 'text':
                params = parse.urlencode({
                    'q': keyword,
                    'num': '100',
                    'filter': '0',
                    'start': str(page * 100)})
            elif type == 'image':
                params = parse.urlencode({
                    'q': keyword,
                    'tbm': 'isch',
                    'filter': '0',
                    'ijn': str(page)})

            yield self.GOOGLE_SEARCH_URL + '?' + params
            page += 1

    def get_links(self, html, type):
        '''リンク取得'''
        soup = BeautifulSoup(html, 'lxml')
        if type == 'text':
            elements = soup.select('.rc > .r > a')
            links = [e['href'] for e in elements]
        elif type == 'image':
            elements = soup.select('.rg_meta.notranslate')
            jsons = [json.loads(e.get_text()) for e in elements]
            links = [js['ou'] for js in jsons]
        return links


google = Google()
# テキスト検索
result = google.Search('ドラえもん', type='text', maximum=200)














ここからは、いろいろ検討した結果なので、文書散漫!

日商エレクトロニクス株式会社
https://newrelic.nissho-ele.co.jp/solution

ここでは、vpsを提供していると思われますが、この問題についてのページがあります。
https://newrelic.nissho-ele.co.jp/support/docs/apis/rest-api-v2/requirements/api-overload-protection-handling-429-errors

APIの過負荷防止:429エラーの処理

New Relicは、REST API呼び出しに素早く応答するために、他の顧客が時間のかかるクエリを実行している場合であっても、APIに過負荷防止を含めます。
大量のリソースを消費するような大量のデータのクエリを実行している場合は、APIの応答コードとヘッダーがアカウントで利用可能な容量を超えたことを示します。これはほとんどの顧客が見ることのない珍しい状態で、APIの使用にリソースを集中的に使用するカスタマーのみが体験します。

APIは通常の操作では過負荷保護状態を応答に追加しません。ユーザーはアクションを起こす必要がありません。
レポート期間の期間にわたり、New RelicはひとつひとつのAPI要求がシステムにおよぼす影響を追跡します。API呼び出しがレポート期間において過負荷防止システムのしきい値を超える場合には、以下の事象が発生します。 

API呼び出しを続行すると、HTTPエラーコード429(Too Many Requestsエラー)により処理を失敗します。
HTTPのヘッダーと本文には該当するエラーに関する詳細が含まれます
レポート期間の終了時に再度API呼び出しをすることが可能になります
ヘッダー


上限を超えた後でAPI応答に表示されるHTTPヘッダーは以下のとおりです。



過負荷のヘッダー

意味


NewRelic-OverloadProtection-Reset

現在のレポート期間終了時のUNIXタイムスタンプ(1970年1月1日以降の秒数)。


NewRelic-OverloadProtection-Docs

追加情報をすぐに取得できるこのドキュメントへのハイパーリンク。