inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

현존 최강 크롤링 기술: Scrapy와 Selenium 정복

scrapy 관련...

230

psj4377

작성한 질문수 1

0

안녕하십니까, 선생님이 주신 코드로 한것과

제 코드로 한것 모두 동일한 문제가 있어서 문의드립니다.

scrapy 최종에서,  1st category crawling과 2st category crawling 모두를 실행을 했을때,

1st 만 출력이 되고, 2st는 출력이 안되는 문제가 있습니다.

연결고리상에 끊어진 점이 있나 찾아보았는데 없더라구요..

또한 1st 내용을 지우고, 2st만 출력을 했을때는 정상적으로 출력이 되었습니다.

즉, def parse_mainpage(self, response): 안의

두 for문 중에서 첫번쨰 for문만 작동하는 듯합니다.

여기에 대해서 피드백 주시면 감사하겠습니다.

--- 출력 결과값(터미널)---

(base) PS C:\Users\amore\ecommerce> scrapy crawl gmarket_category_all -o gmarket.csv -t csv                             c:\anaconda3\lib\site-packages\scrapy\commands\__init__.py:129: ScrapyDeprecationWarning: The -t command line option is deprecated in favor of specifying the output format within the -o option, please check the -o option docs for more details

  feeds = feed_process_params_from_cli(self.settings, opts.output, opts.output_format)

c:\anaconda3\lib\site-packages\scrapy\spiderloader.py:40: UserWarning: There are several spiders with the same name:

 

  GmarketCategoryAllSpider named 'gmarket_category_all' (in ecommerce.spiders.gamrket_category_all)

 

  GmarketCategoryAllSpider named 'gmarket_category_all' (in ecommerce.spiders.gmarket_category_all)

 

  This can cause unexpected behavior.

  category=UserWarning,

parse_mainpages

parse_maincategory 컴퓨터/전자 ALL

parse_maincategory 생활/주방/건강 ALL

parse_maincategory 식품 ALL

parse_maincategory e쿠폰/티켓 ALL

parse_maincategory 여행 ALL

parse_maincategory 스포츠/자동차 ALL

parse_maincategory 가구/침구 ALL

parse_maincategory 유아동/출산 ALL

parse_maincategory 화장품/헤어 ALL

parse_maincategory 도서/음반 ALL

parse_maincategory 신발/잡화 ALL

parse_maincategory 패션의류 ALL

(base) PS C:\Users\amore\ecommerce>         

--- 전문코드--

# -*- coding: utf-8 -*-
import scrapy
from ecommerce.items import EcommerceItem

class GmarketCategoryAllSpider(scrapy.Spider):
    name = 'gmarket_category_all'

    def start_requests(self):
        yield scrapy.Request(url='http://corners.gmarket.co.kr/Bestsellers', callback=self.parse_mainpages)

    def parse_mainpages(self, response):
        print("parse_mainpages")
        category_links = response.css('div.gbest-cate ul.by-group li a::attr(href)').getall()
        category_names = response.css('div.gbest-cate ul.by-group li a::text').getall()

        # 1st category crawling
        for index, category_link in enumerate(category_links):
            yield scrapy.Request(url='http://corners.gmarket.co.kr' + category_link, callback=self.parse_items, meta={'main_category_name':category_names[index], 'sub_category_name': 'ALL' })
        # 2nd category crawling
        for index, category_link in enumerate(category_links):
            yield scrapy.Request(url='http://corners.gmarket.co.kr' + category_link, callback=self.parse_subcategory, meta={'main_category_name':category_names[index] })


    def parse_subcategory(self, response):
        print ("parse_subcategory", response.meta['main_category_name'])
        subcategory_links = response.css('div.navi.group > ul > li > a::attr(href)').getall()
        sub_category_names = response.css('div.navi.group > ul > li > a::text').getall()
        for index, subcategory_link in enumerate(subcategory_links):
            yield scrapy.Request(url='http://corners.gmarket.co.kr' + subcategory_link, callback=self.parse_items, meta={'main_category_name':response.meta['main_category_name'], 'sub_category_name':sub_category_names[index] })


    def parse_items(self, response):
        print ("parse_maincategory", response.meta['main_category_name'], response.meta['sub_category_name'])

        best_items = response.css('div.best-list')
        for index, item in enumerate(best_items[1].css('li')):
            doc = EcommerceItem()
            ranking = index + 1
            title = item.css('a.itemname::text').get()
            ori_price = item.css('div.o-price::text').get()
            dis_price = item.css('div.s-price strong span span::text').get()
            discount_percent = item.css('div.s-price em::text').get()

            if ori_price == None:
                ori_price = dis_price
            ori_price = ori_price.replace(",", "").replace("원", "")
            dis_price = dis_price.replace(",", "").replace("원", "")
            if discount_percent == None:
                discount_percent = '0'
            else:
                discount_percent = discount_percent.replace("%", "")

            doc['main_category_name'] = response.meta['main_category_name']
            doc['sub_category_name'] = response.meta['sub_category_name']
            doc['ranking'] = ranking
            doc['title'] = title
            doc['ori_price'] = ori_price
            doc['dis_price'] = dis_price
            doc['discount_percent'] = discount_percent
            #print (ranking, title, ori_price, dis_price, discount_percent)
            yield doc

