반응형
안녕하세요. 멋진선배 입니다. 웹사이트 파라미터 종류가 많을때 크롤링 하는 방법 2단계 과정 정리 합니다.
아래 3가지 사항에 대해서 알려드리도록 하겠습니다.
2단계 학습 내용 정리
반응형
- 상세페이지 접속하여 데이터 갖고 오기
- 접속 거절시 헤더정보 변경을 이용한 해결 방법
- SSL 오류 생성시 해결 방법
상세 페이지 접속하여 데이터 갖고 오기
반응형
- 화면에서 F12버튼 클릭 -> 검사 -> Network tab으로 이동 -> Payload에서 소스코드 정보 복사 후 null값들은 제거
아래와 같이 파라미터에 Payload 값을 넣어주고 url에 param 변수를 추가해주면 파라미터가 많은 웹 페이지 크롤링이 가능하다.
param = {
'isDetailSearch': 'N',
'searchGubun': 'true',
'viewYn': 'OP',
'strQuery': '패션 인공지능',
'order': '/DESC',
'onHanja': 'false',
'strSort': 'RANK',
'iStartCount': 0,
'sflag': 1,
'isFDetailSearch': 'N',
'pageNumber': 1,
'resultKeyword': '패션 인공지능',
'icate': 're_a_kor',
'colName': 're_a_kor',
'pageScale': 100,
'isTab': 'Y',
'query': '패션 인공지능'
}
response = requests.get("https://www.riss.kr/search/Search.do", params=param)
html = response.text
soup = BeautifulSoup(html, 'html.parser')
접속 거절시 헤더정보 변경을 이용한 해결 방법
반응형
웹사이트에서 접속 거절하는 하는 경우가 있는데 이럴땐 헤더에 아래와 같은 정보를 넣어주면 접속이 가능하다.
header = {
'User-Agent' : 'Mozilla/5.0',
'Referer' : 'https://www.riss.kr/search/Search.do?isDetailSearch=N&searchGubun=true&viewYn=OP&queryText=&strQuery=%ED%8C%A8%EC%85%98+%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5&exQuery=&exQueryText=&order=%2FDESC&onHanja=false&strSort=RANK&p_year1=&p_year2=&iStartCount=0&orderBy=&mat_type=&mat_subtype=&fulltext_kind=&t_gubun=&learning_type=&ccl_code=&inside_outside=&fric_yn=&db_type=&image_yn=&gubun=&kdc=&ttsUseYn=&l_sub_code=&fsearchMethod=&sflag=1&isFDetailSearch=N&pageNumber=1&resultKeyword=%ED%8C%A8%EC%85%98+%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5&fsearchSort=&fsearchOrder=&limiterList=&limiterListText=&facetList=&facetListText=&fsearchDB=&icate=re_a_kor&colName=re_a_kor&pageScale=100&isTab=Y®nm=&dorg_storage=&language=&language_code=&clickKeyword=&relationKeyword=&query=%ED%8C%A8%EC%85%98+%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5'
}
for article in articles:
title = article.select_one(".title > a").text
link = 'https://www.riss.kr' + article.select_one(".title > a").attrs['href']
# verify = Fasle SSL인증을 하지 않음. 계속된 조회시 SSL 오류가 날 수 있음
response = requests.get(link, headers=header, verify=False)
html = response.text
soup = BeautifulSoup(html, 'html.parser')
SSL 오류 생성시 해결 방법
반응형
SSL 오류시 아래와 같은 코드를 이용하면 해결이 된다.
# verify = Fasle SSL인증을 하지 않음. 계속된 조회시 SSL 오류가 날 수 있음
response = requests.get(link, headers=header, verify=False)
최종 소스코드
import requests
from bs4 import BeautifulSoup
import urllib3
urllib3.disable_warnings()
# 2단계 상세페이지 크롤링 하는 방법
# for 문 안쪽에서 추가로 요청을 보낼 수 있음
# 목록에서 크롤링한 링크로 상세 페이지를 요청
param = {
'isDetailSearch': 'N',
'searchGubun': 'true',
'viewYn': 'OP',
'strQuery': '패션 인공지능',
'order': '/DESC',
'onHanja': 'false',
'strSort': 'RANK',
'iStartCount': 0,
'sflag': 1,
'isFDetailSearch': 'N',
'pageNumber': 1,
'resultKeyword': '패션 인공지능',
'icate': 're_a_kor',
'colName': 're_a_kor',
'pageScale': 100,
'isTab': 'Y',
'query': '패션 인공지능'
}
response = requests.get("https://www.riss.kr/search/Search.do", params=param)
html = response.text
soup = BeautifulSoup(html, 'html.parser')
articles = soup.select(".srchResultListW > ul > li")
#상세 페이지 요청
#서버의 요청 거절에 대한 케이스
#상태코드(Status Code) 200 -> 응답받은 HTML이 올바르지 않음
#상태코드(Status Code) 400번대 -> 거절은 당한 케이스임
#무한루프 -> 거절을 당한 케이스임
#이렇게 거절을 당했을때 헤더가 필요하다.
#'User-Agent' : 'Mozilla/5.0'
#'Referer':'URL 주소값'
header = {
'User-Agent' : 'Mozilla/5.0',
'Referer' : 'https://www.riss.kr/search/Search.do?isDetailSearch=N&searchGubun=true&viewYn=OP&queryText=&strQuery=%ED%8C%A8%EC%85%98+%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5&exQuery=&exQueryText=&order=%2FDESC&onHanja=false&strSort=RANK&p_year1=&p_year2=&iStartCount=0&orderBy=&mat_type=&mat_subtype=&fulltext_kind=&t_gubun=&learning_type=&ccl_code=&inside_outside=&fric_yn=&db_type=&image_yn=&gubun=&kdc=&ttsUseYn=&l_sub_code=&fsearchMethod=&sflag=1&isFDetailSearch=N&pageNumber=1&resultKeyword=%ED%8C%A8%EC%85%98+%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5&fsearchSort=&fsearchOrder=&limiterList=&limiterListText=&facetList=&facetListText=&fsearchDB=&icate=re_a_kor&colName=re_a_kor&pageScale=100&isTab=Y®nm=&dorg_storage=&language=&language_code=&clickKeyword=&relationKeyword=&query=%ED%8C%A8%EC%85%98+%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5'
}
for article in articles:
title = article.select_one(".title > a").text
link = 'https://www.riss.kr' + article.select_one(".title > a").attrs['href']
# verify = Fasle SSL인증을 하지 않음. 계속된 조회시 SSL 오류가 날 수 있음
response = requests.get(link, headers=header, verify=False)
html = response.text
soup = BeautifulSoup(html, 'html.parser')
# #방법1. 순서를 기준으로 찾기(nth-of-type 함수를 이용한 크롤링)
# #단점 : 모든 글의 순서가 같으면 상관없으나 순서가 달라질 경우 이상한 값을 갖고 오게 됨
# press = soup.select_one(".infoDetailL > ul > li:nth-of-type(2) > div").text
# year = soup.select_one(".infoDetailL > ul > li:nth-of-type(5) > div").text
# keywords = soup.select_one(".infoDetailL > ul > li:nth-of-type(7) > div").text.split(';')
# #방법1. 키워드 추출
# #result = []
# #for keyword in keywords:
# # result.append(keyword.strip())
# #방법2. 키워드 추출(간단한 방법)
# keywords = [keyword.strip() for keyword in keywords]
#방법2. 텍스트를 기준으로 찾기
press = soup.find('span', string='발행기관').find_next_sibling().text #발행기관 바로 옆 이웃 테그
year = soup.find('span', string='발행연도').find_next_sibling().text
# 주제어가 없는 대상이 있어 주제어가 없을땐 else문을 타고 null 값을 넣어 준다.
if soup.find('span',string='주제어'):
keywords = soup.find('span', string='주제어').find_next_sibling().text.split(';')
keywords = [keyword.strip() for keyword in keywords]
else:
keywords = []
print(title, link, press, year, keywords)
반응형
'IT > Python' 카테고리의 다른 글
[Python - 크롤링] 셀레니움 설치/환경 설정 및 주요 명령어 정리 (0) | 2025.05.01 |
---|---|
[Python-크롤링] 웹사이트 파라미터 종류가 많을때 크롤링 하는 방법 1단계 (0) | 2025.04.30 |
[Python - 크롤링] 네이버지식인 데이터 크롤링 1단계 (0) | 2025.04.28 |
[Python - 크롤링] 네이버 증권 뉴스 엑셀파일 저장하기 (0) | 2025.04.25 |
[Python - 크롤링] 한국 주식 종가 갖고 오는 프로그램 코드 (0) | 2025.04.25 |