代码之家  ›  专栏  ›  技术社区  ›  SIM

不能以正确的方式使用代理

  •  0
  • SIM  · 技术社区  · 7 年前

    shuffle() 在我的脚本中随机获取代理。剧本在某种程度上做得很好。这个脚本的问题是,当它无法使用任何有效的代理时,它会使用另一个代理 网址 因为循环。如何以这种方式更正脚本,使其尝试使用列表中的每个代理(如果需要)来获取所有 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 回复  |  直到 6 年前
        1
  •  2
  •   jedwards    7 年前

    关于:

    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) 是的,但更传统的方法是只返回列表,然后根据需要在其中的某个部分上循环。你已经列了清单,不需要额外的努力就可以返回。