2016-08-18 5 views
2

Я пытаюсь использовать proxybroker для создания файла с активными прокси-серверами для определенных стран. Я всегда получаю ту же ошибку, пытаясь получить прокси. Ошибка, похоже, является ошибкой кодирования/декодирования в пакете, используемом proxbroker. Но я подозреваю, что могут быть лучшие способы использования proxybroker.Использование proxybroker в python3.5 вызывает ошибку кодирования

Это код, который вызывает проблемы:

def gather_proxies(countries): 
""" 
This method uses the proxybroker package to asynchronously get two new proxies per specified country 
and returns the proxies as a list of country and proxy. 

:param countries: The ISO style country codes to fetch proxies for. Countries is a list of two letter strings. 
:return: A list of proxies that are themself a list with two paramters[Location, proxy address]. 
""" 
proxy_list = [] 
types = ['HTTP'] 
for country in countries: 
    loop = asyncio.get_event_loop() 

    proxies = asyncio.Queue(loop=loop) 
    broker = Broker(proxies, loop=loop,) 

    loop.run_until_complete(broker.find(limit=2, countries=country, types=types)) 

    while True: 
     proxy = proxies.get_nowait() 
     if proxy is None: 
      break 
     print(str(proxy)) 
     proxy_list.append([country, proxy.host + ":" + str(proxy.port)]) 
return proxy_list 

и сообщение об ошибке:

../app/main/download_thread.py:344: in update_proxies 
proxy_list = gather_proxies(country_list) 
../app/main/download_thread.py:368: in gather_proxies 
    loop.run_until_complete(broker.find(limit=2, countries=country, types=types)) 
/usr/lib/python3.5/asyncio/base_events.py:387: in run_until_complete 
    return future.result() 
/usr/lib/python3.5/asyncio/futures.py:274: in result 
    raise self._exception 
/usr/lib/python3.5/asyncio/tasks.py:241: in _step 
    result = coro.throw(exc) 
../venv/lib/python3.5/site-packages/proxybroker/api.py:108: in find 
    await self._run(self._checker.check_judges(), action) 
../venv/lib/python3.5/site-packages/proxybroker/api.py:114: in _run 
    await tasks 
/usr/lib/python3.5/asyncio/futures.py:361: in __iter__ 
    yield self # This tells Task to wait for completion. 
/usr/lib/python3.5/asyncio/tasks.py:296: in _wakeup 
    future.result() 
/usr/lib/python3.5/asyncio/futures.py:274: in result 
    raise self._exception 
/usr/lib/python3.5/asyncio/tasks.py:241: in _step 
    result = coro.throw(exc) 
../venv/lib/python3.5/site-packages/proxybroker/checker.py:26: in check_judges 
    await asyncio.gather(*[j.check() for j in self._judges]) 
/usr/lib/python3.5/asyncio/futures.py:361: in __iter__ 
    yield self # This tells Task to wait for completion. 
/usr/lib/python3.5/asyncio/tasks.py:296: in _wakeup 
    future.result() 
/usr/lib/python3.5/asyncio/futures.py:274: in result 
    raise self._exception 
/usr/lib/python3.5/asyncio/tasks.py:239: in _step 
    result = coro.send(None) 
../venv/lib/python3.5/site-packages/proxybroker/judge.py:62: in check 
    page = await resp.text() 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <ClientResponse(http://ip.spys.ru/) [200 OK]> 
<CIMultiDictProxy('Date': 'Thu, 18 Aug 2016 11:02:53 GMT', 'Server': 'Ap...': 'no-cache', 'Vary': 'Accept-Encoding', 'Transfer-Encoding': 'chunked', 'Content-Type': 'text/html; charset=UTF-8')> 

encoding = 'utf-8' 

    @asyncio.coroutine 
    def text(self, encoding=None): 
     """Read response payload and decode.""" 
     if self._content is None: 
      yield from self.read() 

     if encoding is None: 
      encoding = self._get_encoding() 

>  return self._content.decode(encoding) 
E  UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in position 5568: invalid continuation byte 

../venv/lib/python3.5/site-packages/aiohttp/client_reqrep.py:758: UnicodeDecodeError 

Проблема, кажется, в proxybroker или, вернее, пакет aiohttp. Но поскольку это предположительно тестируемый пакет, проблема, вероятно, в моем коде.

Может ли кто-нибудь увидеть, что я сделал не так, или у кого-нибудь есть предложение относительно использования proxybroker?

ответ

1

Проблема в resp.text() call. Он извлекает html-страницу как текст. aiohttp пытается определить правильное кодирование с использованием библиотеки chardet, но для неверных страниц это невозможно.

Я думаю resp.text() следует заменить resp.read() для извлечения страницы, как bytes без декодирования в str.

+0

Спасибо, я отправил вопрос в proxybroker! Кажется, это проблема. – SSchneid

+1

Если я изменил resp.text() на resp.read() и therby, получим объект bytes вместо строки, которую я должен преобразовать в строку где-нибудь. Но это преобразование всегда будет вызывать ошибку декодирования, поскольку в ответе он не может быть байтом, верно? – SSchneid

+1

Для broxybroker нужно просто «latin1» должно быть достаточно. Это никогда не потерпит неудачу. –

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