httplib.BadStatusLine:''

时间:2014-12-23 11:16:13

标签: python selenium scrapy

与往常一样,我经常遇到问题,而且我已经彻底搜索了当前问题的答案,但却发现自己处于亏损状态。以下是我搜索过的一些地方: - 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()

4 个答案:

答案 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:''。我相信文档概述了这一点,我只是忽略了它。