티스토리 뷰

[크롤링을 위한 Tool]


크롤링을 위해서 HTML문서를 가져오는 작업이 필요합니다.


1. Requests


Requests로 원하는 페이지의 HTML문서를 불러올 수 있습니다.

먼저 python 라이브러리로 requests를 설치 합니다.


pip install requests

(Mac 이용자는 python3를 이용할 시 pip3로 다운로드)


import requests

req = requests.get('https://importer.ec21.com/shoe.html')

## HTML Source
html = req.text

## HTTP Header
header = req.headers

## HTTP Status (200이면 성공응답)
status = req.status_code

## HTTP
is_ok = req.ok

print(status)
print(is_ok)
print(html)


HTML문서를 받기 위한 HTTP 응답이 성공적으로 이뤄지면 200을 표시합니다.

이렇게 html 변수에 사이트의 HTML문서를 text로 받아올 수 있습니다.


이 후 HTML문서를 객체로 받아와야지만 우리가 원하는 태그를 찾고 데이터를 추출할 수 있습니다.

이를 위해서 BeautifulSoup4라는 라이브러리를 사용합니다.


2. BeautifulSoup


BeautifulSoup는 HTML문서를 객체구조로 변환시켜주고 우리가 원하는 데이터를 찾기 위한 함수를 제공합니다.

Requests는 단순히 string 문자열로 변환시켜주는 역할만 하기 때문에 HTML의 구조를 이해하지 못합니다.

단순한 string인 HTML text를 우리가 활용할 수 있도록 객체구조로 바꿔주는 작업이므로 Parsing 작업에 해당합니다.

(Parsing : 데이터를 다른 형태로 변환하는 작업)



pip install bs4


 

위 사이트는 물건을 사고파는 사이트입니다.

물건을 사거나 팔때 공고를 올리죠.

이 공고글들의 제목들만 추출해보겠습니다.


[그림1] 원하는 사이트에서 원하는 데이터의 HTML 태그를 확인하는 방법


 body > section > div > div > article.conCenter_sch > div.conCenter_wrap > div.conProduct_list > ul > li:nth-child(1) > div > div.listLs_L.buyerL > div > h2 > a



Copy selector을 복사해서 붙여넣으면 이런 내용이 나옵니다. 이게 제목을 표시하는 태그의 경로죠.

(부모 태그부터 차례대로 표시됨)


중간에 li:nth-child(1)과 같은 선택자는 정확하게 해당되는 데이터만 의미 (1번째 자식태그라는 의미)하므로 빼주겠습니다.

(우리는 저렇게 생긴 제목들을 "모두" 추출해야하므로 선택자는 빼야합니다.)


그리고 저렇게 길게 태그의 부모 태그들을 적어줄 필요가 없습니다.

왠지 중간 div.conProduct_list 라는 class는 다른 곳에는 사용되지 않을 것 같군요.


검색을 통해 맞는지 확인해봅시다.


[그림2div.conProduct_list라는 class는 하나만 존재하며 우리가 찾고자 하는 제목을 포함하고 있는 화면을 표시한다.


div.conProduct_list라는 Class는 하나만 존재하므로 태그 경로를 div.conProduct_list부터 시작해도 되겠군요.

Selector가 헷갈릴 일이 없으니까요.


그렇다면 더 범위를 좁혀서 div.listLs_L.buyerL라는 Class 는 어떨까요?


[그림2div.listLs_L.buyerL는 우리가 찾고자 하는 제목이 포함된 하나의 목록을 표시한다. (20개의 목록)


빙고!

우리가 원하는 데이터를 가진 공고글의 Class를 찾았습니다.


div.listLs_L.buyerL는 공고글들을 형성하는 Class고 이 Class의 제목에 해당하는 태그들을 모두 뽑으면 됩니다.

즉, "div.listLs_L.buyerL > div > h2 > a" 경로에 해당하는 모든 데이터를 뽑으면 이 페이지에 있는 제목을 뽑을 수 있습니다.




그리고 제목에 해당하는 곳까지의 경로,


div.listLs_L.buyerL > div > h2 > a


를 적용시켜보겠습니다.



import requests
from bs4 import BeautifulSoup

req = requests.get('https://importer.ec21.com/shoe.html')

## HTML Source
html = req.text

## html text(파싱할 내용), parser 종류(html parser) 입력
soup = BeautifulSoup(html, 'html.parser')

## select 함수
my_titles = soup.select(
'div.listLs_L.buyerL > div > h2 > a'
)

for title in my_titles:
print(title.text)



이렇게 하면 현재 페이지의 공고글의 제목들이 모두 저장됩니다.





댓글
최근에 올라온 글
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
공지사항
최근에 달린 댓글