Не могу правильно использовать прокси - PullRequest
0 голосов
/ 15 октября 2018

Я написал скрипт на python для очистки запрошенного URL, сделанного через прокси.Я использовал shuffle() в своем скрипте для случайного получения прокси.Сценарий работает хорошо в некоторой степени.Проблема с этим сценарием заключается в том, что когда он не может использовать какой-либо действительный прокси-сервер, он идет на другой url из-за цикла.Как я могу исправить свой скрипт таким образом, чтобы он пытался использовать все прокси (при необходимости) в списке, чтобы получить все urls.

Это моя попытка:

import requests
from random import shuffle

url = "https://stackoverflow.com/questions?page={}&sort=newest"

def get_random_proxies():
    proxies = ['35.199.8.64:80', '50.224.173.189:8080', '173.164.26.117:3128']
    shuffle(proxies)
    return iter(proxies)

for link in [url.format(page) for page in range(1,6)]:
    proxy = next(get_random_proxies())
    try:
        response = requests.get(link,proxies={"http": "http://{}".format(proxy) , "https": "http://{}".format(proxy)})
        print(f'{response.url}\n{proxy}\n')
    except Exception:
        print("something went wrong!!" + "\n")
        proxy = next(get_random_proxies_iter())

Вывод у меня:

https://stackoverflow.com/questions?page=1&sort=newest
35.199.8.64:80

https://stackoverflow.com/questions?page=2&sort=newest
50.224.173.189:8080

something went wrong!!

https://stackoverflow.com/questions?page=4&sort=newest
50.224.173.189:8080

something went wrong!!

Вы можете видеть, что два URL 'page=3&sort=newest' и 'page=5&sort=newest' не отвечали, тогда как мои два прокси все еще работают.

Постскриптум: это бесплатные прокси, поэтому я намеренно их опубликовал.

1 Ответ

0 голосов
/ 15 октября 2018

Как насчет:

def get_random_proxies():
    proxies = ['35.199.8.64:80', '50.224.173.189:8080', '173.164.26.117:3128']
    shuffle(proxies)
    return proxies

for link in [url.format(page) for page in range(1,6)]:
    for proxy in get_random_proxies():
        try:
            response = requests.get(link,proxies={"http":proxy , "https": proxy})
            print(f'{response.url}\n{proxy}\n')
            break  # success, stop trying proxies
        except Exception:
            print("something went wrong!!" + "\n")

Я не уверен, каков был план с return(iter(...)) и next(result), но более традиционным методом было бы просто вернуть список, а затем перебрать некоторыечасть этого, по мере необходимости.Вы уже составили список, и для его возврата не требуется никаких дополнительных усилий.

...