2013-08-22 1 views
1

Как сказано в заголовке, я пытаюсь получить доступ к URL через несколько разных прокси последовательно (используя цикл). Сейчас это мой код:Python: Как использовать библиотеку запросов для доступа к URL-адресу через несколько разных прокси-серверов?

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-адрес маршрутизатора. Другими словами, он не пытается получить доступ через прокси-серверы, которые я ему даю, это просто цикл и использование моего снова и снова. Что я делаю не так?

+0

Как я уже говорил по одному из ваших предыдущих вопросов, вам будет намного легче понять, что происходит, если вы распечатываете некоторые промежуточные значения, которые вы проходите, или запускаете отладчик или интерактивный визуализатор или какой-либо другой способ их видеть. Если вы напечатали каждую '{'http: строка}', было бы довольно очевидно, что происходит не так. – abarnert

+0

Зачем мне печатать каждую {'http: line}? Разве это не так просто напечатать URL-адрес несколько раз? Не следует ли распечатывать html на веб-странице, чтобы я мог проверить, что это IP-адрес прокси-сервера? – BigBoy1337

+1

Если вы не знаете, что распечатать, вы узнаете, что происходит. Если вы думаете, что знаете, что распечатать, вы узнаете, правы ли вы. Это самая простая отладка. Очевидно, что что-то в вашем скрипте не делает то, что вы ожидали. Первый шаг - выяснить, в какой момент все идет не так, и единственный способ сделать это - посмотреть на ценности и посмотреть, не ошибаются ли они. – abarnert

ответ

2

Есть две очевидные проблемы прямо здесь:

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

Во-первых, потому что у вас есть for line in urls: внутри for line in proxies:, line будет текущий URL здесь, а не текущий прокси. И кроме того, даже если вы не использовали повторно line, это будет строковое представление JSON, а не dict, которое вы расшифровали из JSON.

Затем, если вы исправите это, чтобы использовать proxy, вместо чего-то вроде {'https': '83.22.41.1:3128'}, вы проходите {'http': {'https': '83.22.41.1:3128'}}. И это, очевидно, не является допустимым значением.

Чтобы решить обе эти проблемы, просто сделать это:

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

Между тем, что происходит, когда у вас есть URL HTTPS, но текущий прокси является HTTP прокси-сервер? Вы не собираетесь использовать прокси-сервер. Таким образом, вы, вероятно, хотите что-то добавить, чтобы пропустить через них, как это:

if urlparse.urlparse(url).scheme not in proxy: 
    continue 
+0

Я обновляю код, чтобы вы ответили. Я не уверен, добавил ли оператор if в нужное место? – BigBoy1337

+0

@ BigBoy1337: Как узнать, добавили ли вы оператор if в нужное место в коде, который я даже не вижу? – abarnert

+0

жаль, что я обновил код вопроса, но понял, что вопрос не будет иметь никакого смысла. Потому что теперь он дает правильный результат. Я просто смущен тем, где должно быть вставлено заявление if, которое вы дали? – BigBoy1337

3

По this нить, вам нужно указать proxies словарь в качестве {"protocol" : "ip:port"}, поэтому файл прокси должен выглядеть

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

EDIT: Вы повторно использовать line как для URL-адресов и прокси-серверов. Это нормально, чтобы повторно использовать line во внутреннем цикле, но вы должны использовать proxies=proxy - вы уже разбирали JSON и не нуждались в создании другого словаря. Кроме того, как говорит abanert, вы должны сделать проверку, чтобы убедиться, что запрашиваемый протокол соответствует запросу прокси. Причина, по которой прокси указывается в качестве словаря, заключается в разрешении поиска соответствующего протокола.

+1

этот ответ полезен, и кажется, что вы правы. Однако после того, как я его исправил, я столкнулся с тем же вопросом. Есть идеи? – BigBoy1337

+0

Вышеупомянутое должно исправить это. Дайте мне знать, если это не так (хотя будьте осторожны с точкой согласования протокола). –

+0

Я тестировал это, и это сработало. Просто замените: proxies = {'http': line} с прокси = прокси – JoelWilson

1

непосредственно скопированы из another answer шахты.

Ну, на самом деле вы можете, я сделал это с несколькими строками кода, и он работает очень хорошо.

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']) 

это просто, но на самом деле работает для меня.

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

  • Нет связанных вопросов^_^