質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

1回答

2283閲覧

Python Selenium 複数ページにまたがる資産情報を一つのCSVへ出力したい

ohtaisan

総合スコア1

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2021/08/25 06:18

前提・実現したいこと

PythonへSeleniumを導入?し資産ツールサイトへ自動ログインした後、
複数ページにまたがった資産情報(テーブル形式)をひとつのCSVファイルへ出力しようと思っています。
(資産ツールに標準の出力機能が無いため)

ひとつのページのみではうまくCSVファイルが出力できますが、
ページを遷移して同じような処理を行おうとすると上書きされてうまくいきません。

リンクが全て紫になるくらい調べましたが分からないのでどうか、教えてください。

発生している問題・エラーメッセージ

今のところエラーは発生しておりません。
強いて言うならUSBデバイスが認識されませんというようなエラーがでますが
処理は問題なく進んでおり、調べたところ無視してもいいエラーのようでした。

該当のソースコード

python

1from time import sleep 2from bs4 import BeautifulSoup 3from selenium import webdriver 4from selenium.webdriver.chrome.options import Options 5from selenium.webdriver.common.keys import Keys 6import os 7import csv 8import datetime 9 10~~~~~~~~~~~~~~~~~~~~~~~~~~ 11サイトへのアクセス、自動ログインの省略 12~~~~~~~~~~~~~~~~~~~~~~~~~~ 13 14#デバイスのURLを開き画面表示を待つ 15driver.get(device_url_1) 16sleep(1) 17 18 19#名前でソート 20driver.find_element_by_xpath('//*[@id="devices_table"]/thead/tr/th[2]').click() 21sleep(1) 22 23# 資産一覧テーブル取得 24html = driver.page_source 25soup = BeautifulSoup(html, "html.parser") 26table = soup.find(id="devices_table") 27tr_list = table.find_all("tr") 28 29# CSV出力用データ1 30data = [] 31 32for i, tr in enumerate(tr_list): 33 row_data = [] 34 35 if i == 0: 36 # ヘッダー行の処理 37 row_data.extend(["名前", "グループ", "OSタイプ", "プラットフォームタイプ", "OSバージョン", "シリアル番号", "IPアドレス", "最終チェックイン"]) 38 data.append(row_data) 39 continue 40 41 # td要素取得 42 td_list = tr.find_all("td") 43 44 # 名前 45 row_data.append(td_list[1].text.strip()) 46 # グループ 47 row_data.append(td_list[9].text.strip()) 48 # OSタイプ 49 row_data.append(td_list[3].text.strip()) 50 # プラットフォームタイプ 51 row_data.append(td_list[4].text.strip()) 52 # OSバージョン 53 row_data.append(td_list[5].text.strip()) 54 # シリアル番号 55 row_data.append(td_list[6].text.strip()) 56 # IPアドレス 57 row_data.append(td_list[7].text.strip()) 58 # 最終チェックイン 59 row_data.append(td_list[10].text.strip()) 60 61#2ページ目 62driver.get(device_url_2) 63sleep(1) 64 65# 資産一覧テーブル取得 66html = driver.page_source 67soup = BeautifulSoup(html, "html.parser") 68table = soup.find(id="devices_table") 69tr_list = table.find_all("tr") 70 71 # td要素取得 72 td_list = tr.find_all("td") 73 74 # 名前 75 row_data.append(td_list[1].text.strip()) 76 # グループ 77 row_data.append(td_list[9].text.strip()) 78 # OSタイプ 79 row_data.append(td_list[3].text.strip()) 80 # プラットフォームタイプ 81 row_data.append(td_list[4].text.strip()) 82 # OSバージョン 83 row_data.append(td_list[5].text.strip()) 84 # シリアル番号 85 row_data.append(td_list[6].text.strip()) 86 # IPアドレス 87 row_data.append(td_list[7].text.strip()) 88 # 最終チェックイン 89 row_data.append(td_list[10].text.strip()) 90 91 92 93 94 #最終的な書き出し 95 data.append(row_data) 96 97 98 99# ダウンロード先&ファイル名 100csv_date = datetime.datetime.today().strftime("%Y%m%d") 101csv_file_name = "ThinClient_Device" + csv_date + ".csv" 102 103if os.path.exists(csv_file_name): 104 # ファイルが存在する時は削除 105 os.remove(csv_file_name) 106 107# CSVファイルに書き出し 108with open(csv_file_name, 'a') as file: 109 w = csv.writer(file, lineterminator='\n') 110 w.writerows(data) 111 file.close() 112

試したこと

調べても同じような記事が無いため、ページ遷移と同じような処理を行おうとしました。
本当に初心者過ぎて分からないことが分からないといった感じです…。すみません…。

ページ遷移の仕方ももう少しありそうです。
https://~~~/devices#page/1
https://~~~/devices#page/2
https://~~~/devices#page/3
・・・というページ構成です。

device_url = "https://~~~/devices#page/1 + 1"
という風に入力すれば出来ると思ったのですができませんでした。
記述の方法がもっとありそうです…。

こんな説明で分かりづらいと思いますがどうか教えてください…。

補足情報(FW/ツールのバージョンなど)

Windows10
Python 3.9
Google Chrome 92.0.4515.159
webdriver Ver.92

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2021/08/25 11:37

質問文章と、コードの関係が分かりません。 > ひとつのページのみではうまくCSVファイルが出力できますが、 これはコードのどの部分のことを言っていますか? > ページを遷移して同じような処理を行おうとすると これはコードのどの部分のことを言っていますか? 前半のforループでは、変数dataに、ヘッダ行しか入れてませんが、row_dataは捨ててしまって良いのでしょうか?
ohtaisan

2021/08/26 06:53

>> ひとつのページのみではうまくCSVファイルが出力できますが、 >これはコードのどの部分のことを言っていますか? 最初から#2ページ目までのコードです。 >> ページを遷移して同じような処理を行おうとすると >これはコードのどの部分のことを言っていますか? #2ページ目からの処理です。 本当に初心者すぎて何もわからずコピペしただけでこの処理がどういう動きをして…というのが分かっておりません。 特にfor文あたりです。
otn

2021/08/26 06:57

> 何もわからずコピペしただけでこの処理がどういう動きをして ではまず、読んで理解しましょう。基礎力が不足しているのならば入門書で学びましょう。
ohtaisan

2021/08/30 00:09

ありがとうございます! プログラミングすらしたことなくて、pythonを本格的に使用することがあるかは分かりませんがちょっとだけ勉強してみます!
guest

回答1

0

ベストアンサー

device_urlの値を順番に処理していきたい、ということでしょうか?

python

1MAX_PAGE = 10 # とりあえず 2for n in range(1, MAX_PAGE): 3 device_url=f'https://~~~/devices#page/{n}' 4 driver.get(device_url)

こういうことでしょうか?

投稿2021/08/26 06:13

TANAKAKazuyoshi

総合スコア96

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ohtaisan

2021/08/26 07:50

うおおおおおおおお!! まさにそのようなことです!!! ただ…知識が無さ過ぎてどこにハメればいいか分かりません…。 とりあえずfor文の勉強をしてみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問