【问题标题】:Skip Connection Interruptions (Site & BeautifulSoup)跳过连接中断(站点和 BeautifulSoup)
【发布时间】:2013-12-19 00:57:36
【问题描述】:

我目前正在使用我的脚本执行此操作:

获取正文(来自源代码)并搜索字符串,直到找到字符串为止。 (如果网站更新。)

不过,如果连接丢失,脚本就会停止。

我的“连接”代码如下所示(每 20 秒在 while 循环中不断重复):

opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]

url = ('url')
openUrl = opener.open(url).read()

soup = BeautifulSoup(openUrl)

我用过 urllib2 和 BeautifulSoup。

谁能告诉我如何让脚本在连接丢失时“冻结”并查看互联网连接是否存在?然后根据答案继续。(所以,检查脚本是否可以连接,而不是查看站点是否启动。如果这样做检查,脚本将停止并出现一堆错误。)

谢谢!

【问题讨论】:

    标签: python sockets beautifulsoup keep-alive


    【解决方案1】:

    找到了解决办法!

    所以,我需要在实际操作之前检查每个 LOOP 的连接。

    所以我创建了这个函数:

    def check_internet(self):
        try:
            header = {"pragma" : "no-cache"}
            req = urllib2.Request("http://www.google.ro", headers=header)
            response = urllib2.urlopen(req,timeout=2)
            return True
        except urllib2.URLError as err:
            return False
    

    它工作正常,在我的连接断开和断开的情况下对其进行了测试!

    对于其他新手来说:

    while True:
         conn = check_internet('Site or just Google, just checking for connection.')
         try:
             if conn is True:
             #code
             else:
             #need to make it wait and re-do the while.
             time.sleep(30)
         except: urllib2.URLError as err:
             #need to wait
             time.sleep(20)
    

    完美运行,脚本已经运行了大约 10 个小时,它完美地处理了错误!它也适用于我的连接关闭并显示正确的消息。

    欢迎提出优化建议!

    【讨论】:

    • 检查连接是否正常并不重要,检查网站是否正在运行更重要。所以你真正应该做的是尝试连接到你的目标网站(不是谷歌);如果状态码是以 4 或 5 开头的任何内容,则等待。否则,尝试处理请求。
    • 这就是脚本正在做的事情。好吧,只是没有响应处理。但请注意。我只是忘记将其更改为我的网站。我有点“我想检查我的连接”的心态。非常感谢,我会查找回复以及如何阅读它们!
    • 没有响应处理...我认为@BurhanKhalid 意味着您必须检查响应(...网站正在运行-> 更重要),如果您不这样做,那么您只是在检查连接(没那么重要)
    【解决方案2】:

    与其“冻结”脚本,不如让脚本仅在连接处于活动状态时继续运行。如果它还活着,请运行您的代码。如果它不存在,请尝试重新连接或停止执行。

    while keepRunning:
       if connectionIsAlive():
          run_your_code()
       else:
          reconnect_maybe()
    

    这里描述了一种检查连接是否存在的方法Checking if a website is up via Python

    如果您的程序“因一堆错误而停止”,那可能是因为您没有正确处理无法连接到网站的情况(由于各种原因,例如您没有互联网,他们的网站已关闭等)。

    您需要使用try/except 块来确保捕获由于无法打开实时连接而发生的任何错误。

    try:
       openUrl = opener.open(url).read()
    except urllib2.URLError:
       # something went wrong, how to respond?
    

    【讨论】:

    • 您好 - 谢谢,但这不是我一直在寻找的,我想我还不够清楚。首先,我希望 Python 进行检查 - 如果我的互联网连接正常。如果它在没有互联网连接的情况下检查站点的状态,它会再次停止并出现一堆错误。我需要它说“好的,连接已启动”,然后它会继续执行我要求它执行的任何操作。谢谢。
    • 你不需要知道你是否有互联网,这并不重要。重要的是您是否能够连接到该站点。检查您是否有互联网连接就像尝试访问一个您知道应该 100% 正常运行的网站(如 Google)一样简单。
    • 谢谢 - 很有帮助,但忘记回复了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多