**文書の過去の版を表示しています。**
SRAメタデータとシーケンスデータの自動ダウンロード
ローカル環境でメタデータを取得
Seleniumをインストール
Windows Power Shell
pip install selenium
Chrome Driverをインストール
pip install chromedriver-binary
環境変数等でパスを通す必要はなく、プログラム中で import chromedriver_binary
のようにインポートすればパスが通る。
SRA番号取得
まずWindowsローカル環境で、Seleniumを用いてMiFishプライマーで増幅された領域のシーケンスデータのSRR番号を取得した。
以下のスクリプトを実行することで、SRR番号のリストを取得できる。
import time from selenium import webdriver import chromedriver_binary driver = webdriver.Chrome() # DBCLS SRAにGETメソッドでリクエストを送信 driver.get("https://sra.dbcls.jp/result.html?target_db=sra&term=mifish&rows=100&sort=Updated&order=desc") time.sleep(5) # cssタグを指定して、プロジェクトを取得 pjts_selector = ".tabulator-cell[tabulator-field='_id']" projects = driver.find_elements_by_css_selector(pjts_selector) # NCBI SRAで検索するための文字列を作成 search_str = "" for pjt in projects: search_str = search_str + " or " + pjt.text search_str = search_str.replace(" or ", "", 1) print(search_str) driver = webdriver.Chrome() driver.get("https://www.ncbi.nlm.nih.gov/sra/?term=" + search_str) time.sleep(10) # send toボタンをクリック driver.execute_script('document.getElementById("sendto").click();') time.sleep(5) # Choose Destination → Fileを選択 driver.execute_script('document.getElementById("dest_File").click();') time.sleep(5) # Format → Accession Listを選択 driver.execute_script('document.getElementById("file_format").options[2].setAttribute("selected", "selected")') time.sleep(5) # Create Fileをクリック driver.execute_script('document.querySelector("#submenu_File > button").click();') time.sleep(5) time.sleep(5) driver.quit()
各クリックイベントをトリガーとして実行されるJavascriptの実行とクリックのタイミングに時差があるので、各クリックイベントの後にtime.sleep(5)
を実行すると、バグが起こりにくくなる。(なくても上手く行くことはあるが、あると確実)
Linux仮想環境上のDockerコンテナ環境でSeleniumサーバーを起動し、メタデータを取得
学生実験で使用したHyper-Vで起動したLinux仮想環境(Ubuntu20.10)でDockerコンテナ仮想環境上でSeleniumサーバーを起動し、メタデータを取得することができるかを確認した。
参考にしたサイト
sources.listの編集
sources.listの更新 を元にsources.listを編集し、aptコマンドを使用可能にする。
Dockerのインストール
以下のコマンドをターミナル上で実行
$ sudo apt-get update $ sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg \ lsb-release $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg $ echo \ "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null $ sudo apt-get update $ sudo apt-get install docker-ce docker-ce-cli containerd.io
docker-composeのインストール
ターミナル上で以下のコマンドでインストール
$ COMPOSE_VERSION=$(git ls-remote https://github.com/docker/compose | grep refs/tags | grep -oE "[0-9]+\.[0-9][0-9]+\.[0-9]+$" | sort --version-sort | tail -n 1) $ curl -L https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` | sudo tee /usr/local/bin/docker-compose > /dev/null $ sudo chmod +x /usr/local/bin/docker-compose
Remminaのインストール
Remminaはリモートデスクトップクライアントソフトウェアであり、VNCに対応している。VNCによるリモートデスクトップ接続によりDockerコンテナ内で動作するWebブラウザがスクレイピングによって自動で動く動作を確認できるため、デバッグがしやすくなる。
②Ubuntu Software上でremminaを検索し、「ソース」が「latest/stable」のRemminaを選択し、インストール。画像では既にインストールされているので、「削除」になっている。
③設定から「Permission」を開き,全ての権限を有効にしておく。
④これだけではmDNS(Avahi)での名前解決ができないため,nscdパッケージをインストールしてsnapdを再起動
$ sudo apt install nscd $ sudo systemctl restart snapd.service
参考にしたサイト
Seleniumコンテナ環境を構築するためのイメージファイルをBuildする際に使用するDockerfileの作成
docker-compose.ymlを配置するディレクトリにサブディレクトリ(本記事の例では「custom」)を作成し,以下の内容でDockerfileを作成。
FROM selenium/standalone-chrome-debug:3 USER root RUN apt-get update \ && apt-get install -y -q --no-install-recommends \ fonts-noto-cjk fonts-noto-cjk-extra language-selector-common language-pack-ja \ && update-locale LANG=ja_JP.UTF-8 \ && apt-get clean \ && rm -r /var/lib/apt/lists/* ENV LANG ja_JP.UTF-8 ENV LANGUAGE ja_JP:ja ENV LC_ALL ja_JP.UTF-8 USER 1200 RUN x11vnc -storepasswd password ${HOME}/.vnc/passwd
Seleniumの公式Dockerイメージのままでも自動操作はできるが,デバッグ時に日本語を正しく表示するため,日本語フォントなどを追加したイメージにカスタマイズしてある。
また最後の行の「password」はVNC接続時のパスワード。
イメージのダウンロード、ビルドを実行した後に、Chromeを自動操作できるコンテナ環境をするためのdocker-compose.ymlの作成
docker-compose.yml
version: "3" services: chrome: build: custom restart: unless-stopped ports: - 4444:4444 - 15900:5900 volumes: - /dev/shm:/dev/shm - /etc/localtime:/etc/localtime:ro environment: - SCREEN_WIDTH=1600 - SCREEN_HEIGHT=900
この段階でディレクトリ構成は以下の通りになっている。
. ├── custom │ └── Dockerfile └── docker-compose.yml
最後にこのディレクトリで以下のコマンドを実行し、コンテナを起動。
$ docker-compose up -d
RemminaでSeleniumサーバーにVNCでリモートデスクトップ接続
①Remminaを起動する。
②Remminaでリモートデスクトップ接続
プロトコルは「VNC」、接続先ホストは「localhost:15900」を入力し、Enter。
③VNCパスワードを入力。
上記Dockerfileと同様に作成した場合は、パスワードは「password」。
④「OK」をクリックし、接続完了。
PythonおよびSeleniumのインストール
$ sudo apt install python3-pip $ pip3 install selenium
SRA番号取得スクリプトを実行
以下のスクリプトを実行。(ローカル環境とドライバーの指定の仕方などが異なるので注意)
import time from selenium import webdriver # Chromeのオプション options = webdriver.ChromeOptions() # options.add_argument("--start-maximized") # Selenium Serverに接続 driver = webdriver.Remote(command_executor='http://localhost:4444/wd/hub', options=options) # driver = webdriver.Chrome() # DBCLS SRAにGETメソッドでリクエストを送信 driver.get("https://sra.dbcls.jp/result.html?target_db=sra&term=mifish&rows=100&sort=Updated&order=desc") time.sleep(5) # cssタグを指定して、プロジェクトを取得 pjts_selector = ".tabulator-cell[tabulator-field='_id']" projects = driver.find_elements_by_css_selector(pjts_selector) # NCBI SRAで検索するための文字列を作成 search_str = "" for pjt in projects: search_str = search_str + " or " + pjt.text search_str = search_str.replace(" or ", "", 1) print(search_str) driver = webdriver.Remote(command_executor='http://localhost:4444/wd/hub', options=options) driver.get("https://www.ncbi.nlm.nih.gov/sra/?term=" + search_str) time.sleep(10) # send toボタンをクリック driver.execute_script('document.getElementById("sendto").click();') time.sleep(5) # Choose Destination → Fileを選択 driver.execute_script('document.getElementById("dest_File").click();') time.sleep(5) # Format → Accession Listを選択 driver.execute_script('document.getElementById("file_format").options[2].setAttribute("selected", "selected")') time.sleep(5) # Create Fileをクリック driver.execute_script('document.querySelector("#submenu_File > button").click();') time.sleep(15) driver.quit()
上記のスクリプトを実行することでRemminaで接続したSeleniumサーバー上でChromeが起動し、SRA番号取得のブラウザ操作が実行される。
コンテナ環境のDownloadディレクトリをマウント
上記スクリプトを実行すると、コンテナ環境の/home/seluser/Downloads
上にファイルがダウンロードされるため、実環境上からはダウンロードファイルを確認することができない。コンテナ環境上のダウンロードファイルの存在は以下のコマンドで確認できる。
sudo docker exec custom_chrome_1 find / -name "SraAccList.txt*"
ダウンロードファイルを実環境上にも反映するためには、/home/seluser/Downloadsをバインドマウントする必要がある。以下の手順で行う。
①マウント先のディレクトリを作成し、書き込み権限を付与する。(otherに書き込み権限が必要)
mkdir download (/home/training/test/download) chmod o+w download
②docker-compose.ymlを編集
bindマウントの設定を追加
version: "3" services: chrome: build: custom restart: unless-stopped ports: - 4444:4444 - 15900:5900 volumes: - /dev/shm:/dev/shm - /etc/localtime:/etc/localtime:ro - /home/training/test/download:/home/seluser/Downloads environment: - SCREEN_WIDTH=1600 - SCREEN_HEIGHT=900
③実行中のコンテナを停止し、再度buildからコンテナの起動までを行う。
sudo docker ps -a (実行中のコンテナのIDを確認) sudo docker stop ca0204eaa032(上記で確認したコンテナのIDを確認) sudo docker rm ca0204eaa032 docker-compose up -d
この後再度スクリプトを実行すると、ダウンロードファイルを実環境上でも確認することができる。
参考にしたサイト
docker-machineでselenium実行時にダウンロードしたファイル名がおかしくなる
ちなみにdocker-composeを使用せずにコンテナを起動する場合は以下のコマンドで実行できる。
docker run -d --restart unless-stopped -p 4444:4444 -p 15900:5900 -v /dev/shm:/dev/shm -v /etc/localtime:/etc/localtime:ro -v /home/training/test/download:/home/seluser/Downloads -e SCREEN_WIDTH=1600 -e SCREEN_HEIGHT=900 --name chrome-test custom_chrome:latest