• 목록
  • 아래로
  • 위로

requests-html-logo.jpg

 

 

 

안녕하세요?

 

모처럼 짬이 나서 오래간만에 강좌 게시판에 글을 올리네요 :)

 

오늘은 Requests-HTML vs Requests의 비교를 간단히 해보려고 하네요!

 

 

Requests-HTML은 kennethreitz에 의해 HTML Parsing for Humans이란 모토 하에 진행되고 있는 프로젝트입니다.

 

https://requests-html.kennethreitz.org/ 공홈에서 밝히고 있듯이 Requests에 비해 다음과 같은 장점이 있어요!

  • Full JavaScript support!
  • CSS Selectors (a.k.a jQuery-style, thanks to PyQuery).
  • XPath Selectors, for the faint at heart.
  • Mocked user-agent (like a real web browser).
  • Automatic following of redirects.
  • Connection–pooling and cookie persistence.
  • The Requests experience you know and love, with magical parsing abilities.
  • Async Support

 

 

기본적으로 Requests를 토대로 하고 있기 때문에 Requests에서 지원되는 기능은 당연히 모두 지원되구요 ^^

 

이하 3가지 측면에서 Requests vs Requests-HTML를 비교할 때 후자의 장점을 살펴보려고 합니다.

 

 

 

1. Javascript 지원

 

Requests-HTML은 자바스크립트를 완벽히 지원하기 때문에, 기존의 Requests만으로는 크롤링할 수 없는 사이트도 간단히 해결할 수 있습니다.

 

양재동 코드랩의 강좌 리스트 페이지처럼 자바스크립트로 구동되는 사이트에서도 Selenium을 사용하지 않고 처리할 수 있어요 :)

 

 

from requests_html import HTMLSession

s = HTMLSession()
r = s.get('https://www.codelabs.kr/codelabs/list')
r.html.render(sleep=1, keep_page=True) # 자바스크립트를 렌더링합니다.
print(r.html.html)

 

 

참고로 렌더링을 위해 크로미움을 사용하기 때문에 Requests-HTML 모듈을 설치할 때에 이를 함께 설치하는 과정을 거칩니다 :)

 

 

 

2. Xpath/CSS 셀렉터 지원

 

네이버 뉴스에서 '이니스프리 세일'을 검색하여 1개월 이내 + 최신순 정렬 옵션을 준 페이지를 예제로 설명하겠습니다 ^^

 

네이버 측에서 뉴스를 크롤링하기 어렵도록 하기 위하여 의도적으로 DOM 구조에 대해 일종의 난독화 처리를 했는데요 ㄷㄷ

 

기존의 Requests + BeautifulSoup 조합을 사용하면 번거로운 작업이 되겠지만, Requests-HTML을 이용하여 Xpath로 접근하면 상대적으로 간단하게 기사 제목을 파싱할 수 있어요!!

 

 

from requests_html import HTMLSession

s = HTMLSession()
r = s.get('https://search.naver.com/search.naver?where=news&query=%EC%9D%B4%EB%8B%88%EC%8A%A4%ED%94%84%EB%A6%AC%20%EC%84%B8%EC%9D%BC&sm=tab_srt&sort=1&photo=0&field=0&reporter_article=&pd=2&ds=2020.04.14&de=2020.05.14&docid=&nso=so%3Add%2Cp%3A1m%2Ca%3Aall&mynews=0&refresh_start=0&related=0')
news = []
for i in range(1, 11):
    title = r.html.xpath('//*[@id="sp_nws' + str(i) + '"]/dl/dt/a') # XPath를 통해 접근합니다.
    if len(title) == 0: # 10개 미만으로 검색되는 경우를 처리합니다.
        break
    news.append(title[0].text)
print(news)

 

 

이외에도 Requests-HTML에서는 원하는 요소에 접근할 수 있는 여러 메서드를 제공하고 있어요.

 

기존에 BeautifulSoup을 이용했어야 했던 영역의 상당 부분을 커버한다고 생각되네요 ^^

 

 

 

3. User-agent, 리다이렉트, 쿠키 등 측면에서의 비교 우위

 

앞서 말씀드린 바와 같이 Requests-HTML은 (1) Mocked user-agent, (2) Automatic following of redirects, (3) Connection–pooling and cookie persistence 등의 장점이 있어요!

 

정확히 어떠한 이유 때문인지는 제 수준에서 파악하지 못했지만, 아마도 위 셋 중에 한 개 이상의 이유 때문에 Requests를 이용한 로그인을 막아놓은 몇몇 사이트에서 Requests-HTML을 이용하여 로그인에 성공한 경험이 있네요 :)

(Requests를 이용할 때 headers에서 user-agent를 지정해도 로그인이 안 되던 사이트를, Requests-HTML을 이용하면 user-agent조차 지정하지 않아도 뚫리더군요 ㄷㄷ)

 

사실 로그인 문제는 Selenium으로 로그인한 후에 그 session을 Requests로 넘겨주면 해결되는 문제이긴 하지만요~

 

 

 

4. 마치며

 

이상에서 살펴본 바와 같이 기존의 Requests에 비해 Requests-HTML은 많은 장점을 가지고 있으며, 덕분에 보다 빠른 속도의 개발과 보다 빠른 속도의 크롤링이라는 두 마리의 토끼를 동시에 잡을 수 있습니다!

 

