使用urllib和BeautifulSoup的随机HTTP 503错误

我正在用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--)

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

我是否在cookie存储方面缺少什么?我是否缺少明显的东西?我似乎无法弄清楚为什么会这样.我已经“搜索”,“堆栈溢出”等几个小时,试图找到遇到类似问题的人,但是什么也没发现.

我过去也曾使用硒来抓取数据,并把它放在口袋里作为最后的手段,但这个项目很大,我宁愿Firefox一周都不会占用服务器的内存.

解决方法:

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

您确实需要能够处理大规模刮削作业中的此类瞬时故障,因为Internet充满了瞬时错误.连接失败或一直断开.通常,您只需要一个简单的重试策略.

但是,状态503可能意味着您请求页面的速度过快.如果在两次页面获取之间没有延迟,则出于礼貌起见,应添加一个.

上一篇:我如何使用BeautifulSoup插入属性?


下一篇:在python中仅检索网页的标题