python3を使ってランサーズの案件を解いてみる その3

find result beautifulsoup

前回から引き続き、コードを書いていく時に学習したことの備忘録を今日も残そう。

そもそものランサーズでの仕事依頼の内容はこちら

DataFrameにデータを追加したい時

append

または

concat

を使用する。

間違い例

DataFrameを下記のようにリストの処理と同じようにしようとしてはいけない。

ここで変数data_listはリスト形式なので、headers部分も一緒にリストへ保存される。headers部分を後から消す手間が増える。

下記コードの説明
# 1行目と2行目以降でデータ追加の条件を分ける。
# 1行目はheadersを含める。2行目以降はheaders情報は重複を避けるため、追加しない。

と動作させるつもりだった。

data_list=[]
for i in range(10):
   if i! = 0:
      value = new_df.iloc[0]
      data_list.append(value)
   else:
      data_list.append(new_df)

上記のコードは不要というか、間違い!

DataFrameの追加では appendよりconcat

pandasの関数には列を追加するのに便利なものが用意されている。

appendすると列名は勝手に省いてくれる。

データ部分だけ追加してくれる。

さらに言うと、

jupyternotebookでコードを実行していると、appendよりもconcatを推奨された。

理由はもうすぐ使えなくなるみたい。

今後はconcat一択で良いと思う。

まとめ

DataFrameでデータを追加したい場面は頻出するので、concatは必須。

次回は企業名をDataFrameに追加する方法を投稿します。

 

 



 

今日までに書き加えたコードをUPします。

from selenium import webdriver
from time import sleep
import pandas as pd
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from IPython.display import display
#
#GoogleChromeを起動
driver = webdriver.Chrome()
driver.implicitly_wait(3) # 3秒待て
# サイトへアクセス
url_st = "https://www.digima-japan.com/company/"
driver.get(url_st)
time.sleep(3) # 3秒待て
wait = WebDriverWait(driver, 20) # 最大20秒
elems = wait.until( EC.visibility_of_all_elements_located( (By.LINK_TEXT,"詳しく見る")) ) # "詳しく見る"テキストを含むリンクを見つけるまで、待て。
# そして、見つけたら、リンクを取り出して、リストにしろ。
# リスト名はelems
urls = [] # 空のリストを用意
for elem in elems:
urls.append(elem.get_attribute("href")) # WebDriverElementから"href"だけ抽出してリスト化
# https://teratail.com/questions/33026
df_concat = pd.DataFrame() # 空のデータフレームを用意
for i in range(len(urls)): # urlsリストから一つずつurlを取り出してページを開く
   url = urls[i]
   driver.get(url)
   time.sleep(3)
   # テーブルデータをDataFrameにて取得する
   cul_url = driver.current_url
   data = pd.read_html(cul_url, header = 0)
   # dataから引数3の要素を取り出す
   df = data[3]
   items = df.iloc[:, [0]]
   data = df.iloc[:, [1]]
   # 行列の入れ替え行を列に、列を行に変換
   _df = df.transpose()
   _df.reset_index(inplace=True)
   # 不要な列を削除
   _df.drop([0,2,3,4,5], axis=1, inplace=True)
   # 行(引数)をheaders(列の名前)にする
   headers = _df.iloc[0]
   new_df = pd.DataFrame(_df.values[1:], columns=headers)
   # concatでDataFrameにデータを追加する。
   df_concat = pd.concat([df_concat,new_df], axis=0)
   print(url+"の処理が終わりました。")
   driver.back() # webブラウザの「戻る」と同じ処理
   time.sleep(3) # 3秒待て
#
driver.get(url_st)
# excelファイル形式で保存
df_concat.to_excel('/Users/username/Desktop/IT blog/company_info_list.xlsx', sheet_name='sheet_name_1')

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です