Сделать так, чтобы мои get-python-запросы были быстрее

У меня есть Python-скрипт с большим количеством исключений. Я пытаюсь сделать около 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

1 ответ

Во-первых, пожалуйста, замените все эти уродливые блоки try/ кроме одного, например:

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

Может быть, не быстрее, но наверняка гораздо легче читать!

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

Другие вопросы по тегам