いつものように、私は頻繁に問題を抱えており、現在の答えを徹底的に検索しましたが、途方に暮れています。検索した場所の一部を次に示します。- httplib.BadStatusLine例外を修正する方法は? - Python httplib2の処理例外 - python httpステータスコード
私の問題は次のとおりです。クモを作成しましたが、異なるURLをクロールしたいです。各URLを個別にクロールすると、すべてが正常に機能します。ただし、両方をクロールしようとすると、次のエラーが表示されます:httplib.BadStatusLine: ''
私が読んだいくつかのアドバイスに従い(上記のリンクを参照)、各リクエストのresponse.statusを印刷できますが、response.urlは印刷されず、エラーがスローされます。 (エラーの原因を特定するために、両方のステートメントを印刷するだけです)。
これが明確であることを願っています。
私はスクレイピーとセレンを使用しています
class PeoplePage(Spider):
name = "peopleProfile"
allowed_domains = ["blah.com"]
handle_httpstatus_list = [200, 404]
start_urls = [
"url1",
"url2"
]
def __init__(self):
self.driver = webdriver.Firefox()
def parse(self, response):
print response.status
print '???????????????????????????????????'
if response.status == 200:
self.driver.implicitly_wait(5)
self.driver.get(response.url)
print response.url
print '!!!!!!!!!!!!!!!!!!!!'
# DO STUFF
self.driver.close()
Python Doc 、httplib.BadStatusLine
不明なHTTPステータスコードでサーバーが応答した場合に発生します。この例外を渡そうとすることができます。複数のURLを呼び出す場合は、ドライバーを閉じないでください。
これを試して:
def parse(self, response):
try:
print response.status
print '???????????????????????????????????'
if response.status == 200:
self.driver.implicitly_wait(5)
self.driver.get(response.url)
print response.url
print '!!!!!!!!!!!!!!!!!!!!'
# DO STUFF
except httplib.BadStatusLine:
pass
コードを簡単に再利用できるように、トップアンサーが行うことを行うデコレーターを作成しました。ここにあります:
import http
def pass_bad_status_line_exc(wrapped_function):
"""
Silently pass this exception `http.client.BadStatusLine` decorator
"""
def _wrapper(*args, **kwargs):
try:
result = wrapped_function(*args, **kwargs)
except http.client.BadStatusLine:
return
return result
return _wrapper
driver.quit()
という名前の_Selenium.webdriver
_インスタンス(driver
という名前)を定義し、終了ドライバーでdriver.get(url)
を呼び出そうとしたため、このエラーが発生しました。 。解決策は、driver.quit()
を呼び出さないことです。
これがどれだけ役立つかはわかりませんが、私にとってはPOSTリクエストを発行しようとしていました。それを行うには新しいHTTP接続が必要です。使用できません。複数のリクエストに対して同じ接続を使用します。同じエラーが引き続き発生します:httplib.BadStatusLine: ''。ドキュメントでこれが概説されていると思いますが、見落としました。