与往常一样,我经常遇到问题,而且我已经彻底搜索了当前问题的答案,但却发现自己处于亏损状态。以下是我搜索过的一些地方: - How to fix httplib.BadStatusLine exception? - Python httplib2 Handling Exceptions - python http status code
我的问题如下。我创建了一个蜘蛛,并希望抓取不同的网址。当我独立抓取每个网址时,一切正常。但是,当我尝试抓取这两个时,我收到以下错误:httplib.BadStatusLine: ''
我已经按照我读过的一些建议(参见上面提到的链接)并且可以为每个请求打印response.status,但是response.url不会打印并且会抛出错误。 (我只打印两个语句以尝试识别错误的来源)。
我希望这很清楚。
我正在使用scrapy和selenium
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()
答案 0 :(得分:20)
基于Python Doc,如果服务器使用我们不理解的HTTP状态代码进行响应,则会引发httplib.BadStatusLine
。
您可以尝试传递此异常。如果您打算拨打多个网址,则不应关闭您的驱动程序。
试试这个:
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
答案 1 :(得分:1)
我做了一个装饰工作来做最好的答案,以便使代码易于重复使用。这是:
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
答案 2 :(得分:0)
我遇到了这个错误,因为我在其上定义了一个名为selenium.webdriver
的{{1}}实例(名为driver
),然后尝试在退出驱动程序上调用driver.quit()
。解决方案是不要拨打driver.get(url)
。
答案 3 :(得分:0)
我不确定这会有多大帮助,但对我来说,我试图发出一个POST请求,你需要一个新的HTTP连接才能做到这一点。您不能对多个请求使用相同的连接。我继续得到同样的错误:httplib.BadStatusLine:''。我相信文档概述了这一点,我只是忽略了它。