2016-10-05 7 views
-1

많은 예외가있는 파이썬 스크립트가 있습니다. 약 50,000 건의 요청을하려고합니다. 그리고 지금은 매우 느립니다. 스크립트가 실행되기를 원합니다. 그러므로 connectionError와 거의 모든 예외 요청을 추가했습니다.파이썬 요청 받기가 더 빠르도록 만들기

이 스크립트를 만들 수있는 방법이 있습니까? 이제는 모듈 식보다 훨씬 빠릅니다.

for i in range(50450000,50500000): 
    try: 
     try: 
      try: 
       try: 
        try: 
         try: 
          try: 
           try: 
            try: 
             try: 
              try: 
               try: 

                check_response = 'http://www.barneys.com/product/adidas--22human-race-22-nmd-sneakers-'+str(i)+'.html' 
                make_requests = requests.get(check_response,headers=headers).text 
                soup = BeautifulSoup(make_requests) 
                try: 
                 main_wrapper = soup.find('h1',attrs={'class':'title'}).text 
                 print main_wrapper + ' ' + str(i) 
                except AttributeError: 
                 arr.append(check_response) 
                 with open('working_urls.json','wb') as outfile: 
                  json.dump(arr,outfile,indent=4) 

               except requests.exceptions.InvalidURL: 
                continue 
              except requests.exceptions.InvalidSchema: 
               continue 
             except requests.exceptions.MissingSchema: 
              continue 
            except requests.exceptions.TooManyRedirects: 
             continue 
           except requests.exceptions.URLRequired: 
            continue 
          except requests.exceptions.ConnectTimeout: 
           continue 
         except requests.exceptions.Timeout: 
          continue 
        except requests.exceptions.SSLError: 
         continue 
       except requests.exceptions.ProxyError: 
        continue 
      except requests.exceptions.HTTPError: 
       continue 
     except requests.exceptions.ReadTimeout: 
      continue 
    except requests.exceptions.ConnectionError: 
     continue 
+3

예외를 제외 할 때마다 try/except가 필요하지 않습니다. 한 번의 시도만으로도 충분하며 각 예외를 catch하면됩니다. throw 된 예외가 다음 예외와 일치하지 않으면 catch하려고 시도합니다. 그 중 하나가 적합하거나 아니면 다시 throw되어 스크립트가 중단 될 때까지 다음 예외를 찾습니다. – Philipp

+3

이 모든 것은 * one *로 대체 될 수 있습니다 * except * except * except* except*.RequestException :'절과 일치하는 블록으로 시도하십시오. – vaultah

+1

@vaultah 던져진 타입에 따라 예외를 처리 할 시점이없는 한 사실입니다. – Philipp

답변

3

우선처럼 하나 하나에 의해 블록을 제외한 모든 추악한 시도/교환하십시오 :

for i in range(50450000,50500000): 
    try: 
     check_response = 'http://www.barneys.com/product/adidas--22human-race-22-nmd-sneakers-'+str(i)+'.html' 
     make_requests = requests.get(check_response,headers=headers).text 
     soup = BeautifulSoup(make_requests) 
     try: 
      main_wrapper = soup.find('h1',attrs={'class':'title'}).text 
      print main_wrapper + ' ' + str(i) 
     except AttributeError: 
      arr.append(check_response) 
      with open('working_urls.json','wb') as outfile: 
       json.dump(arr,outfile,indent=4) 
    except requests.exceptions.InvalidURL: 
     continue 
    except requests.exceptions.InvalidSchema: 
     continue 
    except requests.exceptions.MissingSchema: 
     continue 
    ... 

그리고 당신은 모든 일이 모든 경우에 계속있는 경우, 기본 클래스 RequestException를 사용합니다. 그것은 다음과 같이됩니다 :

아마도 더 빠르지 만, 확실히 읽기가 쉽습니다!

속도 문제는 스레드/프로세스 사용을 고려해야합니다. threadingmultiprocessing 모듈을 살펴보십시오.

+0

이것은 코드를 정리하지만 질문의 주요 부분에는 대답하지 않습니다. –

+0

@PadraicCunningham 예, 마지막 문장 2 개를 읽으십시오. 그러나 원하는 경우 개발하거나 다른 아이디어를 제공하십시오. –

+0

링크 된 라이브러리를 사용하는 예제는 어디에 있습니까? 두 개의 링크는 실제로 대답이 아니므로 주석을 주석으로 추가 할 수 있습니다. 속을보고 –