find100

日常の中で見つけた面白そうなことを発信します

MENU

独学プログラマーでグーグルニュースをスクレイピングしてみた

この記事は前回の続きなので前をまだみていない方はぜひこちらから見て下さい。

find314.hatenablog.com

独学プログラマーも第16章まで来ました。


先に断っておきますが文末がです・ます調だったり、口語的だったりして統一されていないのでそこはご了承下さい。
今までの記事も同様ですが。

第16章 Bash

プログラミング初心者の僕にはBashなんて初めて聞きますから最初見たときはバスケットシューズの略かと思ったぐらいなんのことかさっぱりでした。

bashっていうのはコマンドラインインターフェースでキーボードで命令を入力してプログラムを実行するプログラムのことです。

この章では基本的なコマンドの使い方やパスの概念が書いてあります。

絶対パスは元のrootから辿って現在のディレクトリの場所を示すのに対し、相対パスは現在のディレクトリから目的のディレクトリまでの道筋を示します。

図にするとこんな感じです。

f:id:find314:20190323100458j:plain
ツリー構造

では203ページのチャレンジ問題を見ていこうと思います。

問1はSelf-taughtをechoするだけですね。

問2の絶対パスの方は適当にディレクトリをいくつか作った後にそのディレクトリに移動してcd ~で完了です。
別のやり方としては、適当に作ったディレクトリに移動した後echo ~でホームディレクトリへのパスを確認してbashに手入力する方法です。

問2の相対パスの方は現在の作業ディレクトリからcd ..で戻るやり方で良いかと。


問3は少し手こずりました。
そもそも.profileファイルってどうやって編集するんだよ!
いろいろ調べてみたら.profileファイルが呼び出される優先順位は低いことが分かったので.bash_profileファイルを編集することにしました。

どうやらopenコマンドを使うと編集できるそうなのでそのコマンドを使って問3も完了しました。
「open .bash_profile」で編集できると思います。
気をつける事としてはホームディレクトリでopenコマンドを使う点です。
解答とは違うやり方ですけど・・・。

第17章 正規表現

この章では正規表現、つまり「連続した文字列の検索パターン定義」について学べます。

正規表現はファイルから複雑な文字列または数値に一致する部分を探して抜き出します。

本書に習って色々とやってみたのですがこれは便利ですね!

ではチャレンジ問題の自分のコードを載せておきます。

問1
$ grep -o Dutch zen.txt

問2
$ echo Arizona 479, 501, 870. California 209, 213, 650. | grep :digit:

問2を実際に解いてやっと気付いたのですが、数字の部分が赤く表示されるんですね。
テキストでは白黒なのでただechoしてるだけじゃね?って思ってしまいました。

実際に動かすことはやはり大切ですね。

#charange17
#Q3
import re

strings = "The ghost that says boo haunts the loo."
search = re.findall(".oo", strings, re.IGNORECASE)
print(search)

正規表現は特定の塩基配列を探すのに使えそうです。
便利です。

そしてp213に紹介されているMad Libsゲームが面白いです。
普通に色々と遊べそうです。これは凄いな・・・。

ただイマイチどうしてこのコードでそういった結果が出力されるのか理解出来ていないんですよね。
elseってどんな時なんですかね・・・?

第18章 パッケージ管理

この章はページ数が少ないからすぐ終わるかと思いきやそんなことありませんでした。(自分の知識不足のせい)


218ページから219ページにまたがって書いてあるコードの解説が載っているサイトを見つけたので貼っておきます。
Flask を始めよう — Flask Handson 1 documentation

僕はこの2ページにまたがっているコードを最初コマンドラインに書いてしまいましたが、後で間違っていたことに気づきました。
ATOMやIDLEなどのテキストエディタに書くべきでした。

以下はATOMで実行した時の出力結果です。
* Serving Flask app "Package18" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off

警告文を読んでみると「本番環境で開発サーバーを使うな。代わりに本番WSGIサーバーを使え。」と書いてあります。

本番環境?開発サーバー?WSGI

何のことかさっぱり分からなかったので軽く調べてみましたが、この警告文が出ていても特に問題はなさそうだと判断したのでここはスルーします。


次にFlaskをインストール出来たので逆にアンインストールしようと思って

"pip uninstall Flask"

を実行したのですが、赤字で長いエラーを吐かれてしまいました。
初心者の僕はついにやっちまったかという気持ちになりましたが、何やかんや耐えてました。

エラーの一部はこんな感じでした。
PermissionError: [Errno 13] Permission denied:

