주간책톡(부산 도서관) 크롤링 -3 책 정보를 dataframe화 (pandas)

2023. 4. 25. 21:19프로젝트/주간책톡

temp_book_titles = driver.find_elements(By.CSS_SELECTOR, "h3:not([class]) > a")
book_titles_list = []

for title in temp_book_titles:
    book_titles_list.append(title.text)
print(book_titles_list)


book_link_list = []
for summary in temp_book_titles:
    book_link_list.append(summary.get_attribute('href'))
print(book_link_list)

제목, 링크 별로 분리 되었다.

selenium.webdriver.remote.webelement.WebElement 타입들을 str 타입으로 정리해준다.

(원래 발생했던 오류가 웹요소 객체 타입이라서 str 정리가 안되는 요소가 있었다. 오류가 발생한 뒤 스키마 구성을 바꾼것)

 

temp_book_infos = driver.find_elements(By.CSS_SELECTOR, "td:not([class]) > font")
book_infos_list = []
for book_info in temp_book_infos:
    book_infos_list.append(book_info.text)

book_author_list = book_infos_list[0::4]
book_publisher_list = book_infos_list[1::4]
book_publication_date_list = book_infos_list[2::4]
book_nutshell_list = book_infos_list[3::4]

저자, 출판사, 출간일, 한줄요약 도 마찬가지로 리스트형태로 정리한다.

 

하나의 리스트로 관리하기 위해서

book_data = []
for i in range(6):
    temp = []
    temp.append(book_titles_list[i])
    temp.append(book_author_list[i])
    temp.append(book_publisher_list[i])
    temp.append(book_publication_date_list[i])
    temp.append(book_link_list[i])
    temp.append(book_nutshell_list[i])
    book_data.append(temp)
    
import pandas as pd

columns = ['title','author','publisher','publication_date','link','book_nutshell']

books_df = pd.DataFrame(book_data, columns=columns)

book_data = [[title1,author1,...], [title2, author2,...],...]

리스트 안의 리스트로 이런식으로 구성해준다.

 

물론

booK_data = {
    "title": book_titles_list,
    "author": book_author_list,
    "publisher": book_publisher_list,
    "publication_date": book_publication_date_list,
    "link" : book_link_list,
    "book_nutshell" : book_nutshell_list
}

book_df = pd.DataFrame(booK_data)

이렇게 바로 DF 형태로 만들어도 된다.

 

정보가 깔끔히 Dataframe 형태로 정리되었다.

 

books_df.describe()

발행일 유니크값이 4인것을 보아 저쪽에 중복값이 있나 확인해보면 년,월 까지만 따져서 중복일이 많이 겹칠수도 있다는 생각이 든다.

(describe() 로 한번 데이터 개략을 보는것이 좋은 습관이라고 생각한다.)

 

 

 

728x90