sraメタデータとシーケンスデータの自動ダウンロード

SRAメタデータとシーケンスデータの自動ダウンロード

Windows Power Shell

pip install selenium
pip install chromedriver-binary

環境変数等でパスを通す必要はなく、プログラム中で import chromedriver_binary のようにインポートすればパスが通る。

まず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)を実行すると、バグが起こりにくくなる。(なくても上手く行くことはあるが、あると確実)

学生実験で使用したHyper-Vで起動したLinux仮想環境(Ubuntu20.10)でDockerコンテナ仮想環境上でSeleniumサーバーを起動し、メタデータを取得することができるかを確認した。

参考にしたサイト

第662回 Docker+Selenium ServerでWebブラウザ自動操作環境を作る

sources.listの更新 を元にsources.listを編集し、aptコマンドを使用可能にする。

以下のコマンドをターミナル上で実行

$ 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

ターミナル上で以下のコマンドでインストール

$ 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はリモートデスクトップクライアントソフトウェアであり、VNCに対応している。VNCによるリモートデスクトップ接続によりDockerコンテナ内で動作するWebブラウザがスクレイピングによって自動で動く動作を確認できるため、デバッグがしやすくなる。

①まずGUI上でUbuntu Softwareを起動する。

②Ubuntu Software上で⁠remminaを検索し、「⁠ソース」が「latest/stable」のRemminaを選択し、インストール。画像では既にインストールされているので、「削除」になっている。

③設定から「Permission」を開き,全ての権限を有効にしておく。

④これだけではmDNS(Avahi)での名前解決ができないため,nscdパッケージをインストールしてsnapdを再起動

$ sudo apt install nscd
$ sudo systemctl restart snapd.service

参考にしたサイト

第661回 リモートデスクトップビューアー,Remminaを使用する

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接続時のパスワード。

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を起動する。

②Remminaでリモートデスクトップ接続

プロトコルは「VNC」、接続先ホストは「localhost:15900」を入力し、Enter。

③VNCパスワードを入力。

上記Dockerfileと同様に作成した場合は、パスワードは「password」。

④「OK」をクリックし、接続完了。

$ sudo apt install python3-pip
$ pip3 install selenium

以下のスクリプトを実行。(ローカル環境とドライバーの指定の仕方などが異なるので注意)

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番号取得のブラウザ操作が実行される。

上記スクリプトを実行すると、コンテナ環境の/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

Singularityのインストールからイメージの作成を元に、seleniumサーバー環境のsingularityイメージファイルを作成した。

以下のコマンドを実行。

singularity run --bind /dev/shm:/dev/shm --bind /etc/localtime:/etc/localtime:ro --bind /home/training/test/download:/home/seluser/Downloads --net --network-args "portmap=4444:4444/tcp" --network-args "portmap=15900:5900/tcp" --env SCREEN_WIDTH=1600 --env SCREEN_HEIGHT=900 /home/training/test/singularity_image/selenium_server.sif
FATAL:   container creation failed: network requires root or --fakeroot, users need to specify --network=none with --net

ポートフォワードにはadmin権限が必要らしい。(Singularityでやる必要ない?)

管理者権限で実行

sudo singularity run --bind /dev/shm:/dev/shm --bind /etc/localtime:/etc/localtime:ro --bind /home/training/test/download:/home/seluser/Downloads --net --network-args "portmap=4444:4444/tcp" --network-args "portmap=15900:5900/tcp
" --env SCREEN_WIDTH=1600 --env SCREEN_HEIGHT=900 /home/training/test/singularity_image/selenium_server.sif

以下のエラーが発生

Traceback (most recent call last):
  File "/usr/bin/supervisord", line 11, in <module>
    load_entry_point('supervisor==4.1.0', 'console_scripts', 'supervisord')()
  File "/usr/lib/python3/dist-packages/supervisor/supervisord.py", line 358, in main
    go(options)
  File "/usr/lib/python3/dist-packages/supervisor/supervisord.py", line 368, in go
    d.main()
  File "/usr/lib/python3/dist-packages/supervisor/supervisord.py", line 70, in main
    self.options.make_logger()
  File "/usr/lib/python3/dist-packages/supervisor/options.py", line 1466, in make_logger
    loggers.handle_file(
  File "/usr/lib/python3/dist-packages/supervisor/loggers.py", line 417, in handle_file
    handler = RotatingFileHandler(filename, 'a', maxbytes, backups)
  File "/usr/lib/python3/dist-packages/supervisor/loggers.py", line 213, in __init__
    FileHandler.__init__(self, filename, mode)
  File "/usr/lib/python3/dist-packages/supervisor/loggers.py", line 160, in __init__
    self.stream = open(filename, mode)
OSError: [Errno 30] Read-only file system: '/var/log/supervisor/supervisord.log'

結局管理者権限でやらないといけないなら、Dockerでよさげ???

→Dockerで構築

以下のDockerfileからSeleniumインストール済Python環境のDockerイメージを作成する。(多分不要なツールも含まれてそう・・)

FROM python:3
USER root

RUN apt-get update
RUN apt-get -y install locales && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm

RUN apt-get install -y vim less
RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
RUN pip3 install selenium

RUN python -m pip install jupyterlab

DockerイメージをBuild

docker build -t selenium_client:latest selenium_client/

SingularityイメージのBuild

sudo singularity build selenium_client/selenium_client.sif docker-daemon://selenium_client:latest

Seleniumサーバを起動(Docker)

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

メタデータダウンロード実行(Singularityではカレントディレクトリが自動的にマウントされるので、バインドマウントのオプションがなくてもカレントディレクトリ下のスクリプトを実行可能である。)

singularity  exec singularity_image/selenium_client.sif  python download_metadata.py
  • sraメタデータとシーケンスデータの自動ダウンロード.1648526675.txt.gz
  • 最終更新: 2022/03/29 04:04
  • by 133.11.144.12