Category:

DjangoおよびDRFのチュートリアル

久しぶりに仕事で、pythonを触ることになったのですが、DjangoとDRF(Django Rest Framework)が使われていました。 ソースコードを一見して正直どこで何が行われているのか全くわからなかったので、チュートリアルを見ながら簡単なAPIを作成し、その後、DRFを使ってAPIを作り直してみて、勉強しようと思います。 Python: 3.10.2 Django: 4.0.3 DRF: 3.13.1 作成したソースコードは以下で公開しています。 https://github.com/rinoguchi/django_rest_framework Djangoで投票アプリ構築 まずは、DRFは利用せず素のDjangoのみで、チュートリアルに従って投票(polls)アプリを作ってみたいと思います。 環境構築 poetryを使って環境構築しました。 pythonの仮想環境を作って Continue Reading

Posted On :

pyppeteerでファイルをダウンロード

昨日、puppeteerでファイルをダウンロードする という記事を書いたのですが、puppeteerのpythonに移植した pyppeteer で同じようにファイルダウンロードをやってみました。 pyppeteer自体の使い方は以前記事を書いてるので、そちらをご覧ください。 pyppeteerの使い方 実装 puppeteerで試した中で一番筋が良さそうだった「ダウンロードのrequestをキャプチャして、同じ内容で別途requestを送信する」という方法を実装してみました。 from typing import Union, List, Dict import asyncio from uuid import uuid4 from mimetypes import guess_extension from pyppeteer.launcher import launch from py Continue Reading

Posted On :
Category:

標準モジュールunittestでpythonのテストを書く

