이번 게시물에서는 response에서 원하는 데이터를 추출하는 방식을 소개한다.
Scrapy 튜토리얼2 - 네이버 검색 결과 크롤링(크롤러 설정)
1. 데이터 추출
위 조건을 다 맞춰 spider를 만들었다면 parse함수에서 받아온 response로 원하는 값을 가져오자.
크롤링을 하기 위해서는 기본적으로 내가 원하는 데이터가 들어있는 태그를 파악해야한다.
F12키를 눌러 개발자 도구를 열고 왼쪽 위에 커서모양 버튼을 누르면 내가 원하는 데이터의 태그를 쉽게 찾을 수 있다.
scrapy는 class명과 id명, xpath 등을 활용할 수 있는데 간단히 class명으로 데이터를 받아온다.
response.css() 함수를 사용하면 class명과 id명을 이용해 데이터를 받아올 수 있다.
클래스는 .클래스명 으로 앞에 점을 하나 붙여야 하고 id는 #아이디명 으로 #을 붙여줘야 동작한다.
그 뒤에는 get()함수나 getall() 혹은 extract() 등을 사용해야 비로소 데이터를 추출해온다.
get() 함수는 해당하는 여러 태그 중 1개만 추출하고, getall()이나 extract()는 해당하는 태그가 여러개일 경우 리스트로 반환한다.
getall()과 extract()는 큰 차이는 없지만 getall()은 무조건 리스트로 반환하는 반면 extract() 결과 개수에 따라 리스트 혹은 str로 반환된다.
selector 함수에 대한 더 자세한 사항은 공식문서를 참고하자.
위 코드를 실행한 결과는 다음과 같다.
<a href="https://blog.naver.com/kizaki56?Redirect=Log&logNo=222665532164" class="api_txt_lines total_tit" target="_blank" onclick="return goOtherCR(this, 'a=blg*a.iblg&r=1&i=90000003_0000000000000033D7E66304&u='+urlencode(this.href))"><mark>강남</mark> 한우 <mark>맛집</mark> 장위동유성집 특선 메뉴 추천</a>
2. 텍스트 추출
scrapy도 beautifulSoup의 get_text()함수처럼 텍스트만 추출해오는 함수가 존재한다.
이번에는 결과에서 텍스트만 추출해보자
def parse(self, response):
result = response.css('.api_txt_lines::text').get()
print(result)
css 선택자에서 텍스트만 추출하도록 하려면 class명 뒤에 ::text 를 붙이면 된다.
추출된 결과를 보자
한우
분명 제목 전체를 가져오기를 원했는데 결과가 조금 이상하다. 그 이유는 html파일 구조를 보면 알 수 있다.
::text는 하위태그 내의 text까지는 접근할 수 없고, 텍스트 중 첫번째 텍스트만 가져오는 단점이 있다.
하위 태그까지 포괄한 모든 텍스트를 가져오고자 한다면 xpath를 사용해야한다.
def parse(self, response):
result = response.css('.api_txt_lines').xpath('string(.)').get()
print(result)
xpath는 함수 xpath()를 사용하여 접근하면 된다.
일반적인 사용 예시는 'response.xpath('//*[@id="sp_blog_1"]/div/div/a').get()' 처럼 활용하면 된다.
여기서 주목해야할 것은 string()이다.
xpath 링크를 string()으로 감싸면 현재 태그가 감싸고 있는 모든 텍스트를 전부 반환하는 상당히 편리한 함수이다.
한가지 더 설명하자면, string() 함수 안에 있는 .은 현재 위치를 의미한다. css로 접근한 뒤 xpath로 재접근을 하는 것이기 때문에 css로 접근한 현재위치인 a태그에서 모든 텍스트를 가져오는 것을 뜻한다. 만약 그 안쪽으로 더 접근하고자 한다면 .xpath('./div') 등으로 활용할 수 있다.
결과를 살펴보자
강남 한우 맛집 장위동유성집 특선 메뉴 추천
원하는 결과를 잘 추출한 것을 볼 수 있다.
'Python' 카테고리의 다른 글
[Locust] TaskSet, SequentialTaskSet 사용하기 (0) | 2022.04.28 |
---|---|
[Locust] 서버 부하테스트 툴 Locust 튜토리얼 (0) | 2022.04.21 |
[Scrapy] Scrapy 튜토리얼2 - 네이버 검색 결과 크롤링(크롤러 설정) (0) | 2022.03.17 |
[Scrapy] Scrapy 튜토리얼1 - Scrapy를 선택한 이유 (0) | 2022.03.17 |
[Python] string to Json (Json.loads()) 파싱 문제 (0) | 2022.03.10 |