2012-11-02 45 views
3

我在用cookies抓取網站。他們提供了多個下拉菜單,我正在遍歷每個選項,並重新捕獲每個請求的會話cookie。代碼運行得很好,但我隨機得到了一個503錯誤。隨機HTTP 503錯誤使用urllib和BeautifulSoup

我的代碼將數據插入到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在服務器上佔用一個星期的內存。

+0

也許你得到503的原因是過多的請求(但你絕對應該有一些異常處理)。這將是有禮貌的,並可以消除503的時間睡眠在請求之間。 – Cheezey

+0

@Cheezey最後一次迭代遍佈包含(通常)數十個目標頁面的列表頁面。我在每次最終請求之前都有'time.sleep(2)'(注意''import time'')。我想我可以在每次迭代之間入睡,但我只是請求一個包含json字符串的頁面。如果做得太快,甚至會導致503? – That1Guy

+0

可能不是,但它只是一個建議。它可能不會導致503(注意「可能」和「可能」)。 – Cheezey

回答

4

HTTP狀態503「服務不可用」表示由於某種原因服務器無法處理您的請求 - 但這通常是一個暫時錯誤。如果您稍等一下並重試相同的請求,它可能會起作用。

因爲Internet充滿了瞬態錯誤,所以您需要能夠處理大規模刮取作業中的這種瞬態故障。連接失敗或始終被丟棄。儘管你需要一個簡單的重試策略。

儘管狀態503可能特別意味着您要求頁面過快。如果你在頁面抓取之間沒有延遲,爲了禮貌,你應該添加一個。