1

正如标题中所说,我试图通过几个不同的代理顺序访问一个 url(使用 for 循环)。现在这是我的代码:

import requests
import json
with open('proxies.txt') as proxies:
    for line in proxies:
        proxy=json.loads(line)
        with open('urls.txt') as urls:
        for line in urls:
            url=line.rstrip()
            data=requests.get(url, proxies={'http':line})
            data1=data.text
            print data1

和我的 urls.txt 文件:

http://api.exip.org/?call=ip

和我的 proxies.txt 文件:

{"https": "84.22.41.1:3128"}
{"http":"194.126.181.47:81"}
{"http":"218.108.170.170:82"}

我在 [www.hidemyass.com][1] 得到的

出于某种原因,输出是

68.6.34.253
68.6.34.253
68.6.34.253

好像它正在通过我自己的路由器 IP 地址访问该网站。换句话说,它不是试图通过我给它的代理访问,它只是循环并一遍又一遍地使用我自己的代理。我究竟做错了什么?

4

3 回答 3

3

根据线程,您需要将proxies字典指定为{"protocol" : "ip:port"},因此您的代理文件应如下所示

{"https": "84.22.41.1.3128"}
{"http": "194.126.181.47:81"}
{"http": "218.108.170.170:82"}

编辑:您正在重用lineURL 和代理。在内部循环中重用很好line,但你应该使用proxies=proxy-- 你已经解析了 JSON 并且不需要构建另一个字典。此外,正如 abanert 所说,您应该进行检查以确保您请求的协议与代理的协议相匹配。将代理指定为字典的原因是允许查找匹配的协议。

于 2013-08-22T00:12:14.310 回答
2

这里有两个明显的问题:

data=requests.get(url, proxies={'http':line})

首先,因为您有一个for line in urls:,for line in proxies:line是这里的当前URL,而不是当前代理。此外,即使您没有重用line,它也将是 JSON 字符串表示,而不是您从 JSON 解码的 dict。

然后,如果你修复它以使用proxy,而不是类似的东西{'https': '83.22.41.1:3128'},你正在传递{'http': {'https': '83.22.41.1:3128'}}. 这显然不是一个有效值。

要解决这两个问题,只需执行以下操作:

data=requests.get(url, proxies=proxy)

同时,当您有一个 HTTPS URL,但当前代理是 HTTP 代理时会发生什么?你不会使用代理。因此,您可能想要添加一些内容以跳过它们,如下所示:

if urlparse.urlparse(url).scheme not in proxy:
    continue
于 2013-08-22T00:42:20.630 回答
1

直接从我的另一个答案复制而来。

好吧,实际上你可以,我已经用几行代码完成了这个,而且效果很好。

import requests


class Client:

    def __init__(self):
        self._session = requests.Session()
        self.proxies = None

    def set_proxy_pool(self, proxies, auth=None, https=True):
        """Randomly choose a proxy for every GET/POST request        
        :param proxies: list of proxies, like ["ip1:port1", "ip2:port2"]
        :param auth: if proxy needs auth
        :param https: default is True, pass False if you don't need https proxy
        """
        from random import choice

        if https:
            self.proxies = [{'http': p, 'https': p} for p in proxies]
        else:
            self.proxies = [{'http': p} for p in proxies]

        def get_with_random_proxy(url, **kwargs):
            proxy = choice(self.proxies)
            kwargs['proxies'] = proxy
            if auth:
                kwargs['auth'] = auth
            return self._session.original_get(url, **kwargs)

        def post_with_random_proxy(url, *args, **kwargs):
            proxy = choice(self.proxies)
            kwargs['proxies'] = proxy
            if auth:
                kwargs['auth'] = auth
            return self._session.original_post(url, *args, **kwargs)

        self._session.original_get = self._session.get
        self._session.get = get_with_random_proxy
        self._session.original_post = self._session.post
        self._session.post = post_with_random_proxy

    def remove_proxy_pool(self):
        self.proxies = None
        self._session.get = self._session.original_get
        self._session.post = self._session.original_post
        del self._session.original_get
        del self._session.original_post

    # You can define whatever operations using self._session

我这样使用它:

client = Client()
client.set_proxy_pool(['112.25.41.136', '180.97.29.57'])

这很简单,但实际上对我有用。

于 2016-03-10T03:45:37.843 回答