2016-08-18 8 views
2

proxybrokerを使用して、特定の国でアクティブなプロキシを含むファイルを生成しようとしています。私はいつも同じエラーをプロキシをフェッチしようとします。このエラーは、proxbrokerが使用するpackeのエンコード/デコードエラーのようです。しかし、私はproxybrokerを使う良い方法があるかもしれないと思う。python3.5でproxybrokerを使用するとエンコーディングエラーが発生する

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()です。 htmlページをテキストとして取得します。 aiohttpはchardetライブラリを使用して適切なエンコードを判断しようとしますが、不正な形式のページでは不可能です。

私は、にデコードせずにbytesというページを取得するために、をresp.read()に置き換えてください。

+0

ありがとう、私はproxybrokerで問題を提出しました!これは問題のようです。 – SSchneid

+1

resp.text()をresp.read()に変更し、文字列の代わりにバイトオブジェクトを取得すると、それをどこかの文字列に変換する必要があります。 しかし、その変換では、読めない応答のバイトがあるので、常にデコードエラーがスローされます。 – SSchneid

+1

broxybrokerには 'latin1'だけで十分です。 これは決して失敗しません。 –

関連する問題