크롤링 2단계 복습
1. get : url -> 페이지 가져오기
2. select : select 구문 -> 태그 속 데이터 파싱
iframe 추측
- 페이지를 바꿨는데, 주소가 바뀌지 않는다.
- 태그를 보고 있는데, iframe이 발견되었다.
- 문제 : iframe 태그 안의 html은 파싱이 불가
- 대응 : iframe 태그의 src값으로 이동 (브라우저에서 직접) 후 기본 루틴
pandas 활용하기
import pandas as pd
- dataframe으로 선언(변환)
- 객체 = pd.DataFrame(딕셔너리)
- csv 파일 불러오기
- 객체 = pd.read_csv('파일명.csv')
객체 메서드
- 상위/하위 5개 조회
- 객체.head(5)
- 객체.tail(5)
- 정렬
- 객체.sort_values( 열, ascending=True, ignore_index=True, inplace=True )
- ascending: 오름차순
- ignore_index: 고유 인덱스 무시하기
- inplace: 덮어씌우기 (데이터프레임 자체 정렬을 바꾼다.)
- 기본 통계치 연산
- 객체.describe()
- csv로 저장
- 객체.to_csv( '파일명.csv', encoding='utf-8-sig', index=False )
series = 객체[컬럼]
- 문자열 메서드 일괄 적용
- 객체[컬럼] = 객체[컬럼].str.문자열메서드
- datetime으로 형변환
- 객체[컬럼] = pd.to_datetime( 객체[컬럼] )
- 숫자형으로 형변환
- 객체[컬럼] = pd.to_numeric( 객체[컬럼] )
- 형변환 기본 메서드
- 객체[컬럼] = 객체[컬럼].astype( type명시 )
크롤링 기본 루틴
1) 동적 확인 : F12 - 설정(톱니바퀴) - 디버거 - 자바스크립트 사용 중지(disalbe JS) - 새로고침
(바뀜) -> JS ok / (안바뀜) -> JS X
(JS 확인했으면 disable 다시 풀어주고 돌아옴)
2) JS페이지의 URL 찾기 : network 탭
2-1) clearlog - [Fetch/XHR],[JS] 탭 이동 - 새로고침(목록이 새로 뜬는 것을 확인)
* network 탭 : 서버가 클라이언트에게 주는 정보 목록들
-> 이 목록 안에 내가 원하는 JS 페이지 있다.
2-2) 목록들 하나씩 클릭 -> preview 탭을 보고 원하는 페이지인지 확인 -> 찾으면 headers 에서 requests url !
3) 요청 거절 확인
3-2) referer + useragent > cookies > auth, authorization
4) JSON 파싱: 딕셔너리로 변환
import requests
import json
resp = requests.get( url )
jsn = json.loads( resp.content )
loads -> { }
백트랙킹 계층 분석 "_embedded" > "restaurants" > []
"headerInfo" > "nameKR", "ribbonType"
"defaultInfo" > "website", "phone", "dayOff"
"statusInfo" > "parking", "menu", "priceRange", "businessHours"
제이슨객체 = json.dumps( 딕셔너리 )
dumps -> ' '
쿼리스트링 ex
url = 'https://apis.naver.com/commentBox/cbox/web_naver_list_jsonp.json?'
id = '798101'
params = {
'ticket':'comic',
'pool':'cbox3',
'lang':'ko',
'objectId':f'{id}_108',
'page':1,
'sort':'best',
}
# resp = requests.get(url, params=params, headers=headers)
# resp.text
# jsn = json.loads(resp.content[10:-2])
# jsn
셀레니움(Selenium)
가져오기
<div class="news_item"><h2 class="article_title api_txt_lines tit">기사 제목 1</h2>
<p id="article_summary_1">기사 요약 1</p>
<a href="#" class="news_link">링크 1</a>
</div>
from selenium import webdriver
from selenium.webdriver.common.by import By
URL = 'https://m.search.naver.com/search.naver?ssc=tab.m_news.all&where=m_news&sm=mtb_jum&query=%EC%BD%94%EB%A1%9C%EB%82%98'
driver = webdriver.Chrome() # 또는 다른 브라우저 드라이버
driver.get(URL)
# 클래스 이름으로 기사 제목 찾기
titles = driver.find_elements(By.CLASS_NAME, 'api_txt_lines.tit')
for title in titles:
print(title.text)
# ID로 기사 요약 찾기
summaries = driver.find_elements(By.ID, 'article_summary_1')
for summary in summaries:
print(summary.text)
# 태그 이름으로 링크 찾기
links = driver.find_elements(By.TAG_NAME, 'a')
for link in links:
print(link.get_attribute('href'))
# 링크 찾기
By.PARTIAL_LINK_TEXT는 셀레니움(Selenium)에서 웹 페이지의 링크(anchor 태그, <a>)를 찾을 때 사용하는 방법 중 하나입니다. 링크의 전체 텍스트가 아닌 일부 텍스트만으로 링크를 찾을 수 있습니다.
# 단일 요소 찾기
element = driver.find_element(By.PARTIAL_LINK_TEXT, "링크 텍스트명")
# 여러 요소 찾기
elements = driver.find_elements(By.PARTIAL_LINK_TEXT, "링크 텍스트명")
종료
driver.quit()
추가 동작 및 XPATH
- 엘레멘트 클릭 => click()
- 텍스트 입력 => send_keys()
- 텍스트 삭제 => clear()
- //: 문서 전체에서 요소를 검색합니다. 즉, HTML 문서의 어느 위치에 있든 해당 조건을 만족하는 요소를 찾습니다.
- *: 모든 요소 노드를 나타냅니다. 즉, 요소의 태그 이름에 관계없이 모든 요소를 선택합니다.
- [@id="_related_keywords"]: id 속성 값이 _related_keywords인 요소를 선택합니다.
- /div: 선택된 요소의 바로 아래에 있는 div 요소를 선택합니다.
- /div: 다시, 선택된 div 요소의 바로 아래에 있는 div 요소를 선택합니다.
- /div: 또 다시, 선택된 div 요소의 바로 아래에 있는 div 요소를 선택합니다.
- /a[5]: 선택된 div 요소의 바로 아래에 있는 a (하이퍼링크) 요소 중에서 5번째 요소를 선택합니다.