강의와 관련있는 질문을 남겨주세요.
• 강의와 관련이 없는 질문은 지식공유자가 답변하지 않을 수 있습니다. (사적 상담, 컨설팅, 과제 풀이 등)
• 질문을 남기기 전, 비슷한 내용을 질문한 수강생이 있는지 먼저 검색을 해주세요. (중복 질문을 자제해주세요.)
• 서비스 운영 관련 질문은 인프런 우측 하단 ‘문의하기’를 이용해주세요. (영상 재생 문제, 사이트 버그, 강의 환불 등)

질문 전달에도 요령이 필요합니다.
• 지식공유자가 질문을 좀 더 쉽게 확인할 수 있게 도와주세요.
• 강의실 페이지(/lecture) 에서 '질문하기'를 이용해주시면 질문과 연관된 수업 영상 제목이 함께 등록됩니다.
• 강의 대시보드에서 질문을 남길 경우, 관련 섹션 및 수업 제목을 기재해주세요. 
• 수업 특정 구간에 대한 질문은 꼭 영상 타임코드를 남겨주세요!

구체적인 질문일수록 명확한 답을 받을 수 있어요.
• 질문 제목은 핵심 키워드를 포함해 간결하게 적어주세요.
• 질문 내용은 자세하게 적어주시되, 지식공유자가 답변할 수 있도록 구체적으로 남겨주세요.
• 정확한 질문 내용과 함께 코드를 적어주시거나, 캡쳐 이미지를 첨부하면 더욱 좋습니다.

기본적인 예의를 지켜주세요.
• 정중한 의견 및 문의 제시, 감사 인사 등의 커뮤니케이션은 더 나은 강의를 위한 기틀이 됩니다. 
• 질문이 있을 때에는 강의를 만든 지식공유자에 대한 기본적인 예의를 꼭 지켜주세요. 
• 반말, 욕설, 과격한 표현 등 지식공유자를 불쾌하게 할 수 있는 내용은 스팸 처리 등 제재를 가할 수 있습니다. 

scrapy selenium 웹-크롤링

답변 1

0

잔재미코딩 DaveLee

안녕하세요.

코드가 많이 복잡해서, 우선 첨부드린 코드에 대해 실제 크롤링된 상품 타이틀과 가격 부분 출력부분만 주석처리하고, 바로 실행해봤는데요. 다음과 같이 전체 ALL, 과 각 카테고리별 ALL, 그리고 각 카테고리의 2차 카테고리까지 크롤링이 되는 것으로 확인이 됩니다. 또 전체 크롤링 결과를 다음과 같은 csv 파일로 출력했을 때, 각 카테고리/서브카테고리별 상품들이 모두 들어 있는 것을 확인하였습니다. 

scrapy crawl gmarket_category_all -o gmarket.csv

지금 보여주신 코드가 제가 첨부한 코드와 달라서, 혹시 첨부한 코드에 일부만 덮어씌워서 테스트가 된 것인지, 아예 첨부한 코드를 새로운 폴더에 넣고 테스트를 해보시면 어떨까요?

또다른 이슈가 있다면, 새로운 질문으로 이야기해주시면 감사하겠습니다. (댓글은 확인이 안되서요)

감사합니다.

parse_mainpages

parse_subcategory 가구/침구

parse_subcategory 컴퓨터/전자

parse_subcategory 생활/주방/건강

parse_maincategory ALL ALL

parse_subcategory 여행

parse_subcategory e쿠폰/티켓

parse_subcategory 도서/음반

parse_subcategory 스포츠/자동차

parse_subcategory 식품

