随机HTTP 503使用urllib和BeautifulSoup时出错

时间:2012-11-02 21:46:29

标签: python web-scraping beautifulsoup urllib2 urllib

我正在使用cookies抓取一个网站。它们提供了多个下拉菜单,我正在遍历每个选项,并在每次请求时重新捕获会话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的东西吗?我错过了一些明显的东西吗我似乎无法弄清楚为什么会这样。我已经'谷歌搜索','stackoverflowed'等几个小时试图找到有类似问题的人,但没有找到任何东西。

我过去也使用过selenium来获取数据并将其放在口袋中作为最后的手段,但是这个项目非常庞大,而且我宁愿让Firefox在服务器上耗费一周的内存。 / p>

1 个答案:

答案 0 :(得分:4)

HTTP状态503,“服务不可用”,表示由于某种原因服务器无法处理您的请求 - 但它通常是暂时性错误。如果你稍等一下并重试相同的请求,它可能会有效。

您需要能够在大规模抓取工作中处理此类瞬态故障,因为Internet充满了瞬态错误。连接失败或一直被丢弃。通常只需要一个简单的重试策略。

状态503可能具体意味着您要求的页面过快。如果你在页面提取之间没有延迟,你应该添加一个,以礼貌。