とあるエンジニアの作業ブログ

Python

【初心者向け】Pythonで初めてのスクレイピング

投稿日:2019年1月25日 更新日:

Python学習中のためスクレイピングをやってみる。
すでに山ほど参考サイトがあるが、以下がソースも短くライトそうなので拝借し、本家はBeautifulSoupを使っているところをpyqueryに改造してみる。
参考PythonのrequestsとBeautifulSoupでGoogle検索結果から、タイトルとURLと説明文だけを抜き取る

動作環境

動作環境はpyenv+venvで構築しています。構築手順はこちら

  • Mac OS High Sierra
  • Python 3.6.8
  • pip 18.1

利用モジュール

  • requests ··· httpリクエストのためのモジュール
  • pyquery ··· htmlパースのためのモジュール
  • csv ··· csv書き出しのためのモジュール(csvモジュールはpython標準で利用できるモジュールのためpip install不要。)

インストールは以下。

 

ソースコード

利用メソッド、構文理解

fromでクラスを直接インポート

fromで読み込まない場合以下のようになり面倒。

joinメソッド

Response.raise_for_statusメソッド

Responseオブジェクトのhttpステータスコードが200番台以外の場合はエラーとする。

PyQuery(“hoge”)

pyqueryで要素を検索する。
要素タグ、id、class、css selecter、要素内に含まれる文字列 など色々検索可能。

with構文

Pythonのwithを使用すると、処理の開始時と終了時に必須の処理を絶対に実行してくれる。
例えば、ファイルのオープンとクローズ、通信の開始と終了、データベースへのセッション開始とクローズ など。
withを使用した場合はファイルのclose処理を省略できる。

open(‘output.csv’,’w’,newline=”,encoding=’utf8′)

パッと見でわからないのは以下2つ。

  • ‘w’ ··· writableファイルのオープンを指定
  • newline=” ··· 改行の指定をしない。すなわち改行判断をcsvモジュールに委ねる。
    newline=” が指定されない場合、クォートされたフィールド内の改行は適切に解釈されず、書き込み時に \r\n を行末に用いる処理系では余分な \r が追加されてしまいます。csv モジュールは独自 (universal newlines) の改行処理を行うため、newline=” を指定することは常に安全なはずです。

    Python 3.6.5 ドキュメント

PyQuery.eq(i)メソッド

PyQueryインスタンス中のn番目の要素を取得。

PyQuery.attr(“hoge”)メソッド

PyQueryインスタンス中のhoge属性を取得。

ソースには現れないが調べたこと

PyQueryのメソッドで返されるオブジェクトがどんな形をしているのか、どう操作するのか軽く調べた。
以下調査した時のコード。

実行結果(少し見やすく整形)

PyQueryのインスタンス(query)は当然ながらPyQueryオブジェクトで中身はrequestsで取得したhtmlコードとなっている。
query("h2")で要素抽出しても、PyQueryオブジェクトなのは変わらずqueryがh2要素だけフィルターされたような感じ。
query("h2").text()で複数のh2要素の値が空白区切りで一つのstrとなる。
つまり、イテラブルオブジェクトの形を保っているのはquery("h2")までである。(query("h2").text()でforを回すと1文字毎のイテラブルオブジェクトと判定されてしまう。)
最後に、query(“h2”)の各要素の値を表示するfor文を回す際には、h2txtはHtmlElementオブジェクトとなっている。そのためHtmlElementを操作するか、pyqueryで操作したいのであれば一度pq(h2txt)として、pyqueryオブジェクトに変換してやる必要がある。

-Python
-,

執筆者:


comment

メールアドレスが公開されることはありません。

関連記事

MacのPython環境最適解!? 〜pyenv+venv+pipenvでPython環境構築〜

Macにpyenv+venvでPython環境構築をした時のメモ。 Anacondaを使うか迷ったが、色々調べたところAnacondaは環境を破壊するとか、Homebrewとコンフリクトするとか色々問 …

Python3.7.1で文章間の類似度判定

python3.7.1でMeCabとWord2Vecを使い文章間の類似度判定を行います。 結構類似の記事があったんですが、pythonのバージョン互換の問題かなんかでそのままだと動かなかったので自分な …