기록방

파이썬 웹 크롤링 교재 #3 본문

웹 크롤링

파이썬 웹 크롤링 교재 #3

Soom_1n 2022. 9. 29. 15:58

"한입에 웹 크롤링 프알못의 파이썬 데이터 수집 자동화 한 방에 끝내기"

 

한입에 웹 크롤링 - 교보문고

프알못의 파이썬 데이터 수집 자동화 한 방에 끝내기 | 인터넷에서 데이터를 수집하여 받아오는 것을 크롤링 또는 스크래핑이라고 하고, 크롤링을 하는 프로그램을 크롤러라고 합니다. 웹 크롤

www.kyobobook.co.kr

 

7장 쇼핑몰 크롤링


  1. 대상 사이트 https://jolse.com/ 라는 화장품 쇼핑몰
  2. [SKINCARE → Moisturizers → Toners & Mists] : https://jolse.com/category/toners-mists/1019/
  3. 아래쪽에 페이지 넘길 수 있음 (1~10)

해당 쇼핑몰사이트가 크롤링 접근을 막아놨음. 무신사로 대체 : 무신사 데닝 펜츠 https://www.musinsa.com/categories/item/003002

import requests
from bs4 import BeautifulSoup

url = "<https://www.musinsa.com/categories/item/003002>"
result = requests.get(url)
bs_obj = BeautifulSoup(result.content, "html.parser")

li_box = bs_obj.find("div", {"class","list-box box"})
article_info = li_box.findAll("div", {"class","article_info"})

def get_goods_info(ai):
    a_tag = ai.find("p", {"class","list_info"}).find("a")
    title = a_tag['title']
    link = a_tag['href'][2:]
    p_tag = ai.find("p", {"class","price"}).text.replace(" ", "").split("\\n")[2]
    return {"title":title, "link":link, "price" : p_tag}

for ai in article_info:
    print(get_goods_info(ai))

# 결과 #

# {'title': '와이드 데님 팬츠 (LIGHT BLUE)', 'link': 'www.musinsa.com/app/goods/858911', 'price': '39,000원'}
# {'title': '와이드 데님 팬츠 (DEEP GREY)', 'link': 'www.musinsa.com/app/goods/890338', 'price': '39,000원'}

# 생략

# {'title': '[CONA 9307] 가을용 커버밴드 이염없는 생지 와이드...', 'link': 'www.musinsa.com/app/goods/2063135', 'price': '44,850원'}
# {'title': 'Bluish Light / New Stan', 'link': 'www.musinsa.com/app/goods/1764739', 'price': '73,600원'}
# {'title': '모어 와이드 데님 팬츠 (BLEACH)', 'link': 'www.musinsa.com/app/goods/1778523', 'price': '39,000원'}
# {'title': '스티즈 051B 블랙 로우', 'link': 'www.musinsa.com/app/goods/2675764', 'price': '119,200원'}
# {'title': '[테이퍼드핏]CHARMING BLUE CHIP', 'link': 'www.musinsa.com/app/goods/1246217', 'price': '45,000원'}
# {'title': '테이퍼드 크롭 데님 팬츠 [워시드 블랙]', 'link': 'www.musinsa.com/app/goods/2007389', 'price': '42,290원'}

페이지 넘기며 가져오기

  • 무신사 데닝 펜츠 1~100페이지 크롤링
  • requst.get으로 반복하다 사이트에서 가끔 차단하기 시작함
    • 접속 실패는 403 Forbidden 메세지 반환 : 서버에서 거부 → 간단히 문자 수 500미만인 경우 출력해 보는식으로 디버깅함
    • urllib.request에서 ‘User-Agent’ 헤더를 추가해 이상한 접속이 아님을 밝히면 해결 됨 ( 오류 정리 포스팅 )
    • 각자의 User-Agent를 넣어줘야 함 : 확인 사이트
  • 딕셔너리를 텍스트 파일로 저장
import urllib.request
from bs4 import BeautifulSoup
# import time

file = open("musinsa 데닝펜츠 100페이지.txt", "w")

header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'}
url = "<https://www.musinsa.com/categories/item/003002?d_cat_cd=003002&brand=&list_kind=small&sort=pop_category&sub_sort=&page=1&display_cnt=90&group_sale=&exclusive_yn=&sale_goods=×ale_yn=&ex_soldout=&kids=&color=&price1=&price2=&shoeSizeOption=&tags=&campaign_id=&includeKeywords=&measure=>"
for i in range(2,102):
    # time.sleep(2)
    req = urllib.request.Request(url =url, headers=header)
    url_open = urllib.request.urlopen(req)
    bs_obj = BeautifulSoup(url_open, "html.parser")

    # if len(str(bs_obj)) < 500:
    #     print(bs_obj)
    #     print("================================================\\n 접속 실패 \\n================================================\\n")
    #     continue

    li_box = bs_obj.find("div", {"class", "list-box box"})
    article_info = li_box.findAll("div", {"class", "article_info"})

    def get_goods_info(ai):
        a_tag = ai.find("p", {"class", "list_info"}).find("a")
        title = a_tag['title']
        link = a_tag['href'][2:]
        p_tag = ai.find("p", {"class", "price"}).text.replace(" ", "").split("\\n")[2]
        return {"title": title, "link": link, "price": p_tag}

    slid = "\\n================================================\\n " + (str(i-1)) + " 페이지 끝\\n================================================\\n"
    for ai in article_info:
        text = str(get_goods_info(ai))
        # print(text)
        file.write(text + " ")
    print(slid)
    file.write(slid)

    start_idx = 119
    end_idx = start_idx + len(str(i-1))
    url = url[:start_idx] + str(i) + url[end_idx:]
    # print("\\n"+url+"\\n")

file.close()

print("잘 완료 됨")

# 결과 #

# ================================================
#  1 페이지 끝
# ================================================
#
#
# ================================================
#  2 페이지 끝
# ================================================
#
# 생략
#
# ================================================
#  99 페이지 끝
# ================================================
#
#
# ================================================
#  100 페이지 끝
# ================================================
#
# 잘 완료 됨

musinsa 데닝펜츠 100페이지.txt
0.98MB

 

원본 노션 정리 글

 

파이썬 웹 크롤링 교재 #3

7장 쇼핑몰 크롤링

probable-legume-162.notion.site

 


프로젝트를 진행하기 위한 웹 크롤링 공부였는데, 필요한 지식은 다 배웠고 연습도 충분하니 교재는 여기까지 진행한다.

728x90