이전 TIL 내용을 보니 작년 10월을 기점으로 TIL의 작성이 멈췄습니다 .. git 관리도 그렇고 회사에서 일하고 있을때는 자연스럽게 배우는 것이 있다는 안도감에 이렇게 되버린것 같습니다
최근에 개인적으로 사이드프로젝트도 하고 웹사이트도 풀스택으로 구성해보고 기초적인 학습 내용등을 복습 해보고 하고 있기에 이런 내용을 특별한 양식 없이 TIL이라는 명목하에 작성하고 정리 해보려 합니다
확실히 처음 배웠을때보다는 시야가 많이 열리고 새로운 관점이 생길 수 있을 것 같아서 기대가 됩니다
데이터 분석 관련 기초분석
크롤링
requests에 관하여
data = requests.get('https://search.naver.com/search.naver?where=news&ie=utf8&sm=nws_hty&query=삼성전자')
기본적으로 가상환경을 만들고 그 안에서 bash pip install bs4 requests
로 패키지를 설치하는 과정을 제외하고 처음 학습 할때 위에 작성한 한줄의 코드에 대해서 아무런 생각 없이 받아들였던 것 같습니다
코드를 볼때 requests의 get moethod를 이용하여 함수에 전달한 URL 파라미터를 이용해서 해당 URL의 값을 받아오는 형식으로 동작하게 되겠다는 것으로 생각을 하였고 기본적으로 이 개념이 틀린 것은 아니지만 이것이 완벽히 브라우저 상에서 요청하는 방식이 아니기때문에 header를 지정해서 요청을 해주는 것이 조금 더 안정적인 동작을 할 수 있다라는 점의 내용은 생각하지 못하였었습니다.
방금 이야기 한 내용을 이용하여 코드를 다시 구성해 본다면 다음과 같이 구성이 가능 합니다
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'}
data = requests.get('https://search.naver.com/search.naver?where=news&ie=utf8&sm=nws_hty&query=삼성전자', headers=headers)
이 내용에 대해서 조금 더 자세히 설명해 본다면 header를 작성하지 않으면 requests 라이브러리가 기본적으로 제공하는 사용자 에이전트 정보가 사용됩니다. 이는 일반적으로 웹 브라우저에서 보내는 요청과 유사하지만, 어떤 경우에는 이러한 기본 사용자 에이전트 정보가 서버에 의해 차단될 수 있습니다.
또한, requests 라이브러리의 버전이나 환경에 따라 기본 사용자 에이전트 정보가 다를 수 있습니다. 따라서, header를 작성하지 않으면 요청이 원하는 대로 처리되지 않을 수 있으며, 그 결과로 원하는 정보를 가져오지 못할 수도 있습니다.
따라서, header를 작성하여 원하는 사용자 에이전트 정보를 설정하는 것이 좋습니다. 웹 스크래핑을 할 때는 항상 웹 사이트의 이용 약관 등을 확인하여 합법적으로 웹 스크래핑을 수행하는 것이 중요하며, header 설정도 이에 따라서 합법적으로 웹 스크래핑을 수행할 수 있도록 설정하는 것이 좋습니다.
requests 의 결과 response에 대하여
requests를 이용하여 데이터를 받게되면 해당 결과를 data 라는 변수에 담아서 해당 data 객체에 포함되어있는 속성(attribute)를 이용하여 원하는 값을 뽑아 내기 위한 준비를 하게 됩니다
여기서 사용하게 되는 방법이 data.text 이고 data의 text 부분을 가져온다 라고 생각하면 됩니다
soup = BeautifulSoup(data.text, 'html.parser')
select_one과 select의 차이
말그대로 한개를 뽑아 낼 것인지 여러개를 뽑아 낼 것인지의 차이라고 생각하면 되겠습니다
하지만 반환하는 방식이 다르기에 사용할 때 주의 할 점이 있으며 select_one은 말그대로 한개만 뽑아내게 되서 여러개에 해당하는 조건을 줄 경우에 에러가 발생하면서 프로그램이 종료됩니다
slect의 경우는 해당하는 요소들을 리스트 형태로 반환하게 됩니다
BeautifulSoup 으로 가져온 데이터를 pprint를 이용하여 출력하는 것에 대한 생각
pprint 함수는 Python의 데이터 구조를 보기 좋게 출력하기 위한 함수이므로, HTML 형식의 문자열을 다룰 때에는 적합하지 않다는 것을 확인 하였습니다
HTML 형식의 문자열을 다룰 때에는, BeautifulSoup과 같은 HTML 파서를 사용하여 파싱한 후, 파싱된 데이터를 보기 좋게 출력하거나, 이를 다른 형식으로 변환하는 것이 일반적인 방법이고 파싱된 데이터를 딕셔너리나 리스트와 같은 Python 데이터 구조로 변환하여 이를 pprint 함수를 사용하여 출력할 수 있어야겠습니다
따라서, HTML 형식의 문자열을 다룰 때에는 pprint 함수를 직접적으로 사용하는 것보다, 이를 파싱한 후 파싱된 데이터를 적절히 처리하는 것이 더 적합하겠습니다
원하는 요소를 찾아가는 방법에 대해서
위와 같은 이야기를 한것은 요소를 찾아갈때는 간단하게 이정표를 어떻게 만들어주면 될지에 대한 생각 하기 위해서 전달 받은 html 구조를 파악할 필요가 있는데 이것을 하기전에 python에서 출력을 할 때 사용하는 pprint를 이용하면 조금 더 분석에 유리하지 않을까 하는 생각 때문이었습니다
하지만 결과적으로는 html 형태의 문자열을 받아서는 보통의 print와 같은 반환 값을 얻게 되었고 이 상태에서 원하는 요소를 찾아가는 방법에 대해서 간단하게 서술해 보겠습니다
위의 HTML 형식의 문자열을 다룰때에는 적합하지 않다 어쩌구 작성해놓긴 하였지만 우리가 핸들링하는 내용은 bs4.BeautifulSoup'객체 입니다 하여 이것을출력해보게 된다면 HTML 구조가 보이고 여러가지 <> 태그들이 보이게 됩니다
여기서 포인트는 class와 id 찾는 것입니다 우리는 원하는 값을 찾을 수 있는 길을 만들어주는 작업을 하게 될 것인데 여기에서 class와 이정표를 사용하게 될 것 입니다
보통의 구성은 "id > class or tag 이름 > class or tag 이름" 이렇게 찾게 되는데 여기서 한개의 팁은 id는 한개의 파일에서 단 하나만 존재할 수 있다는 점입니다 그렇기에 id의 값을 한개만 입력하는 것으로 중복없는 길을 만들 수 있고 그 하위의 길을 다른 태그의 이름이나 class의 이름등을 사용하여 찾아 갈 수 있는 것입니다.
lis = soup.select('#footer > .sub_pack_btm > a')
이렇게 간단히 길을 찾아간다고 생각하면 손쉽게 원하는 요소에 접근이 가능합니다
추천 하지는 않지만 이런 방법으로 요소를 찾아가는 것이 익숙하지 않을때 해당 bs4 객체를 str() 을 이용하여 문자열 형변환 하여 사용할 수도 있습니다
'TIL' 카테고리의 다른 글
10-4[알고리즘] 프로그래머스 (0) | 2022.10.04 |
---|---|
9-27[알고리즘] 프로그래머스 (0) | 2022.09.27 |
9-26[알고리즘] 시간복잡도 학습 (0) | 2022.09.26 |
9-22[재정비] 프로젝트 재검토 (0) | 2022.09.22 |
9-20[개념정리] 토큰 관련 개념 재정리 및 알고리즘 복습 (1) | 2022.09.20 |