読者です 読者をやめる 読者になる 読者になる

歩いたら休め

If the implementation is easy to explain, it may be a good idea.

【Python】Web上にあるpdfのタイトルを取得する(中間報告)

Python スクレイピング pdf python-tika

不動産のことよくわかんねーって言ってる友だちがいたので、簡単なスクレイピングのプログラムを書いて、不動産の情報収集を日々行っています。

「urlを集め、htmlの<title>タグの中身(つまりページのタイトル)と一緒に表示する」というロジックです。htmlのparseにはBeautifulSoup4を使っています。

kiito.hatenablog.com

ところが、不動産の情報は、pdfのレポートでやりとりされるものが多く、htmlをパージングするだけではタイトルが取れないものもいくらかあります。 例えば、こちらの資料などです。

そこで、pdfのメタ情報を取得することにしました。

PythonによるWebスクレイピング

PythonによるWebスクレイピング

このところよく読んでる『Pythonによるwebスクレイピング』にはpdfminerというライブラリが紹介されており、日本語の文字コードに対応するのが大変そうでした。(その対応方法は以下のスライドが詳しいです。)

そこで作業を後回しにしていたのですが、以前Pythonスクレイピングしたことのある方から、「PDFのOCR系いろいろ調査したことあるけど(pdfminerも)、Apache Tikaが1番精度良かった。楽なのもApache Tikaだった。」という情報を貰いました。

Apache Tikaの初のメジャーリリースとなる「Apache Tika 1.0」が公開された。Apache TikaはJavaで開発されたドキュメント分析およびメタデータ抽出ツールキット。さまざまなドキュメント形式に対応しており、対象データからメタデータの抽出を実施する。Tikaは以前はApache Luceneのサブプロジェクトだったが、現在ではApacheソフトウェアファウンデーション直下のプロジェクトとして扱われている。

PDFやOffice文書からメタデータを抽出する「Apache Tika 1.0」登場 | マイナビニュース

Apache Tikaが対応しているドキュメントはHTML、XHTML、OOXML、ODF、Microsoft Office (OLE 2、OOXML)、OpenDocument (ODF)、PDF、ePUB、RTF、MP3、JPEGFlash Video、Jar、mboxなど。」と書いてあるため、もしかすると簡単なスクレイピングならこれ一本で終わるかもしれません。

PythonからApache Tikaを扱うためのライブラリもありました。

github.com

試してみました。

from tika import parser
parsed = parser.from_file('http://www.nri.com/~/media/PDF/jp/opinion/r_report/syakaifukushi/20160420-8_report.pdf')
print(parsed['metadata']['title'])
# 高齢者の所有する不動産の流動化に関する調査研究_報告書

たったこれだけのコードで、ほしかったタイトルが取得できました。ただし、メタデータ上にtitleが無いモノもあるので、スクレイピングに使うには若干工夫する必要そうです。

しかし、ローカルのOSXのマシンでは問題なく動くのですが、私の使っているレンタルサーバー上で同じコードを動かすと、以下の様なエラーが出てしまいました。

ConnectionError: HTTPConnectionPool(host='localhost', port=9998): Max retries exceeded with url: /rmeta/text (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x7fb8f9d196d8>: Failed to establish a new connection: [Errno 111] Connection refused',))

というわけで、今はポートの設定等を確認中です。