저같은 초보자도 기존에 Selenium에 의존하여 크롤링했던 많은 웹페이지들을 현재는 Requests-HTML을 이용하여 보다 간단하게 해결하고 있네요 :)

 

앞으로 이 프로젝트가 더욱 발전하기를 기원합니다! ^-^

 

알피쥐님 포함 5명이 추천

추천인 5

작성자
이니스프리 119 Lv. (2%) 4157560/115200000EXP

Make StudyForUs Great Again!

 

CSVpuymXAAAVVpd.jpg

댓글 8

OAUTH2
xpath는 확실한 장점이군요!
comment menu
2020.05.15. 08:21

신고

"OAUTH2님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → OAUTH2
profile image
옙 Selenium에서만 Xpath를 지원하고 BeautifulSoup에서는 지원을 하지 않아서 애매했는데 말이죠 ^-^
앞으로 Requests보다는 Requests-HTML을 보다 많이 이용할 것 같아요 :)
comment menu
2020.05.15. 10:54

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → OAUTH2
profile image

존재하지 않는 스티커입니다.

comment menu
2020.05.15. 10:56

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

GsusWeb
+1
내용이 전부 이해되는 것은 아니지만, 업그레이드 된 html이라는 말이겠죠?
요즘 무료 템플릿 긁어와서 홈피에 끼워 맞추는 중인데, php와 html가 연동이 안되는(?) 못하는 상황인 것 같아 하나의 과제였는데,
이글 보니 이런 문제도 곧 해결 되지 않을까 하는 막연한 기대를 합니다.
comment menu
2020.06.19. 08:26

신고

"GsusWeb님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → GsusWeb
profile image
옙 업그레이드된 Requests 모듈이라고 생각하시면 될듯요~! ^^

말씀하신 문제도 잘 해결되시길 기원할게요!!

그럼 즐거운 불금 되세요 :)
comment menu
2020.06.19. 10:13

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → 이니스프리
profile image

존재하지 않는 스티커입니다.

comment menu
2020.06.19. 10:13

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

GsusWeb → 이니스프리
+1
업그레이드 된 Requests 모듈!
학습의 정도는 이해와 반복이죠!
comment menu
2020.06.19. 12:55

신고

"GsusWeb님의 댓글"

이 댓글을 신고 하시겠습니까?

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

권한이 없습니다.
번호 제목 글쓴이 날짜 조회 수
29 [디지털포렌식전문가] 제21회 필기시험 합격 후기 9 image 이니스프리 이니스프리 23.10.29.16:11 3078
28 [Python] GIF 파일에 프로그레스바 삽입하기! (Adding progress bar into GIF) image 이니스프리 이니스프리 22.05.14.13:14 12996
27 [Python] 그누보드 자동 글 작성 + 멀티 파일 업로드 스크립트 1 image 이니스프리 이니스프리 21.05.16.09:32 23892
26 0. 행의 분리 및 결합 / 멀티라인 문자열 image 이니스프리 이니스프리 21.04.18.11:53 611
25 [Selenium] proxy를 사용하지 않고 개발자도구에서 Network 탭의 로그를 얻기 image 이니스프리 이니스프리 21.03.06.23:35 1819
24 [번외편 - 한컴한글] 스마트한 문서 작성을 위한 팁 (작성 중) 이니스프리 이니스프리 20.08.08.13:50 581
[Requests-HTML] Requests와 비교할 때의 장점! (네이버 뉴스 등 크롤링) 8 image 이니스프리 이니스프리 20.05.14.19:08 1668
22 22. [OpenPyXL] 엑셀 문서 저장하기 / 시트 추가하기 / 셀에 입력하기 14 image 이니스프리 이니스프리 20.02.02.00:46 5738
21 21. [OpenPyXL] 엑셀 문서를 열고 시트에서 셀의 값을 얻기 3 image 이니스프리 이니스프리 20.02.01.23:46 1506
20 [BeautifulSoup] 자식태그를 제거하기 - .decompose() & .extract() 10 image 이니스프리 이니스프리 20.01.16.00:07 9452
19 [python-telegram-bot] 4096자 글자수 제한을 우회하는 방법 image 이니스프리 이니스프리 20.01.12.11:25 2337
18 [Requests] Selenium을 이용한 Cloudflare의 우회 8 image 이니스프리 이니스프리 20.01.08.19:51 6576
17 9. [정리] 파이써닉한 파이썬 문법 팁 for COS Pro image 이니스프리 이니스프리 20.01.04.23:47 1147
16 [번외편] 네이버 동영상에서 자막을 파일로 추출하는 방법 2 image 이니스프리 이니스프리 19.12.25.22:34 5939
15 4. 문자열 처리 (2) - 문자열 조작에 대한 기본함수 및 메서드 1 image 이니스프리 이니스프리 19.12.12.02:27 753
14 6. 리스트와 관련된 기본함수 및 메서드 7 image 이니스프리 이니스프리 19.12.10.21:16 2217
13 3. 문자열 처리 (1) - 문자열 접근 및 검색방법 4 image 이니스프리 이니스프리 19.12.09.20:00 1362
12 [Selenium] Requests의 session을 Selenium으로 보내기 image 이니스프리 이니스프리 19.12.07.14:17 4911
11 1. 반복문 (1) - while 문 7 image 이니스프리 이니스프리 19.12.06.20:50 2658
10 (序) Python 강좌를 시작하며... 2 image 이니스프리 이니스프리 19.12.05.21:55 637