2017-04-15 14 views
1

私は良い結果でリクエストを使用しましたが、この特定のURLではリダイレクトループブレイクが発生します。<TooManyRedirects:30リダイレクトを超過しました。>> Pythonでのリクエストを使用した例外?

s = requests.Session() 
page = s.get('http://pe.usps.gov/text/pub28/28apc_002.htm') 
tree = html.fromstring(page.content) 
street_type = tree.xpath(r"//*[@id='ep533076']/tbody/tr[2]/td[1]/p/a") 
print(street_type) 

リダイレクトを回避するために、リクエストのヘッダーを割り当てる方法があるのか​​どうかは疑問です。私は実際のURLをテストし、それは有効に見えます。

おかげ

答えて

3

は、リダイレクトは、サーバによって送信された応答です。これは一般的にHTTP <301>または<302>の応答です。「ねえ、あなたが探していることは分かっていて、ここで終わっています...」あなたに新しい場所を送ります。はい、これらは一緒に連鎖することができます。はい、あなたはループで終わることができます。それは最大リダイレクト制限のためのものです。

s.max_redirects = 50 # the default is 30 

をしかし、これは問題を解決することはできません。

あなたは使用して要求に許容リダイレクトの数を設定することができます。この特定のケースでは、サーバーは使用しているブラウザーの種類を探していて、探しているものが見つからないときにリダイレクトしています。ヘッダーにuser-agentフィールドを追加して、ブラウザを模倣することができます。

推奨使用方法:必ずしもあなたが望むものではないセッション全体のためのヘッダを設定:単一の要求

session.get(url, headers={'user-agent': 'My app'}) 

# returns: 
<Response [200]> 

オリジナルの投稿のための一般的なブラウザにヘッダを設定します

s.headers = {'user-agent': 'some app'} 
s.get('http://pe.usps.gov/text/pub28/28apc_002.htm') 

# returns: 
<Response [200]> 
+0

この特殊なケースでは、ブラウザのユーザーエージェントを偽装する必要はありません。必要であれば、偽装することをおすすめします。代わりに、アプリ固有のユーザーエージェントを含めます。例えば'session.header ['User-Agent'] = 'My App'' –

+0

これはおそらく本当です。私は火かぶ虫からコピーしたばかりです。 – James

+0

また、完了のために、ヘッダーkwargを使用してセッション全体ではなく、個々の要求にヘッダーを追加できると付け加えてください。 'session.get(url、headers = {'user-agent': 'My app'})' –

関連する問題