반응형

파이썬, Scrapy 크롤링 예제 

 

글. 수알치 오상문 

 

셀레니움을 이용하다가 스크래피를 처음 사용해봤는데 이용하는 방법이 많이 다르네요. 간단하게 네이버에서 검색하고 그 결과 일부를 출력하는 예제입니다.

 

스크래피 설치: python -m pip install Scrapy

 

# Scrapy 네이버 크롤링 예제

import scrapy  # python -m pip install Scrapy
from scrapy.selector import Selector
from twisted.internet import reactor
from scrapy.crawler import CrawlerRunner
from scrapy.spiders import Rule
from scrapy.http import Request, FormRequest
import logging

logging.basicConfig(
    filename='log.txt',
    format='%(levelname)s: %(message)s',
    level=logging.INFO
)

class NaverSpider(scrapy.Spider):
    name = "NaverSpider"
    login_page = "https://nid.naver.com/nidlogin.login?mode=form&url=https%3A%2F%2Fwww.naver.com"
    start_urls = "https://www.naver.com"
       
    # 크롤링 시작 메소드
    def start_requests(self):
        # '수알치' 검색 링크
        url = "https://search.naver.com/search.naver?query=수알치&nso=&where=blog&sm=tab_opt"
        # 결과를 하나씩 돌려주기 
        yield scrapy.Request(url=url, callback=self.parse)

        '''
        # 다중 링크를 처리하는 방법
        allowed_domains = ["naver.com"]        
        urls = ["https://www.naver.com/", 네이버링크2, 네이버링크3, ...]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)
        '''          

    # 크롤링 결과 콜백 함수
    def parse(self, response):
        self.logger.info('Parse function called on %s', response.url)        
        # response.xpath(), response.css() 검색 결과 받기        
        # self.result = response.css('.api_txt_lines').getall()  # 내부 html 포함하여 선택
        # self.result = response.css('.api_txt_lines::text').getall()  # 첫 텍스트 선택
        self.result = response.css('.api_txt_lines').xpath('string(.)').getall()  # 모든 텍스트 선택
        # get(): 한개 str
        # getall(): 결과 리스트 
        # extract(): 결과 개수에 따라 str or 리스트 반환 (u문자열 데이터)
        

        if(result)  # 첫 항목 출력 
            print(self.result[0]) 

        if(len(result)>2)  # 끝 항목 출력 
            print(self.result[-1])


if __name__ == "__main__":
    
    runner = CrawlerRunner()
    
    runner.crawl(NaverSpider)  # 정의한 spider 클래스 지정
    # runner.crawl(DaumSpider) # 여러 spider를 추가 지정 가능    
    crawler = runner.join()
    crawler.addBoth(lambda _: reactor.stop())
    reactor.run()  # 모두 종료할 때까지 대기

    '''
    # 이런 방법도 가능하다.
    process = CrawlerProcess()
    process.crawl(NaverSpider)  # 정의한 spider 클래스 지정
    process.start()
    '''

    print("The END!")

 

 

[실행 결과]

"매 나간다!" 소리치며 꿩을 잡는 매사냥꾼 수알치
수알치 오상문 다음과 같은 웹 화면에서 I am, You are, We are를 클릭하면, 아래 Article 내용이 변경되는 예제이다. I am을... 
The END!

 

반응형

+ Recent posts