공부/etc

파이썬_웹크롤링_스크리피

2018. 2. 7. 11:27

참고:개발자를 위한 파이썬(윤웅식저, 한빛미디어)


운영체제:윈도우10

버전:파이썬2.7.14


virtualenv사용


#가상환경 만듬

C:\pyStudy>python -m virtualenv p2venv


#가상환경 실행

C:\pyStudy>p2venv\Scripts\activate

(#가상환경 종료 >deactivate)


#가상환경 실행 확인

(p2venv) C:\pyStudy>


#스크래피 설치

(p2venv) C:\pyStudy>pip install scrapy


#설치 확인

(p2venv) C:\pyStudy>scrapy


#스크래피 프로젝트 생성

(p2venv) C:\pyStudy>scrapy startproject hanbit_media


# 프로젝트 디렉토리

(p2venv) C:\pyStudy>cd hanbit_media


(p2venv) C:\pyStudy\hanbit_media>



hanbit_media\itemps.py

설정해준 아이템들로 해당 정보를 수집

# -*- coding: utf-8 -*-
import scrapy

class HanbitMediaItem(scrapy.Item):
    # 책 이름
    book_title = scrapy.Field()
    # 저자 이름
    book_author = scrapy.Field()
    # 번역자 이름
    book_translator = scrapy.Field()
    # 출간일
    book_pup_date = scrapy.Feild()
    # ISBM
    book_isbn = scrapy.Field()
    pass


#스파이더 만들기

http,www를 생략해서 입력

(p2venv) C:\pyStudy\hanbit_media>

scrapy genspider -t crawl book_crawl hanbit.co.kr


hanbit_media\spiders 디렉토리에 생성됨


#스파이더 파일 수정

hanbit_media\spiders\book_crawl.py

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

class BookCrawlSpider(CrawlSpider):
    # 크롤러 이름. 실제 크롤링 실행시 사용
    name = 'book_crawl'
    # 크롤러 실행 허용할 도메인 지정. 이외의 도메인 무시
    allowed_domains = ['hanbit.co.kr']
    # 시작점. 리스트로 지정해 한 번에 여러 웹 페이지 크롤링 시작 가능 
    start_urls = [
        'http://hanbit.co.kr/store/books/category_list.html?cate_cd=001',
        'http://hanbit.co.kr/store/books/category_list.html?cate_cd=002',
        'http://hanbit.co.kr/store/books/category_list.html?cate_cd=003',
        'http://hanbit.co.kr/store/books/category_list.html?cate_cd=004',
        'http://hanbit.co.kr/store/books/category_list.html?cate_cd=005',
        'http://hanbit.co.kr/store/books/category_list.html?cate_cd=006',
        'http://hanbit.co.kr/store/books/category_list.html?cate_cd=007',
        'http://hanbit.co.kr/store/books/category_list.html?cate_cd=008',
        ]
    # 규칙 설정
    # 시작점의 모든 링크 검사 후 규칙에 맞는 링크를 정해진 콜백 메서드 실행
    # follow = True 시 해딩 링크 대상으로 재귀적으로 앞 작업 반복
    rules = (
        Rule(
            # 크롤링할 링크 정규식으로 표현
            # store/books/look.php?p_code=B123123
            LinkExtractor(allow=r'store/books/look.php\?p_code=.*'),
            # 해당 링크 요정 전송 후 응답 오면 실행할 콜백 메서드 지정
            callback='parse_item',
            # True 설정 시 응답에 다시한번 rules 적용, 재귀적으로 실행
            follow=True),
        # 여러 규칙 설정 가능
        Rule(LinkExtractor(allow=r'store/books/category_list\.html\?page=\d+&cate_cd=00\d+&srt=p_pub_date'))
    )

    def parse_item(self, response):
        ''' rules를 통과한 링크에 요청 보내 받은 응답을 해당하는 Rule()의 콜백 메서드 실행
        response 를 파라미터로 받고 XPath,CSS 선택자로 원하는 요소 추출'''

        # 설정한 아이템에 맞춰 딕셔너리 채우고 반환
        i = {}
        
        # 책 이름
        i['book_title']=response.xpath('//*[@id="container"]/div[1]/div[1]/div[1]/div[2]/h3/text()').extract()
        # 저자 이름
        i['book_author']=response.xpath('//*[@id="container"]/div[1]/div[1]/div[1]/div[2]/ul/li[strong/text()="저자 : "]').extract()
        # 번역자 이름
        i['book_translator']=response.xpath('//*[@id="container"]/div[1]/div[1]/div[1]/div[2]/ul/li[strong/text()="번역 : "]').extract()
        # 출간일
        i['book_pub_date']=response.xpath('//*[@id="container"]/div[1]/div[1]/div[1]/div[2]/ul/li[strong/text()="출간 : "]').extract()
        # ISBM
        i['book_isbn']=response.xpath('//*[@id="container"]/div[1]/div[1]/div[1]/div[2]/ul/li[strong/text()="ISBN : "]').extract()
        return i


#크롤링 실행

해당 디렉토리에 접근후

scrapy 명령어를 이용하여 프로젝트가 활성화 되어 있는지 확인

(p2venv) C:\pyStudy\hanbit_media>scrapy crawl book_crawl -o book_list.csv -t csv


CSV형식으로 book_list.csv파일에 저장


--에러발생--









반응형