【Python】スクレイピングしたあとのデータ保存
2023.07.05
うまくいかないグチです(;´Д`)
年のせいか物覚えと理解力の低下が著しいです・・

スクレイピングといえば、Rubyか、Pythonが流行りと聞いて
どうせならとPythonでSeleniumとBeautiful Soupを試してます。
私の得意言語、Delphiで出来ればいいのだけどいいライブラリが無いのでね仕方ないね(;´Д`)

試してみて思ったこと・・・
Pythonでも1つで完璧にこなすのは無理なのね(;´Д`)


Seleniumはブラウザのバージョンと合致したドライバーを持っていないと使えない弱点があり、
動作も遅い。
しかし最近はJava Scriptを通さないと重要な部分は見せないページが増えてきたので、
Seleniumの機能が無いと始まらない(;´Д`)


Beautiful Soupは軽快且つ単独でHTMLを読みにいき
解析を行ったあとに対して検索を行うので
ドライバーがいらない快適性があるも、
Xpathに対応してないので、
裏技的にlxmlで変換してからなんて面倒なことをする・・
素人にはこれがストレス極まりない(;´Д`)

そして、SeleniumとBeautiful Soupどちらをうまく使っても
XPATHで拾えないデータが結構出てくる。
もちろんCSSセレクタ使ってもダメ・・・
これがまたストレス(;´Д`)
データを捨てるわけにもいかないので、
階層を一つ上げて全部を吸い上げ、コードでゴリゴリ分解とか
ホームページの仕様変更に耐性が弱すぎるので
信用に値しないものを作る意味は?と考え込む・・
そして拾ったデータを整理し2次元配列に仕舞い込んで
最後、CSV出力しようと思ったときにもうまくいかないで躓く・・・
慣れない言語をあつかうときの窮屈感たるや吐き気を催すレベル(;´Д`)
とりあえず、一般的なCSV吐き出しで使われる

csv.writer(出力ファイル)

と私は相性が悪いらしい・・・・
delimiterとquotecharを設定してもうまく機能しない・・・
空白が文字コード化されて保存されたり面倒くさい事件が多く起きる。
しかもカンマで区切ってほしいのにスペースでも区切ってしまう現象もおきて
文字列がコマ切れ状態に(;´Д`)

これについては解決策を見つけることができて、
煩わしいことをきれいに全部解決してくれたpandasに拍手。

import pandas as pd

columns = ["date", "serial", "name", "tanka", "kosu", "kingaku"]
df = pd.DataFrame(配列 , columns=columns)
df.to_csv('d:\output.csv' , index=False, encoding="shift_jis")


これだけで配列があっさりCSVファイルを出力できるのでコードもすっきり。
項目名がいらないのならさらに1行消せる。大満足(;´Д`)

しかしXPathもCSSセレクタでも拾えないデータはどうしようか・・・
ある意味これが対策されているってことなんだと思うけど、
正規表現でなら正確に抜け出せるのだろうか・・

1つ1つ解決していくのにえらい時間かかる。
まだまだ迷走中(;´Д`)
【Python】 ドハマリselenium サンプルコードが動かない
2023.06.12
PythonとSelenium、Beautiful Soupの組み合わせでスクレイピングの勉強をしていますが、
ネットで転がっているサンプルコードでエラーがでる。
というかほとんどすべてがダメ(;´Д`)
どうやら最近登場したseleniumのバージョン4が問題らしい。
そりゃぁ、インストールするときはその時の最新バージョン入れちゃうよね。
まさか従来のソースが使えなくなるなんて考えてもみなかったよ(;´Д`)


driver.findElementByClassName("******");
driver.findElementByCssSelector(".******");
driver.findElementById("******");
driver.findElementByLinkText("******");
driver.findElementByName("******");
driver.findElementByPartialLinkText("******");
driver.findElementByTagName("******");
driver.findElementByXPath("******");

ここら辺の類が全部ダメ。もちろん複数形もダメ。
なんか表記方法の仕様変更らしい。勘弁してくれ(;´Д`)

driver.findElement(By.className("******"));
driver.findElement(By.cssSelector(".******"));
driver.findElement(By.id("******"));
driver.findElement(By.linkText("******"));
driver.findElement(By.name("******"));
driver.findElement(By.partialLinkText("******"));
driver.findElement(By.tagName("******"));
driver.findElement(By.xpath("******"));

こんな感じにそれぞれが変更になった。
私はカッコが複数絡み合うのは見にくいのだが・・・
あと操作系は
クリック   element.click()
テキスト入力 element.send_keys("********")
キー入力   element.clear()
値のクリア  element.submit()
テキスト取得 element.text

のように各エレメントに対して.で接続する。

うーーん、これから読み進める書籍がとてもめんどくさいことに(;´Д`)

- CafeNote -