実現したいこと
pythonのseleniumで、chromeを使って、フリマサイトの出品を検索したい。
地区は東京の上位5件がヒットするようにしています。
制約条件
①ジモティーはjavascriptで動的に変わる
②chromeのウェブドライバーが自動でダウンロードされるが、最新のものに対応していない。
(手動でやるのは面倒なので一度ここはスキップ)
③webdriver.version '4.31.0'
④windos10 home celeron
発生している問題・分からないこと
発生している問題
①最初の関門、保護されていない通信とあり、urlにdata:;と記載されている。ここで念のため進んでいない。
②第2の関門、発生するであろう問題で、その他optionsに追加したほうがいい設定がわからない。
該当のソースコード
from webdriver_manager.chrome import ChromeDriverManager from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException from selenium.webdriver.chrome.options import Options options = Options() #Optionsで詳細オプションを追加するためのインスタンス options.add_argument('--ignore-certificate-errors') # SSLエラー無視 #options.add_argument('--allow-insecure-localhost') # ローカルへの接続許可 options.add_argument(r"--user-data-dir=C:\Users\<ユーザー名>\AppData\Local\Google\Chrome\User Data")#ここが重要? options.add_argument(r"--profile-directory=Default") # 通常のプロファイル名(たとえば "Profile 1" など) options.add_argument('--disable-web-security') #ここが重要? #options.add_argument('--disable-gpu') options.add_argument('--no-sandbox') #options.add_argument('--disable-dev-shm-usage') #options.add_experimental_option('excludeSwitches', ['enable-logging']) options.set_capability("acceptInsecureCerts", True) keyword = "冷蔵庫"#調べたいもの url = f"https://jmty.jp/tokyo/sale?keyword={keyword}" # Chromeを自動でセットアップして起動 d = webdriver.Chrome(service=Service(ChromeDriverManager().install()),options=options) try: wait = WebDriverWait(d,20) #20秒間に設定して、ロード中でも20秒で待機終了 items = wait.until(lambda d: d.find_elements(By.CSS_SELECTOR, ".p-item-title") if len(d.find_elements(By.CSS_SELECTOR, ".p-item-title")) >= 5 else False) #ここわかりにくいけど一行 #p-item-titleはジモティーの各商品のタイトルで5件以上ならすべて表示としています。 for item in items: print(item.text) link = item.get_attribute("href") print(f"リンク: {link}") except TimeoutException: print("商品が5件以上見つかりませんでした。") d.quit()
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
webdriverでの自動インストールは、.wdm\drivers\chromedriver\win64\135.0.7049.95のバージョン、実際のクロームは135.0.7049.96
①最初の関門で--user-data-dir= をオプションに追加すれば、data:;と表示されて、
空のhtml形式で開く状態を防げるかもしれないですが、あっていますか?
②第2の関門
chatgptとquitaで調べると、corsを無効にする方法が記載されていたため、
https://qiita.com/t_katsumura/items/3f2a401ff6e2076acb26
options.add_argument('--disable-web-security') のことだろうと推察しています。
またウェブ関連をあまり学んでいませんが、調べた結果、
- ①例えばローカルのウェブアプリ http://localhost:8080からhttps://jmty.jpリクエストすると、
chromeのブラウザが、Origin: http://localhost:8080とヘッダーに情報を付けてくれる
- ②ジモティーのサーバー側のレスポンスで、許可された場合にヘッダーに追加
Access-Control-Allow-Origin:http://localhost:8080
許可されていない場合
Access-Control-Allow-Origin:https://jmty.jp or []
- ③Chrome(ブラウザ)でのチェック
Origin(リクエスト側) === Access-Control-Allow-Origin(レスポンス側) とcorsのエラーチェック
結果許可されない場合、レスポンスヘッダーのオリジンが違うからブラウザ側で表示されない可能性があるということですよね?
これらを解決するために、--user-data-dir、--disable-web-securityをオプションに追加して、
実行すればできると思うのですが、これってセキュリティ的に大丈夫ですか?
またsandboxもオプションに追加したほうがいいですか?
またoriginを置き換えるのはセキュリティ的に不可とでて、やるならプロキシサーバー経由でなければできないと出てきまし。
AIでは非常に危険と書いていたために、できるならローカルでの開発で、自作ウェブアプリにスクレイピングする用だと書いていますが、このままでできそうですか?セキュリティ的に気を付けることを教えていただければ幸いです。
補足
特になし