許可が下りなかったみたいです。
このエラーを解決するのに何時間もかかってしまいました。
仮想環境を構築せずにパッケージ をインストールしたのがまずかったのか?
パッケージがsite-packagesディレクトリにインストールされていないのか?
こんなことを考えましたが、二つとも違ったみたいです。

結局テラテイルという質問サービスを使って解決しました。

回答して下さった方、ありがとうございます!
解決策としては

"sudo pip uninstall Flask"

を実行することでした。
正直201ページにsudoはOSに損害を与えない確信があるときだけ使用して下さいって書いてあるから使うのビビっちゃうじゃないですか。

まぁ解決したので良かったです。

また、sudoを使うときに以下の文が出てきて何スカってなったので軽く調べてみました。

If executing pip with sudo, you may want sudo's -H flag.

sudoのHフラッグはパスワードとして指定されたターゲットユーザーのhomedirにHOME環境変数をセットするらしいです。
正直言って説明を見ても今の僕では理解できませんでした。


221ページのチャレンジ問題に関してはインストールするだけなので割愛します。

第19章 バージョン管理

この章では主にGitの使い方について学べます。

取り敢えずGitHubのアカウントを作成してGitをインストールしようと思い、コマンドラインに「git --version」を実行しました。

すると、xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

というエラーが出てしまいました。
何じゃこれと思って調べてみるとMojaveにアップグレートしたためにgitのコマンドが使えなくなっているようでした。

こちらの記事を参考にして解決しました。

High Sierraへアップデート後のgitエラー - Qiita


GitHubやGitってよく見るけど何のことかイマイチよく分かっておらず、使い方もさっぱりだったので基礎をさらえたので良かったです。

コードをバリバリ書くなら避けては通れないツールっぽいですね。

それにしても分かりやすいサイトのURLが載っているのは結構うれしいです。

先人達に感謝です。

236ページのチャレンジ問題をやって無事に中央リポジトリに行くつかファイルをプッシュ出来ました。

f:id:find314:20190328123559j:plain

第20章 知識を1つにまとめる

f:id:find314:20190330111535j:plain

この章ではグーグルニュースをスクレイピングする方法について学びます。

Pythonで出来ることの一つとしてスクレイピングというのを聞いたことがあったのですが、一体どういうものなのかは分かっていなかったので本書で取り組めて良かったです。

本書によるとまず、BeautifulSoupというパッケージをインストールするらしいのですが、ここで僕は仮装環境を構築したくなりました。

仮装環境を構築すれば仮装環境ごとにパッケージをインストールすることができ、プロジェクトを分離できるらしいので。

まぁ今回の場合だったら別にそんなことをする必要もないとは思います。

220ページに載っているリンクはこれだと思いますが

docs.python-guide.org

上のリンクの日本語版があったのでそっちも載せておきます。

pipenv-ja.readthedocs.io

仮装環境を構築しようとしてpipenvをhomebrewを使ってインストールしようとしたのですが、エラーを吐かれてしまいました。

吐かれたエラーは下記の通りです。
Error: An unexpected error occurred during the `brew link` step
The formula built, but is not symlinked into /usr/local
Permission denied @ dir_s_mkdir - /usr/local/lib

`brew link`の段階でエラーが発生したのはよく分かんないです。
許可が下りなかったのはsudoを付けて実行すれば解決するかな。

少し疲れてきたので今回はスルーします。

それで結局本書に書いてある通りに進めてグーグルニュースをスクレイピングするかと思って本書のコードをコピーして実行したのですが、うんともすんとも言いません。あれ???

240ページの注釈に書いてあるのですが、どうやらグーグルニュースページの仕様が変更されたために本書のコードでは記事のヘッドラインを集められないそうです。

shop.nikkeibp.co.jp

そこで上のリンクから色々と補足情報などがあるのでその通りにやると日経トレンディの記事がスクレイピング出来る感じです。
まぁ結果的にはグーグルニュースではありませんが・・・。

グーグルニュースでやりたい人はこちらを参照したら上手くいくかもしれません。
teratail.com

チャレンジ問題の解答を見てみるとwith文が使われていてそう言えばそういうのも学んだなぁと。
127ページに書いてありましたが、すでに忘れてしまってました。


ざっくりまとめると元のサイトをScraperクラスに引数として渡してURLが書かれている部分を探し出す作業がスクレイピングって感じですね。

仮装環境の環境構築はまた必要に迫られた時にやろうと思います。