ホーム > プログラミング

プログラミングのアーカイブ

Scrapyでクロール中の現在のURLを取得する方法

PythonのWebスクレイピングフレームワーク「Scrapy」で、クロール中の現在のURLを取得する方法についての解説です。

Scrapyで特定のurlをクロール中、クロール中のページのurlを取得したい場合があり、方法について調べてみました。

以下の記述で取得ができました。

response.request.url

Spiderのstart_urlの記述で複数のページを設定した際、現在クロール中のページによって処理を分岐させたかったため役立ちました。

pythonの勉強メモ

最近人気のプログラミング言語の「python」について、勉強をしたことをメモしていっています。

プログラミング言語がphpをこれまでメインに使っていたので、pythonの基本的なことが理解できていないため、個人的なメモとして書いておきます。

変数と型

pythonは変数を宣言時に、明示的に型を宣言する必要がありません。
これはphpと同じですが、変数も変数であるということを表す、phpでいうと $ のような修飾子を変数の前につける必要がありません。

変数は予約語でない場合は変数であると自動的に判断して処理されます。

配列

pythonで配列を定義する場合は、[]を利用します。

array = []
array = [1,3,4,7]

このようにシンプルに定義できます。
phpとの違いとしては、 array()のような定義をする必要がなく、[]だけなのでシンプルです。

配列を参照する場合は

array[1] #上記の配列の場合3になる

のように参照します。これは他の言語の仕様と変わりません。

配列への要素の追加は

array.append(追加する値)

のように行います。

配列の長さは

count = len(array)

で取得できます。

タプル

タプルは配列と似ていますが異なる点は、一旦タプルに値が入ると後で変更ができないのが異なる点です。

tpl = (1,3,4,7)

のように使用します。
配列の[]が()になっています。

辞書(連想配列)

phpでいうところの連想配列は、pythonでは辞書と呼ばれます。

次の様に定義します。

array = {‘apple’:’りんご’, ‘orange’:’みかん’, ‘lemon’:’レモン’}

dict()を使用することで、配列やタプルの集合を辞書に変更することが可能です。

(例)
array = [[apple,りんご][orange,みかん][lemon,レモン]]
array = dict(array)

上記の例の結果、arrayは最初に示した例と同じ辞書になります。

画面出力

print文で画面出力を行えます。

print(出力したい値)

出力したい値は変数でも配列でも問題ありません。

コメント

pythonでのコメントは、
# コメント
を行頭に入れることでコメントをつけることができるのは他の多くの言語と同じです。

複数行コメントを入れるには

“””
コメント
コメント
コメント
“””

”’
コメント
コメント
”’

のように、シングルクオテーションか、ダブルクオテーション3つで行を囲むことで複数行コメントが可能です。

画面出力

画面出力は、print文で行なえます。

print(出力する内容)

文字列の置換

文字列の置換は、以下の記述で行なえます

文字列 = 文字列.replace(“置換元”, “置換先”)

数値のインクリメント

pythonでは、数値のインクリメントは使用できないので

変数+=1
変数-=1

のように記述します。

変数++
変数–

これは使えません。

yield文

yield文は、関数定義内で使用し、指定された値を返します。

そういう意味ではphpの関数内のreturn文と似ていますが、微妙に違いがあるようです。

python版のreturn文に近い存在ですが、関数内に複数のyield文がある場合全てのyieldの値を返します。

また、for文内にyieldが使用されている場合、for文のループが終了するまで値を返し続けます。

for文

for 変数 in 配列
〜〜〜〜〜

配列をfor文でループする場合、上記のように記述します。

ループ文の中で変数を使用したりできます。

または、

for num in range(数値)
 〜〜〜〜〜

とすることで、数値の回数繰り返しを行います。
numは 0 〜 数値-1 の間で処理されます

mysqlの利用

pythonではmysqlのデータベースと接続するためには様々なクライアントがあります。

その中でもポピュラーなものの一つにmysqlclientがあります。

pip install mysqlclient

でインストールすることができます。

IPython

Pythonは、コマンドラインで「python」とタイプすることで、quit()で終了するまでの間、対話型のインタプリタ形式で実行できます。

これをさらに強化したのがIPythonで、IPythonは、Pythonの対話型実行形式でしか使用できないものの、その部分を大幅に強化したものです。

pythonとは別にipythonとしてインストールすることができ、コマンドラインで

ipython

とタイプすることで使用することができます。

通常のpythonの場合

>>

といった形式でコマンドラインに表示されますが、ipythonの場合

In[1]:
In[2]:
In[3]:

といった形式でコマンドライン上に表示されることも特徴があります。

phpmyadminでCSVインポートが途中できれるのに対処

とある案件で、CSVの大きなデータがあり、それをphpmyadmin経由でデータベースにインポートする必要がありました。

そこで、ローカルにテスト環境を構築し、phpmyadmiを入れて早速データインポートのテスト。

しかし、途中まで取り込みは成功するのに、何故か途中で画面が真っ白になってしまい、2万件ほどあるデータのうち7000件ほど出きれてしまう状態。

ネットでいろいろと対応策を探してみた。

まずはphpの設定を見なおしてみて、upload_max_filesizeや、post_max_size、memory_limitとか、、。

しかし、どれを設定してみてもうまくいかない。

しかし、最終的にはふとしたことがきっかけで対応することができた。

それは、はじめはCSVがShift-Jisの文字コードだったので、インポートもShift-Jisでインポートしていたのだけれど、テスト中間違えてURTF-8にして取り込むと、文字化けはしたものの、問題なく2万件全て登録できた。

ん・・・UTF-8だったらいけるのか?

ということで、CSVファイルをUTF-8で保存し直し、UTF-8でインポートし直してみると、、、うまくいきました。

ということで今回はこの方法で解決。
原因の詳しいところはわからずじまいだったが、文字コードに関する微妙な問題だったんだと思われる。

ちなみに、使っているPCはMACで、CSVを編集したり、UTF-8に変換するのは、CSVエディター2というソフトを購入して使っている。

1800円するので導入するのには少しためらいはあったが、最低限必要な機能はひと通り揃っているので問題なく今のところ使えている。

ホーム > プログラミング

フィード

ページの上部に戻る