parse_subcategory 유아동/출산

parse_subcategory 패션의류

parse_subcategory 화장품/헤어

parse_subcategory 신발/잡화

parse_maincategory e쿠폰/티켓 ALL

parse_subcategory ALL

parse_maincategory 가구/침구 ALL

parse_maincategory 도서/음반 ALL

parse_maincategory 스포츠/자동차 ALL

parse_maincategory 컴퓨터/전자 ALL

parse_maincategory 식품 ALL

parse_maincategory 생활/주방/건강 ALL

parse_maincategory 여행 ALL

parse_maincategory 유아동/출산 ALL

parse_maincategory 화장품/헤어 ALL

parse_maincategory 패션의류 ALL

parse_maincategory 신발/잡화 ALL

parse_maincategory 가구/침구 가구

parse_maincategory 도서/음반 시/소설

parse_maincategory 유아동/출산 기저귀

parse_maincategory 신발/잡화 브랜드 신발/가방

parse_maincategory 식품 과일/견과

parse_maincategory 화장품/헤어 화장품

parse_maincategory 스포츠/자동차 스포츠의류/운동화

parse_maincategory 패션의류 브랜드 여성의류

parse_maincategory 도서/음반 경제/경영/개발

parse_maincategory e쿠폰/티켓 모바일 상품권

parse_maincategory e쿠폰/티켓 상품권

parse_maincategory e쿠폰/티켓 생활쿠폰

parse_maincategory e쿠폰/티켓 온라인컨텐츠

parse_maincategory 여행 G9 해외패키지

parse_maincategory 여행 여행소품

parse_maincategory 여행 해외여행

parse_maincategory 생활/주방/건강 렌탈 서비스

parse_maincategory 신발/잡화 여행가방

parse_maincategory 신발/잡화 수입명품

parse_maincategory 신발/잡화 잡화/액세서리

parse_maincategory 신발/잡화 가방/지갑

parse_maincategory 신발/잡화 여성신발

parse_maincategory 신발/잡화 브랜드 쥬얼리/시계

parse_maincategory 신발/잡화 운동화

parse_maincategory 신발/잡화 남성신발

parse_maincategory 화장품/헤어 제모/데오드란트/슬리밍

parse_maincategory 화장품/헤어 샴푸/헤어에센스/스타일링

parse_maincategory 화장품/헤어 바디클렌져/바디로션

parse_maincategory 화장품/헤어 화장소품

parse_maincategory 화장품/헤어 보습제품

parse_maincategory 패션의류 언더웨어

parse_maincategory 화장품/헤어 향수

parse_maincategory 화장품/헤어 남성화장품

parse_maincategory 패션의류 남성의류

parse_maincategory 패션의류 여성의류

parse_maincategory 패션의류 브랜드 진/캐쥬얼

parse_maincategory 패션의류 브랜드 남성의류

parse_maincategory 유아동/출산 홈플러스 베이비

parse_maincategory 유아동/출산 임부복/용품

parse_maincategory 유아동/출산 장난감/완구

parse_maincategory 유아동/출산 출산/유아용품

parse_maincategory 유아동/출산 유아동가방/잡화

parse_maincategory 유아동/출산 유아동신발

parse_maincategory 유아동/출산 유아동의류

parse_maincategory 유아동/출산 신생아의류/잡화

parse_maincategory 유아동/출산 물티슈

parse_maincategory 유아동/출산 분유/이유식

parse_maincategory 식품 홈플러스 식품

parse_maincategory 식품 채소

parse_maincategory 식품 정관장/홍삼

parse_maincategory 식품 다이어트

parse_maincategory 식품 건강

parse_maincategory 식품 캔/오일/조미료

parse_maincategory 식품 간편조리/간식

parse_maincategory 식품 생수/커피/음료

parse_maincategory 식품 김치/반찬

parse_maincategory 식품 수산

parse_maincategory 식품 축산

parse_maincategory 식품 쌀/잡곡

parse_maincategory 스포츠/자동차 자동차용품

parse_maincategory 스포츠/자동차 등산/아웃도어

parse_maincategory 스포츠/자동차 캠핑/낚시

parse_maincategory 스포츠/자동차 자전거/보드/기타레저

parse_maincategory 스포츠/자동차 골프

parse_maincategory 스포츠/자동차 구기/라켓

parse_maincategory 스포츠/자동차 휘트니스/수영

parse_maincategory 도서/음반 DVD

