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

前回は beutifulsoupを使って、HTML内を解析し、必要な情報(会社名)を抽出する処理について記述した。

今回はその抽出した内容を各会社毎にDataFrameに追加する処理について記述する。

全体のコード

まずは今回改修した全体のコードを示す。

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
# BeautifulSoupをインポート
import requests
from bs4 import BeautifulSoup
#
#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)
   # ページのHTML(ソース)を取得
   html = requests.get(url)
   # BeautifulSoupで解析
   soup = BeautifulSoup(html.content, "html.parser")
   # h1タグの文字列を解析データから見つけてcompany_nameに代入
   company_name = soup.find(class_="ttl-corpname spno").text
   # テーブルデータを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)
   new_df["企業名"] = company_name
   display(new_df)
   # concatでDataFrameにデータを追加する。concatを使うと列名は追加されず、データ部分だけ追加してくれる。
   # df_concatにnew_dfを追加する
   df_concat = pd.concat([df_concat,new_df], axis=0)
   print(url+"の処理が終わりました。")
   driver.back() # webブラウザの「戻る」と同じ処理
   time.sleep(3) # 3秒待て
#
driver.get(url_st)
print(df_concat)
df_concat.to_excel('/Users/username/Desktop/IT blog/company_info_list.xlsx', sheet_name='sheet_name_1')
print("処理が終わりました")

処理結果

保存したエクセルデータを確認すると、企業名が追加されている。

変更点

BeautifulSoupとrequestsをimport

changed code1

 

DataFrameに列を追加

changed code2

(1)request.get(url)

解析したいURLからHTMLデータを取得

(2)df[“列の名前”] = データ

DataFrameに新しい列を追加して、データを保存することができる。

まとめ

DataFrameに新しい列を追加する作業は結構頻繁に発生するので、使いこなせることは必須と思われる。

 



コメントを残す

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