1

Apache Tika 应该可以通过 HTTP 从 Python 程序访问,但我无法让它工作。

我正在使用这个命令来运行服务器(最后有和没有两个选项):

java -jar tika-server-1.17.jar --port 5677 -enableUnsecureFeatures -enableFileUrl

它适用于 curl:

curl -v -T /tmp/tmpsojwBN  http://localhost:5677/tika
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 5677 (#0)
> PUT /tika HTTP/1.1
> Host: localhost:5677
> User-Agent: curl/7.47.0
> Accept: */*
> Accept-Encoding: gzip, deflate
> Content-Length: 418074
> Expect: 100-continue
> 
< HTTP/1.1 100 Continue
* We are completely uploaded and fine
< HTTP/1.1 200 OK
< Content-Type: text/plain
< Date: Sat, 07 Apr 2018 12:28:41 GMT
< Transfer-Encoding: chunked
< Server: Jetty(8.y.z-SNAPSHOT)

但是当我尝试类似的东西时(尝试了不同的标题组合,在这里我重新创建了与 python-tika 客户端使用的相同的标题):

with tempfile.NamedTemporaryFile() as tmp_file:
    download_file(url, tmp_file)
    payload = open(tmp_file.name, 'rb')
    headers = {
        'Accept': 'application/json',
        'Content-Disposition': 'attachment; filename={}'.format(
            os.path.basename(tmp_file.name))}
    response = requests.put(TIKA_ENDPOINT_URL + '/tika', payload,
                            headers=headers,
                            verify=False)

我尝试使用有效负载以及 fileUrl -WARN javax.ws.rs.ClientErrorException: HTTP 406 Not Acceptable在服务器上具有相同的结果和 java 堆栈跟踪。完整跟踪:

WARN  javax.ws.rs.ClientErrorException: HTTP 406 Not Acceptable
    at org.apache.cxf.jaxrs.utils.SpecExceptions.toHttpException(SpecExceptions.java:117)
    at org.apache.cxf.jaxrs.utils.ExceptionUtils.toHttpException(ExceptionUtils.java:173)
    at org.apache.cxf.jaxrs.utils.JAXRSUtils.findTargetMethod(JAXRSUtils.java:542)
    at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:177)
    at org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:77)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
    at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
    at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:274)
    at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:261)
    at org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:76)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1088)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1024)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
    at org.eclipse.jetty.server.Server.handle(Server.java:370)
    at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)
    at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:973)
    at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:1035)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:641)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:231)
    at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:696)
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:53)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
    at java.lang.Thread.run(Thread.java:748)

我还尝试比较(与nc -l localhost 5677 | less)两个请求的不同之处(有效载荷缩写):

从卷曲:

PUT /tika HTTP/1.1
Host: localhost:5677
User-Agent: curl/7.47.0
Accept: */*
Content-Length: 418074
Expect: 100-continue

%PDF-1.4
%<D3><EB><E9><E1>
1 0 obj
<</Creator (Chromium)

来自 Python 请求库:

PUT /tika HTTP/1.1
Host: localhost:5677
Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: application/json
User-Agent: python-requests/2.13.0
Content-type: application/pdf
Content-Length: 246176

%PDF-1.4
%<D3><EB><E9><E1>
1 0 obj
<</Creator (Chromium)

问题是,从 Python 调用 Tika 服务器的正确方法是什么?

我还尝试tika了仅客户端模式下的 python 库并通过 jnius 使用 tika-app。使用 tika 客户端,以及将 tika-app.jar 与 pyjnius 一起使用,当我在 celery worker 中使用它们时,我只会冻结(调用永不返回)。同时,pyjnius / tika-app 和 tika-python 脚本都可以在脚本中很好地工作:我还没有弄清楚 celery worker 内部有什么问题。我想,与错误位置的线程和/或初始化有关。但这是另一个问题的话题。

这是 tika-python 的要求:

PUT /tika HTTP/1.1
Host: localhost:5677
Connection: keep-alive
Accept-Encoding: gzip, deflate
Accept: application/json
User-Agent: python-requests/2.13.0
Content-Disposition: attachment; filename=tmpb3YkTq
Content-Length: 183234

%PDF-1.4
%<D3><EB><E9><E1>
1 0 obj
<</Creator (Chromium)

现在看来这是 tika 服务器的某种问题:

$ tika-python --verbose --server 'localhost' --port 5677 parse all /tmp/tmpb3YkTq
2018-04-08 09:44:11,555 [MainThread  ] [INFO ]  Writing ./tmpb3YkTq_meta.json
(<open file '<stderr>', mode 'w' at 0x7f0b688eb1e0>, 'Request headers: ', {'Accept': 'application/json', 'Content-Disposition': 'attachment; filename=tmpb3YkTq'})
(<open file '<stderr>', mode 'w' at 0x7f0b688eb1e0>, 'Response headers: ', {'Date': 'Sun, 08 Apr 2018 06:44:13 GMT', 'Transfer-Encoding': 'chunked', 'Content-Type': 'application/json', 'Server': 'Jetty(8.y.z-SNAPSHOT)'})
['./tmpb3YkTq_meta.json']

参照:

$ tika-python --verbose --server 'localhost' --port 5677 parse text /tmp/tmpb3YkTq
2018-04-08 09:43:38,326 [MainThread  ] [INFO ]  Writing ./tmpb3YkTq_meta.json
(<open file '<stderr>', mode 'w' at 0x7fc3eee4a1e0>, 'Request headers: ', {'Accept': 'application/json', 'Content-Disposition': 'attachment; filename=tmpb3YkTq'})
(<open file '<stderr>', mode 'w' at 0x7fc3eee4a1e0>, 'Response headers: ', {'Date': 'Sun, 08 Apr 2018 06:43:38 GMT', 'Content-Length': '0', 'Server': 'Jetty(8.y.z-SNAPSHOT)'})
2018-04-08 09:43:38,409 [MainThread  ] [WARNI]  Tika server returned status: 406
['./tmpb3YkTq_meta.json']
4

0 回答 0