2012-11-02 3 views
3

쿠키로 웹 사이트를 고치고 있습니다. 여러 드롭 다운 메뉴를 제공하며 각 옵션을 반복하고 모든 요청에 ​​대해 세션 쿠키를 다시 캡처합니다. 코드는 잠시 동안 정상적으로 실행되지만 임의로 503 오류가 발생합니다.urllib 및 BeautifulSoup을 사용하는 임의의 HTTP 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는 사용자 정의 모듈)

내가 쿠키의 저장 뭔가를 놓치고 있습니까? 나는 명백한 것을 놓치고 있는가? 왜 이런 일이 일어나는지 알 수는 없습니다. 나는 '봤 거든', 'stackoverflowed'등 비슷한 문제가있는 누군가를 찾으려고 노력했지만 아무 것도 발견하지 못했다.

나는 셀레늄을 사용하여 과거에 데이터를 긁어 모으기도했지만 내 주머니에서 최후의 수단으로 사용했습니다.하지만이 프로젝트는 엄청 나서 Firefox는 서버에서 메모리를 1 주일 이상 먹지 않을 것입니다.

+0

아마 503을 얻는 이유는 과도한 요청입니다. (하지만 예외 처리를해야합니다.) 그것은 정중 할 것이고 503을 없애고 요청을 기다릴 수 있습니다. – Cheezey

+0

@Cheezey 마지막 반복은 (대개) 수십 개의 대상 페이지가 포함 된 목록 페이지에 대한 것입니다. 나는 각 마지막 요청 전에'time.sleep (2)'을 가지고있다. ('import time'을 주목하라.) 나는 각 반복 사이에 잠을 잘 수 있다고 생각하지만, 나는 단지 json 문자열을 포함하는 페이지를 요청할 뿐이다. 너무 빨리 끝나면 503이 나올까요? – That1Guy

+0

아마도 그렇지는 않지만 단지 제안 일뿐입니다. 아마도 503을 일으키지 않았을 것입니다 ('아마도'와 '할 수 있음'에 유의하십시오). – Cheezey

답변

4

HTTP 상태 503, "서비스를 사용할 수 없음"은 어떤 이유로 서버가 요청을 처리하지 못했음을 의미하지만 일반적으로 일시적인 오류입니다. 조금 기다렸다가 같은 요청을 다시 시도하면 아마 작동 할 것입니다.

인터넷에 일시적인 오류가 가득하기 때문에 대규모 스크래핑 작업에서 이러한 종류의 일시적인 오류를 처리 할 수 ​​있어야합니다. 연결이 끊어 지거나 끊어집니다. 간단한 재시도 정책은 대개 필요한 모든 것입니다.

상태 503은 특히 페이지를 너무 빨리 요청하고 있음을 의미 할 수 있습니다. 페이지 가져 오기 사이에 지연이 없으면 하나를 추가해야합니다.

관련 문제