Я пытаюсь использовать 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?
Спасибо, я отправил вопрос в proxybroker! Кажется, это проблема. – SSchneid
Если я изменил resp.text() на resp.read() и therby, получим объект bytes вместо строки, которую я должен преобразовать в строку где-нибудь. Но это преобразование всегда будет вызывать ошибку декодирования, поскольку в ответе он не может быть байтом, верно? – SSchneid
Для broxybroker нужно просто «latin1» должно быть достаточно. Это никогда не потерпит неудачу. –