parse_maincategory 도서/음반 음반

parse_maincategory 도서/음반 어린이

parse_maincategory 도서/음반 학습/수험

parse_maincategory 도서/음반 해외원서

parse_maincategory 도서/음반 만화/잡지

parse_maincategory 도서/음반 가정/생활/취미/레저

parse_maincategory 도서/음반 인문/사회/과학/IT

parse_maincategory 생활/주방/건강 홈플러스 리빙

parse_maincategory 생활/주방/건강 건강/의료용품

parse_maincategory 생활/주방/건강 공구설비/자재

parse_maincategory 생활/주방/건강 반려동물용품

parse_maincategory 생활/주방/건강 문구/사무용품

parse_maincategory 생활/주방/건강 악기/취미/원예용품

parse_maincategory 생활/주방/건강 위생용품

parse_maincategory 생활/주방/건강 화장지/일용잡화

parse_maincategory 생활/주방/건강 세제/세면용품

parse_maincategory 생활/주방/건강 주방용품

parse_maincategory 생활/주방/건강 샤워기/필터/생활용품

parse_maincategory 생활/주방/건강 손소독제/소독기기

parse_maincategory 컴퓨터/전자 컴퓨터 사업자몰

parse_maincategory 컴퓨터/전자 디지털 액세서리

parse_maincategory 컴퓨터/전자 게임

parse_maincategory 컴퓨터/전자 MP3/스피커

parse_maincategory 컴퓨터/전자 헤드폰/이어폰

parse_maincategory 컴퓨터/전자 휴대폰

parse_maincategory 컴퓨터/전자 카메라

parse_maincategory 컴퓨터/전자 생활/미용가전

parse_maincategory 컴퓨터/전자 계절가전

parse_maincategory 컴퓨터/전자 주방가전

parse_maincategory 컴퓨터/전자 저장장치

parse_maincategory 컴퓨터/전자 영상가전

parse_maincategory 컴퓨터/전자 컴퓨터/용품

parse_maincategory 컴퓨터/전자 모니터/프린터

parse_maincategory e쿠폰/티켓 외식

parse_maincategory 여행 국내여행

parse_maincategory 생활/주방/건강 마스크(성인/유아동)

parse_maincategory 컴퓨터/전자 노트북/태블릿

parse_maincategory 가구/침구 브랜드 가구/침구/인테리어

parse_maincategory 가구/침구 홈패션/인테리어소품

parse_maincategory 가구/침구 커튼/블라인드

parse_maincategory 가구/침구 침구

코딩을 잘 따라 한 것 같은데 오류가 발생하는 것 같습니다

0

705

1

scrapy를 jupyter 환경에서 할 수 있나요

0

424

1

[실전 크롤링: scrapy 크롤링 팁] 질문있습니다.

0

367

1

[실전 크롤링: 지마켓 크롤링하며, scrapy 실전 활용법 익히기1] 5분50초쯤 질문

0

268

1

[강력/최신 크롤링 기술: Scrapy 로 지마켓 크롤링하기1] 관련 질문

0

329

1

xml을 parsing할때 <을 &lt; 로 인식합니다.

0

382

1

pipelines.py에서 process_item내에서 print문이 작동을 하지 않네요 ㅠ

0

344

3

PhantomJS 문의

0

346

1

selenium 문의

0

373

1

브라우저 제어해서 크롤링하기 - 처음강의 마지막부분 문의

0

3060

1

on error 해결 방법 질문

0

404

1

[팁] 윈도우 cmd 커맨드

0

394

1

[팁]Chrome User Agent 아는법

0

390

1

실전 크롤링: 브라우저를 제어해서 트위터 사이트 로그인 하기 질문

0

297

1

동영상 강의 만드실 때 사용한 툴을 알려주실 수 있을까요?

0

289

1

CSS Selector 에서 질문이 있습니다.

0

497

2

pip install scrapy 오류

0

540

1

셀레니움 실행불가

0

1641

1

실전 크롤링: XPATH와 Selenium 활용해서 페이스북 로그인 하기 에서 질문이 있습니다.

0

279

1

언제 get_text()를 사용하고 또 언제 .text를 사용하나요?

0

340

1

강의교안자료 받을수있을까요?

0

303

1

[강의 9:27관련 질문] price, title 열 위치

0

201

1

div에 있는 클래스가 2개이면 어떻게 하나요?

0

415

1

css 셀렉터에 대해 질문이 있습니다.

0

194

1