【问题标题】:Random HTTP 503 Error using urllib and BeautifulSoup使用 urllib 和 BeautifulSoup 的随机 HTTP 503 错误
【发布时间】:2012-10-23 14:22:36
【问题描述】:

我正在使用 cookie 抓取网站。他们提供了多个下拉菜单,我正在遍历每个选项并在每个请求中重新捕获会话 cookie。代码运行了一段时间,但我随机得到一个 503 错误。

我的代码将数据插入 PostgreSQL 数据库,为了帮助强调此错误的随机性,我想分享一下,在插入少至 1200 个条目(行)和多至 4200 个条目后,我收到了 503。没有这似乎不是引发此异常的任何模式。我无法理解它。

如果有帮助,这是我的代码的一部分:

# -*- coding: utf-8 -*-

import scrape_tools
import psycopg2
import psycopg2.extras
import urllib
import urllib2
import json
import cookielib
import time


tools = scrape_tools.tool_box()
db = tools.db_connect()
psycopg2.extras.register_hstore(db)
cursor = db.cursor(cursor_factory = psycopg2.extras.RealDictCursor)

cookiejar = cookielib.CookieJar()
opener = urllib2.build_opener(
    urllib2.HTTPRedirectHandler(),
    urllib2.HTTPHandler(debuglevel=0),
    urllib2.HTTPSHandler(debuglevel=0),
    urllib2.HTTPCookieProcessor(cookiejar),
)

url ='http://www.website.com/'
soup = tools.request(url)

type_select = soup('select',{'id':'type'})
for option_tag in type_select:
    select_option = option_tag('option')
    for option_contents in select_option:
        if 'Select' in option_contents.contents[0]:
            continue
        type = option_contents.contents[0]
        type_val = option_contents['value']
        print 'Type', type

        get_more_url = 'http://www.website.com/' + type_val
        request2 = urllib2.Request(get_more_url)
        fp2 = opener.open(request2)
        html2_object = fp2.read()
        json_result = json.loads(html2_object)

        for json_dict in json_result:
            for json_key in json_dict:
                if len(json_key) == 0:
                    continue
                more_data = json_dict[json_key]
                print '   ', more_data

               (---Out of courtesy, I'll stop here--)

(*请注意,scrape_tools 是自定义模块)

我是否缺少 cookie 存储的内容?我错过了一些明显的东西吗?我似乎无法弄清楚为什么会这样。我已经“googled”、“stackoverflowed”等几个小时试图找到遇到类似问题的人,但没有找到任何东西。

我过去也使用 selenium 来抓取数据并将其放在口袋里作为最后的手段,但这个项目非常庞大,我宁愿不让 Firefox 在一周内占用服务器上的内存。

【问题讨论】:

  • 也许您收到 503 的原因是请求数量过多(但您绝对应该进行一些异常处理)。这将是礼貌的,并且可以消除 503 在请求之间设置 time.sleep。
  • @Cheezey 最后的迭代是在包含(通常)几十个目标页面的列表页面上。在每个最终请求之前我都有一个time.sleep(2)(注意import time)。我想我可以在每次迭代之间睡觉,但我只请求一个包含 json 字符串的页面。如果做得太快,甚至会导致 503 吗?
  • 可能不是,但这只是一个建议。它可能不是导致 503(注意“可能”和“可能”)。

标签: python web-scraping beautifulsoup urllib2 urllib


【解决方案1】:

HTTP 状态 503,“服务不可用”,表示由于某种原因服务器无法处理您的请求,但这通常是暂时性错误。如果您稍等片刻,然后重试相同的请求,它可能会成功。

您确实需要能够在大规模抓取作业中处理这种暂时性故障,因为互联网上充满了暂时性错误。连接失败或一直被丢弃。不过,您通常只需要一个简单的重试策略。

但是,状态 503 可能特别意味着您请求页面的速度太快了。如果您在页面获取之间没有延迟,出于礼貌起见,您应该添加一个。

【讨论】:

    猜你喜欢
    • 2012-12-09
    • 2021-09-05
    • 2013-04-12
    • 2016-12-23
    • 1970-01-01
    • 2014-02-18
    • 2023-04-05
    • 2015-07-23
    相关资源
    最近更新 更多