juniordev 2023. 12. 9. 04:05

컴퓨터 하드웨어 정보를 잘 받아오기 위해 여러 사이트를 탐색해 봤지만 가격대와 인기순으로 잘 정리되어 있는 사이트는 다나와였다.

다나와페이지를 크롤링하기 위해 다나와 페이지의 구조를 탐색해 봤다.

구조가 위와 같이 되어있는 걸 확인했기에 필요한 정보에 대한 위치를 확인해봐야 했다.

 

첫 번째로 이미지의 정보가 필요했기에 이미지파일의 위치를 찾아야 했다.

이 위치에 이미지파일이 존재하는 걸 알았기에 구조에 맞춰서 이미지값을 가져오는 코드를 작성했다.

img_link = li.select_one('div.thumb_image > a > img').get('data-original')
if img_link == None:
    img_link = li.select_one('div.thumb_image > a > img').get('src')
img_link = img_link.replace("shrink=130:130", "shrink=330:*")

위와 같이 작성해서 img의 값을 받아오고 또한 replace를 이용해 이미지 사이즈를 키웠다. 

 

두 번째로 브랜드와 이름을 가져와야 했기에 또다시 페이지 구성을 확인해 본 후

위 위치에 이름이 존재하는 걸 알았기에 코드를

Brand_tmp = li.select_one('p.prod_name > a').text.strip().split(" ")
Brand = Brand_tmp[0]
name = li.select_one('p.prod_name > a').text.strip()

위와 같이 작성해서 브랜드명과 이름을 가져오게 만들었다.

 

세 번째로 제품의 스펙을 가져와야 하기 때문에 구조 내의 class이름이 spec_list인 부분이 스펙을 나열해 놓은 곳임을 발견했고

spec_list = li.select_one('div.spec_list').text.strip().split(' / ')

위와 같이 작성하여 각 스펙값들을 List로 받아왔다.

 

마지막 네 번째로 각 제품별 가격을 가져와야 하는데 여기서 문제가 발생했다. 

위 사진처럼 제품가격리스트가 있는데 제품 하나만의 가격이 있는 게 아니라 정품, 멀티팩, 벌크, 해외구매 등으로 나뉘어서 각 가격이 달랐기 때문에 rank_one의 가격만 가져오게 코드를 수정해야 했다.

try:
    price = li.select_one('li.rank_one > p.price_sect > a > strong').text.strip().replace(',', "")
except:
    price = li.select_one('p.price_sect > a > strong').text.strip().replace(',', "")

위와 같이 수정해서 rank_one이 없을 때는 그냥 제품의 가격을 가져오게 작성했다.

 

위 코드들은 CPU를 작성한것이지만 SSD나 케이스같은 경우에는 다른값이 추가된다.

예를들어 SSD의 경우 용량을 체크해야하기때문에 코드의 추가가 필요했다.

 

for size, price_sect in zip(sizes, prices):
            size_text = size.get_text(strip=True).replace(',', " ")
            if 'TB' in size_text:
                size_tmp = 'TB'
                size_text = size_text.split('TB')
            elif 'GB' in size_text:
                size_tmp = 'GB'
                size_text = size_text.split('GB')
            else:
                size_tmp = ''

            if size_text and len(size_text) >= 2:
                if "원/" in size_text[0]:
                    size_text = size_text[1]
                    size_text = re.sub(r'^\d+위', '', size_text)
                    size_TorG = [size_text, size_tmp]
                else:
                    size_text = size_text[0]
                    size_text = re.sub(r'^\d+위', '', size_text)
                    size_TorG = [size_text, size_tmp]
            else:
                size_text = ''

위처럼 추가해서 용량값이 TB인지 GB인지 판단하고 그 값을 뽑아오게 추가했다.

 

이처럼 각 하드웨어 부품들의 값들을 .json형태로 뽑아왔다.

 

GitHub - pojun406/Danawa_Scrapper

Contribute to pojun406/Danawa_Scrapper development by creating an account on GitHub.

github.com

깃허브에 코드를 푸시해 놨다. 한번 들러보면 좋을 것 같다.