2017-02-14 18 views
0

私は、WebページのBeautifoulSoupオブジェクトを要求するために私のスクリプトでこの機能を使用するを受け取った場合に確認してください:Pythonの要求が全ページ

def getSoup(url): 
    headers = { 
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36' 
    } 
    i = 0 
    while i == 0: 
     print '(%s) (INFO) Connecting to: %s ...' % (getTime(), url) 
     data = requests.get(url, headers=headers).text 
     soup = BeautifulSoup(data, 'lxml') 
     if soup == None: 
      print '(%s) (WARN) Received \'None\' BeautifulSoup object, retrying in 5 seconds ...' % getTime() 
      time.sleep(5) 
     else: 
      i = 1 
    return soup 

私は、有効なBeautifulSoupオブジェクトを受け取るまで、このループが、私がいることを考えていました私は不完全なWebページを受け取ることもできますが、まだ有効なBeautifulSoupオブジェクトを持っています。

if '</hml>' in str(data): 
    #the page is completly loaded 

しかし、私はこのように使用するのが安全かどうかわかりません。リクエストやBeautifulSoupでページが正しくダウンロードされたかどうかを確認する安全な方法はありますか?

答えて

1

1つの方法は、リクエストのステータスコードを確認し、部分的なコンテンツレスポンス(206)を受け取ったかどうかを確認することです。標準的なHTTP応答のリストとその定義がリストされていますhere

response = requests.get(url, headers=headers) 
if response.status_code == 200: 
    soup = BeautifulSoup(response.data + partial_data, 'lxml') 
    partial_data = None 
    if soup == None: 
     print '(%s) (WARN) Received \'None\' BeautifulSoup object, retrying in 5 seconds ...' % getTime() 
     time.sleep(5) 
elif reponse.status_code == 206: 
    # store partial data here 
    partial_data += response.data