Python iframe, Javascript 크롤링

크롤링 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) 요청 거절 확인

resp + resp.text 확인: 200(ok), x(X)

3-1) 거절처리 : headers에 브라우저헤더 추가
3-2)  referer + useragent > cookies > auth, authorization

headers = {
    'Referer':'https://comic.naver.com/webtoon/detail?titleId=798101&no=108&week=tue',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'
}

resp = requests.get(url, headers=headers)

4) JSON 파싱: 딕셔너리로 변환

import requests
import json

resp = requests.get( url )

resp의 구조: ' {"1": 1000, "2":2000} '

크롬에서 JSON 확장 프로그램을 설치하면 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()


driver.find_element(By.XPATH, '//*[@id="_related_keywords"]/div/div/div/a[5]').click()
  1. //: 문서 전체에서 요소를 검색합니다. 즉, HTML 문서의 어느 위치에 있든 해당 조건을 만족하는 요소를 찾습니다.
  2. *: 모든 요소 노드를 나타냅니다. 즉, 요소의 태그 이름에 관계없이 모든 요소를 선택합니다.
  3. [@id="_related_keywords"]: id 속성 값이 _related_keywords인 요소를 선택합니다.
  4. /div: 선택된 요소의 바로 아래에 있는 div 요소를 선택합니다.
  5. /div: 다시, 선택된 div 요소의 바로 아래에 있는 div 요소를 선택합니다.
  6. /div: 또 다시, 선택된 div 요소의 바로 아래에 있는 div 요소를 선택합니다.
  7. /a[5]: 선택된 div 요소의 바로 아래에 있는 a (하이퍼링크) 요소 중에서 5번째 요소를 선택합니다.

댓글 쓰기

다음 이전