scrapy + splash 로 웹 크롤링

강준호·2023년 5월 6일

크롤링

목록 보기
1/1

scrapy 문법

@ 기호

  • Scrapy에서 '@' 기호는 XPath 표현식에서 HTML 또는 XML 요소의 속성을 선택하는 데 사용됩니다.
 li_element.xpath('@class').get()
 
 #선택한 li 요소의 class 속성 값을 추출하는 데 사용됩니다.
 # @class 구문은 요소 자체가 아니라 class 속성을 선택하려고 함을 나타냅니다.


get()
# 속성 값을 문자열로 추출하기 위해 XPath 표현식의 끝에서 사용됩니다. 
#선택한 요소에 여러 속성이 있는 경우 getall()을 사용하여 모든 속성 값을 문자열 목록으로 추출할 수 있습니다.

text 추출

text_element = card.xpath('//*[@id="naver"]/div/section/div/div/div[2]/div[2]/ul/li[1]/a/dl/dd[3]/text()')

# /text() 후 .get() 을 이용하자

scrapy 기능들

scrapy shell 에서 splash 돌리기

shell 에다가

from scrapy_splash import SplashRequest

url = 'http://example.com' # replace with your target URL
lua_script = """
function main(splash)
    splash:go(splash.args.url)
    splash:wait(0.5)
    splash:runjs("document.querySelector('a[onclick^=viewGoodsMemberPrice]').click()") # 너가 실행할 js
    splash:wait(1.0)
    return {html=splash:html()}
end
"""
request = SplashRequest(url, endpoint='execute', args={'lua_source': lua_script})

# send the request
fetch(request)

'normalize-space(text())'

  • 가끔 태그 안에 text 추출에 공백이나 이상한것들이 껴있을때.
    ex) ['\t\t', '뉴비', '108,790원', '\n\t\t']

  • 근데 또 리스트여서 strip 을 못쓸때('list' object has no attribute 'strip' )

  • normalize-space(text())를 수행하면 불필요한 공백이 모두 제거되고 정리된 문자열이 반환됩니다

scrapy 실행

  • scrapy crawl [스파이더 name]
  • scrapy runspider [스파이더]

or 경로가 꼬였을때는
cd path/to/ssg_wine # 최상위 루트
scrapy crawl wineSpider

splash 실행

1. 도커시작

sudo docker run -p 8050:8050 scrapinghub/splash

css selecter 방법

1. CSS 선택자는 요소를 선택하는 데 사용되는 패턴이며 JavaScript에서 요소를 선택하는 기본 방법.

  • 그이유는: JavaScript의 document.querySelector() 함수는 XPath가 아닌 CSS 선택기와 함께 작동하도록 설계되었기 때문.

item 저장한것들 json 으로 출력하기

scrapy crawl wineSpider -o output.json

class 이름 띄어쓰기 되어있는데 추출하기

imgH = response.xpath('//div[contains(@class, "productInner") and contains(@class, "img")]')

css에서는 .으로 띄어쓰기 채워도 되지만 xpath 에서는 불가능해. 이건 두가지 클래스를 가지고 있는거야.

경로

cd Crawling/ssg_wine
scrapy crawl winespider

0개의 댓글