Pythonで本格的?にテストを書き始めました。標準ライブラリの unittest が普通にまあまあ使いやすいので、使い方をまとめていきます。 基本的な書き方 基本は以下の構造になります。 import unittest class TestSimple(unittest.TestCase): @classmethod def setUpClass(cls): """各クラスが実行される直前に一度だけ呼び出される""" print('setUpClass called.') @classmethod def tearDownClass(cls): """各クラスが実行された直後に一度だけ呼び出される""" print('tearDownCla Continue Reading

Posted On :
Category:

Pythonでasyncioを使った非同期処理

Pythonで非同期処理を実装する場合、 asyncio モジュールを使うのが一般的だと思いますが、並行処理をさせたり、ネストしたりするケースは多少気をつけることもあったので、メモ的にやり方を残しておきます。 シーケンシャルな非同期処理 まずはシンプルなケースとして、3サイト(qiita, google, yahoo)の合計6ページについて、pyppeteer(chromiumを起動して非同期スクレイピングするライブラリ)を使って、HTMLを取得するケースを書いてみました。 from pyppeteer.browser import Browser from pyppeteer.page import Page from pyppeteer.launcher import launch from typing import List import datetime from asyncio Continue Reading

Posted On :
Category:

Poetry+direnvで環境管理しているPythonアプリをVS Code上でDebug実行する

ここ最近Pythonのローカル開発環境においては、Poetryで仮想環境+パッケージ管理を行い、direnvで環境変数管理を行うスタンスなのですが、VS Code上でDebug実行しようと思ったら少し設定が必要だったのでメモ的に残しておきます。 Poetry Poetryは仮想環境構築とパッケージ管理をまとめて実行できる便利なツールです。つまり、venvとpipの代替ツールとなります。詳細は以前記事を書いたのでそちらを参照ください。 poetryでパッケージ・仮想環境を管理 direnv 12 factor を意識して、設定は環境変数に格納するというのが一般的になってきていると思いますが、ターミナルであるディレクトリにcdしたさいに、現在のディレクトリもしくは親ディレクトリを探索して、.envrcが存在していた場合そこに記載されている内容を環境変数にロードしてくれる便利なツールです。別のデ Continue Reading

Posted On :
Category:

pythonのGeneratorとAsyncGeneratorの使い方

pythonの generator について、yieldはもともとたまに使ってたのですが sendやreturnもできること 非同期処理でも使えること を知ったので、軽く記事を書いておこうと思います。 ジェネレータ(Generator) ジェネレータ関数は、値を返す代わりにジェネレータ(一連の値を返す特殊なイテレータ)を返す関数で、yieldキーワードを含む関数はジェネレータ関数です。 ジェネレータ関数の中でyieldが呼び出されると、一旦ジェネレータ関数は一時停止して呼び出しの処理が実行されます。次にジェネレータの__next__()が呼び出される(for文やnext(gen)など)と、ジェネレータ関数の処理が再開されます。 Listを返して処理できるケースであれば、ジェネレータ関数にする必要はないと思いますが、 値をyield(生成)した時の状態で何か処理をしたい場合(Listにすると Continue Reading

Posted On :

pythonでスクレイピングする際に利用するライブラリ比較

Pythonでスクレイピングを実装する機会があったので、その中で利用した(もしくは技術検証した)ライブラリについて、特徴やどういう時に利用するかについて個人的な見解を書いていこうと思います。 requests 指定したURLに対してリクエストを投げて、レスポンスを取得することができるシンプルなライブラリです。 JavaScript実行を必要としないような静的なサイトからResponseを取得する目的であればこれで十分です。 特徴 HTTPレスポンス(ヘッダー、ステータスコード、HTML)を取得できる リクエストヘッダーやクッキーを指定してリクエストすることができる リダイレクト(301や302など)もしてくれる urllib3.util.retry.Retryと一緒に使えばリトライもできる response.textで本文を取得する際、charsetをよしなに解釈してdecodeして文字列 Continue Reading

Posted On :
Category:

Scrapyの使い方

Scrapy は、Webサイトをクロールし、ページから構造化データを抽出するために使用されるWebスクレイピングフレームワークです。Scrapyに関してはわかりやすい記事がたくさんあるので、ここでは実装サンプルを紹介しまくるスタンスにしようと思います。 インストール pip install scrapy # or poetry add scrapy チュートリアルを試す こちらにしたがって、チュートリアルを試してみます。 scrapy startproject tutorial or poetry run scrapy startproject tutorial を実行するとtutorialフォルダができてその下にテンプレートのソースコード一式が出力されます。 tutorial/spidersフォルダの下に以下の内容でquotes_spider.pyを作ります。 import scrapy Continue Reading

Posted On :

pyppeteerの使い方

pyppeteerは、npmモジュールであるpuppeteerをpythonに移植したものです。 例えば、以下のようなことができます。 ヘッドレスブラウザ(chromium)を開く 実際にブラウザ内でページを読み込む CSSセレクタでHTMLエレメントを取得する HTMLエレメントをクリックし、画面遷移する JavaScriptも実行されるので動的に描画された後のHTMLを取得する Cookieも共有されるので、Cookieやセッションが必要なサイトのスクレイピングもできる インストール pip install pyppeteer # or poetry add pyppeteer シンプルな使い方 こちらのサイトにログインするサンプルを書いてみました。 import asyncio from pyppeteer.launcher import launch from pyppeteer. Continue Reading

Posted On :
Category:

Pythonにおけるマルチプロセスでの状態管理

Pythonでマルチプロセス処理を書いていて、サブプロセス内で同期的に変数を更新する(=状態を持つ)必要が出てきましたので試してみました。 公式ドキュメントを見てみると、マルチプロセスで状態を管理する方法は大きく二つあるようです。 共有メモリ(Shared Memory) 特徴 メインプロセス内の共有メモリで変数を保持する 変数の型(入れ物)としては、Value, Arrayのみが提供されている Valueは一つのデータの入れ物、Arrayは複数のデータの入れ物 中に突っ込める型は、arrayモジュールで利用できる型・cypesの型のみ => 型の制約があり concurrent.futures.ProcessPoolExecutorでは利用できない 実装サンプル arrayモジュールで使える型(今回はint)を利用する実装サンプルはこんな感じです。 並列処理で、それぞれ数値を二乗し Continue Reading

Posted On :