2016-10-05 2 views
-1

У меня есть скрипт python с большим количеством исключений. Я пытаюсь сделать около 50 000 запросов. И это очень медленно, так как я также хотел бы, чтобы мой скрипт работал, поэтому я добавил почти все запросы об исключениях, которые имеют в основном отношение к соединениюError и т. Д.Создание так, что мои запросы python бывают быстрее

Есть ли способ сделать этот скрипт поэтому он намного быстрее, чем сейчас, и более модульным?

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

Вам не нужна попытка/исключение для каждого исключения. Одной попытки достаточно, чтобы просто поймать каждое исключение. Если созданное исключение не соответствует следующему исключению, попытка его перехвата переходит к следующему, пока тот не подходит, или он просто будет сброшен и сработает ваш скрипт. – Philipp

+3

Все это может быть заменено на * one * try block с * one * matching 'except request.exceptions.RequestException:' clause. – 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. Это делается:

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.RequestException: 
    pass 

Возможно, не быстрее, но наверняка гораздо проще читать!

Что касается скорости, вы должны рассмотреть возможность использования потоков/процессов. Взгляните на модули threading и multiprocessing.

+0

Это упорядочивает код, но не отвечает на основную часть вопроса. –

+0

@PadraicCunningham Да, пожалуйста, прочитайте 2 последних предложения. Но не стесняйтесь разрабатывать или давать другую идею, если хотите. –

+0

Где примеры использования библиотек, с которыми вы связались? Две ссылки на самом деле не ответ, вы можете добавить их в качестве комментария. Взгляните на обман –

Смежные вопросы