前提
Google Scholarで検索キーワードを設定して、その結果の基本情報を取得したいと考えています。サイトにあったコードを参考に自分で少し手直ししたのですが、うまくいきません。
実現したいこと
pdfのリンク先も一緒に入手したいのですが、今のものだと、すべて一番上にあるものが表示されてしまいます。また、csvに書き出した場合文字化けが起こってしまうのでそれを解消したいです。encodingを設定したのですが、ない場合と'utf-8'では文字化けあり、'shift_jis'と'cp932'は2つ目のキーワードに設定しているものがエラーが出て表示されませんでした。
発生している問題・エラーメッセージ
pdfのリンクがすべて同じになってしまう。encodingのエラーは下記の通りです。
UnicodeEncodeError: 'cp932' codec can't encode character '\xe9' in position 180: illegal multibyte sequence UnicodeEncodeError: 'shift_jis' codec can't encode character '\xe9' in position 180: illegal multibyte sequence
該当のソースコード
python
1import pandas as pd 2import time 3import datetime 4import random 5import csv 6 7# 検索したいキーワード 8query_list = ["construction", "3d printer"] 9 10# 検索結果を格納するためのデータフレームの作成、検索クエリ・タイトル・リンク・取得日からなる 11search_result_df = pd.DataFrame( columns=["keyword", "title", "link", "author&year", "pdf","timestamp"]) 12 13 14# 検索したいキーワードの数だけ処理を繰り返す 15for each_query in query_list: 16 from selenium import webdriver # Google検索をブラウザを通じて自動的に行う際に使う 17 from selenium.webdriver.common.keys import Keys # ブラウザ操作のための諸々設定 18 from selenium.common.exceptions import NoSuchElementException,TimeoutException # ブラウザ操作のための諸々設定 19 from selenium.webdriver.common.desired_capabilities import DesiredCapabilities # ブラウザ操作のための諸々設定 20 from selenium.webdriver.chrome.options import Options # ブラウザ操作のための諸々設定 21 from selenium.webdriver.common.by import By #AttributeError: 'WebDriver' object has no attribute 'find_element_by_name'の回避 22 # https://qiita.com/jinyahiga/items/46f9a925f4a21bbef794 回避方法 23 24 # ブラウザ操作のための諸々設定 25https://boardtechlog.com/2020/08/programming/seleniumchrome%E3%81%A7%E3%82%88%E3%81%8F%E4%BD%BF%E3%81%86chromeoptions%E3%81%BE%E3%81%A8%E3%82%81/ 26 options = webdriver.ChromeOptions() 27 options.add_argument('--headless') 28 options.add_argument('--no-sandbox') 29 options.add_argument('--disable-dev-shm-usage') 30 31 driver = webdriver.Chrome(executable_path="./chromedriver.exe",options=options) # GoogleChromeのブラウザを開く 32 driver.implicitly_wait(10) # 画面が表示されるまで10秒待つように命令 33 34 # Googleの検索画面を表示(仮想のブラウザ) 35 driver.get('https://scholar.google.com/') 36 37 # 検索語を入力して送信する。 38 input_element = driver.find_element_by_name('q') 39 input_element.send_keys(each_query) 40 # エンターキーを押す 41 input_element.send_keys(Keys.RETURN) 42 43 # 検索結果を表示する。10件まで取得 44 for i in driver.find_elements_by_class_name('gs_ri'): 45 # 取得日時を残す用のデータ 46 time_stamp = str(datetime.datetime.now()) 47 each_h3 = i.find_element_by_tag_name('h3').text 48 each_href = i.find_element_by_tag_name('a').get_attribute('href') 49 each_author = i.find_element_by_class_name('gs_a').text #著者名と年代のところ 50 51 for j in driver.find_elements_by_class_name('gs_or_ggsm'): 52 each_pdf_href = j.find_element_by_tag_name('a').get_attribute('href') # pdfの部分を表示させたい 53 54 # 取得結果の格納用のデータフレーム作成 55 df = pd.DataFrame([[each_query, 56 str(each_h3), 57 str(each_href), 58 str(each_author), 59 str(each_pdf_href), 60 time_stamp]], 61 columns=search_result_df.columns) 62 print(each_h3) 63 print(each_author) 64 print(each_href) 65 print(each_pdf_href) 66 search_result_df = search_result_df.append(df).reset_index(drop=True) 67 68 69 # 仮想のブラウザを閉じる 70 driver.quit() 71 72 print(each_query) 73 74 75 # ランダムに40~60秒間処理を止める 76 t = random.randint(40, 60) 77 time.sleep(t) #sleep(秒指定) 78 79 # 保存 80 search_result_df.to_pickle("search_result_df_gs.pickle") 81 search_result_df.to_csv("search_result_df_gs_2.csv", encoding = 'shift_jis')
試したこと
初めはpdfのclassやtagの入れ方を変えたりしてみたのですが、classが違うaタブなので
for i in driver.find_elements_by_class_name('gs_ri'):で設定している('gs_ri')を変えて別に設定しました。
for文のインデントを変えると、上のものがすべて同じになり、pdfはバラバラのものになりました。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2022/09/21 04:26
2022/09/21 04:41
退会済みユーザー
2022/09/22 04:33
2022/09/22 05:21
退会済みユーザー
2022/10/14 02:18