2

更新:問題は不完全なドキュメントでした。イベント ディスパッチャーが kwargs をフック関数に渡しています。

さまざまな文字列を確認したい約 3 万の URL のリストがあります。Requests & BeautifulSoup を使用したこのスクリプトの動作バージョンがありますが、スレッドや非同期リクエストを使用していないため、非常に低速です。

最終的に私がやりたいことは、URL ごとに html をキャッシュして、各サイトに冗長な HTTP リクエストを行わずに複数のチェックを実行できるようにすることです。HTML を保存する関数がある場合、HTTP GET 要求を非同期に送信してから応答オブジェクトを渡す最良の方法は何ですか?

Grequests (ここで説明されているように) と「フック」パラメーターを使用しようとしましたが、エラーが発生し、ドキュメントはあまり詳しく説明されていません。ですから、経験豊富な人が光を当てることができることを願っています。

私が達成しようとしていることの簡単な例を次に示します。

import grequests

urls = ['http://www.google.com/finance','http://finance.yahoo.com/','http://www.bloomberg.com/']

def print_url(r):
    print r.url

def async(url_list):
    sites = []
    for u in url_list:
        rs = grequests.get(u, hooks=dict(response=print_url))
        sites.append(rs)
    return grequests.map(sites)

print async(urls)

そして、次の TypeError を生成します。

TypeError: print_url() got an unexpected keyword argument 'verify'
<Greenlet at 0x32803d8L: <bound method AsyncRequest.send of <grequests.AsyncRequest object at 0x00000000028D2160>>
(stream=False)> failed with TypeError

デフォルトで「verify」をキーワード引数として送信する理由がわかりません。ただし、何かが機能するのは素晴らしいことですので、誰かが提案を持っている場合は (grequests を使用するか、その他の方法で) 共有してください:)

前もって感謝します。

4

1 に答える 1