PhantomJS 擷圖 亂碼修正
使用PhantomJS拮取網站擷時,有時會因為網站Server的Content-Type沒有指定 charset 造成亂碼。Github 上有一個 issue 也是同樣的問題還沒解決。後來想到可以用 chardet 配上HTTP Proxy 來改寫Content-Type header。以上是一個簡單的script來解決這樣的問題:
注意這個script依賴 miproxy 在執行這個 script 後,就會啟動一個 HTTP proxy server 在 localhost:8080,接著在執PhanotmJS時加上 --proxy=127.0.0.1:8080 這個參數,即:
這樣 PhantomJS 所有的 request 都會經過這個 proxy server, proxy server 會利用 chardet 偵測編碼,並改寫 Content-Type 裡的 charset。這樣 PhantomsJS 便可以正確識別編碼而擷取正確的截圖。
from miproxy.proxy import RequestInterceptorPlugin, ResponseInterceptorPlugin, AsyncMitmProxy
from mimetools import Message
from StringIO import StringIO
import chardet
class DebugInterceptor(RequestInterceptorPlugin, ResponseInterceptorPlugin):
def do_response(self, data):
request_line, headers_alone = data.split('\r\n', 1)
headers = Message(StringIO(headers_alone))
mime = headers['content-type'].split(';')
if mime[0] == 'text/html':
encoding = chardet.detect(data)['encoding']
print '%s\nChanging encoding to : %s' % (request_line, encoding)
ct = 'text/html; charset=%s' % encoding
data = data.replace(headers['content-type'], ct)
return data
if __name__ == '__main__':
print 'Starting proxy server ...'
proxy = AsyncMitmProxy()
proxy.register_interceptor(DebugInterceptor)
try:
proxy.serve_forever()
except KeyboardInterrupt:
proxy.server_close()
注意這個script依賴 miproxy 在執行這個 script 後,就會啟動一個 HTTP proxy server 在 localhost:8080,接著在執PhanotmJS時加上 --proxy=127.0.0.1:8080 這個參數,即:
$ phantomjs --proxy=127.0.0.1:8080 screenshot.js url test.jpg
這樣 PhantomJS 所有的 request 都會經過這個 proxy server, proxy server 會利用 chardet 偵測編碼,並改寫 Content-Type 裡的 charset。這樣 PhantomsJS 便可以正確識別編碼而擷取正確的截圖。
留言