ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 크롤링으로 교보문고, 리디북스 책 목록 가져오기, 데이터프레임만들기, 엑셀로 저장하기!!!
    공부/Python 2021. 7. 27. 00:20
    반응형

    순서

    1. 리디북스 베스트셀러 책 목록 가져오기

    2. 교보문고 베스트셀러 책 목록 가져오기

    3. 교보문고 베스트셀러 책 목록, 저자, 가격 가져오기

    4. 3에서 가져온 리스트들을 데이트 프레임으로 만들기

    5. 만든 데이터 프레임을 엑셀로 저장하기

    1. 먼저 리디북스 부터 해본다.

    해당 부분은 https://hyongdoc.tistory.com/191 블로그를 참고했다.

     

    1. 필요한 패키지 불러오기

    import requests # 웹페이지를 불러오기 위한 패키지
    import lxml.html

    여기서 lxml은 Python에서 XML parser로서 주로 이용되는 패키지는 로서 음... 그냥 html을 활용하기 위해 쓰인다고 하면 될 거 같다.

     

    2. 웹 페이지 불러오기

    url='https://ridibooks.com/bestsellers/general' # url 만들어준다.
    r=request.get(url)# url을 불러온다.
    r.status_code # 200이면 잘 되는 것을 의미한다. 웹페이지가 잘 불러오는지 확인하기 위한것.

    3. 이제 베스트셀러 목록을 list형태로 가져와보자.

    root = lxml.html.fromstring(r.content) # 불러온 웹페이지를 조회하고 html 모듈로 파싱할 것이다.
    # text보다 content가 좋음 왜냐면 html.fromstring은 묵시적으로 byte를 인풋하기 때문이다.
    
    titles=root.cssselect('span.title_text')
    titlelist=[] # 리스트 바구니 만들어주기
    
    for title in titles: # 목록 다 돌기
        titlelist.append(title.text.strip()) # 바구니에 데이터 넣어주기
    
    titlelist

    cssselect는 내가 원하는 부분을 가져오기 위한 방법이다. 

    먼저 리디북스 베스트셀러 페이지에 들어가서 마우스 오른쪽을 눌러 검사를 눌러보면 다음과 같은 화면이 나온다.

    1번을 누르고 내가 원하는 곳을 누르면 html위치가 나타난다. 나는 제목을 원하니 2번 표시에 마우스를 가져다 댄다.

    그러면 다음과 같이 해당 위치가 표시된다.

    여기를 자세히 보면 <span class='title_text~~~~~~~~라고 쓰여 있고, 내가 원하는 부분의 텍스트인 "얼음과 불의 노래 1~5부 + 불과 피 세트"가 있는 것을 알 수 있고 우리는 이 부분만 빼오면 된다.

    (span은 태그고 class는 span의 속성을 의미한다. ) 이때 text라는 속성을 써줘야 텍스트만 산출이 되고 공백을 사라지게 하기 위해 strip()을 사용하고 for문을 통해 리스트 형식으로 새롭게 만들어준다. 

    그러면 이러한 결과가 나온다.

     

    2. 이제 교보문고를 해보자!!

    위와 같은 방식을 사용하지만 html이 다르기 때문에 어떤지 함 보자.

    url='http://www.kyobobook.co.kr/bestSellerNew/bestseller.laf?orderClick=d79'
    r=requests.get(url)
    r.status_code

    교보문고의 html에서 내가 원하는 텍스트 부분의 html은 아래와 같다.

    strong 태그안에 있네? 하고 strong만 쓰면 안 된다. 일단 strong은 a태그 안에 있는 걸 볼 수 있다. 그럼 위와 같은 방법으로 a> strong 이렇게 적용하면 어떻게 될까?

    이런 식으로 원하지 않은 부분인 랭킹과 가격이 같이 출력되는 것을 볼 수 있다. 이유는 a태그 안에 strong태그를 가진 것들이 중복이 되기 때문이다. 그럼 어떻게 하는가 하면 좀 디테일하게 들어가면 된다. strong 부분을 selector 복사를 하면  #main_contents > ul > li:nth-child(6) > div.detail > div.title > a > strong 이 나온다. 여기서 타이틀 부분에 들어있는 제목이니깐 div.title > a > strong 다시 해보면 아래오 같이 잘 나온다.

    3. 책목록, 저자, 가격 가져오기

    음... 뭔가 아쉬운데 하고 나는 책 리스트, 가격, 출판정보가 있는 데이터 프레임을 만들고 싶다.!! 효율적인 방법이 무조건 있지 싶지만 거듭된 에러로 위와 같은 방법을 하나하나 하려고 한다. 

    root = lxml.html.fromstring(r.content) # 불러온 웹페이지를 조회하고 html 모듈로 파싱할 것이다.# text보다 content가 좋음 왜냐면 html.fromstring은 묵시적으로 byte를 인풋하기 때문이다.
    titles=root.cssselect(' div.title >a > strong') 
    prices=root.cssselect('div.price > strong.book_price')
    authors=root.cssselect('div.detail > div.author')
    
    
    titlelists=[]
    pricelists=[]
    authorlists=[]
    
    for i in range(len(titles)):
        titlelists.append(titles[i].text.strip())
        pricelists.append(prices[i].text.strip())
        authorlists=authors[i].text.strip()
    
    
    print(pricelists)# 잘되는지 출력해보기
    print(authorlists)
    print(titlelists
    
    
    import pandas as pd # 데이터 프레임 만들기
    df=pd.DataFrame({"title":titlelists,
                     "price":pricelists,
                    "author":authorlists})
    df # 출력!!!!!!!!!!!

    결과는~~~~~~~~~~~~~~~~~~~~

    4. 이거 뭔가 엑셀로 저장하고 싶은데??

    to_excel('파일명.xlsx')를 이용한다. 현재 파이썬 파일이 있는 곳에 엑셀 파일이 생겨나는 것을 알 수 있다. 

    df.to_excel('booklist.xlsx',index=False)# 인덱스 없음.

     

    반응형

    댓글

Designed by Tistory.