• 목록
  • 아래로
  • 위로

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. (0%) 1876250/115200000EXP

당분간 일신상의 사정으로 쪽지나 댓글로 답변을 드리기 어렵습니다. 죄송합니다.

 

CSVpuymXAAAVVpd.jpg

댓글 7

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 → 이니스프리
업그레이드 된 Requests 모듈!
학습의 정도는 이해와 반복이죠!
comment menu
2020.06.19. 12:55

신고

"GsusWeb님의 댓글"

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

권한이 없습니다.
번호 제목 글쓴이 날짜 조회 수
29 [Python] 그누보드 자동 글 작성 + 멀티 파일 업로드 스크립트 1 image 이니스프리 이니스프리 21.05.16.09:32 23690
28 [Python] GIF 파일에 프로그레스바 삽입하기! (Adding progress bar into GIF) image 이니스프리 이니스프리 22.05.14.13:14 12581
27 [BeautifulSoup] 자식태그를 제거하기 - .decompose() & .extract() 10 image 이니스프리 이니스프리 20.01.16.00:07 9249
26 [Pillow] 파이썬 Pillow 라이브러리를 이용하여 이미지의 배경을 transparent하게 만들기 11 image 이니스프리 이니스프리 19.08.04.13:40 7801
25 [Requests] Selenium을 이용한 Cloudflare의 우회 8 image 이니스프리 이니스프리 20.01.08.19:51 6245
24 [번외편] 네이버 동영상에서 자막을 파일로 추출하는 방법 2 image 이니스프리 이니스프리 19.12.25.22:34 5598
23 22. [OpenPyXL] 엑셀 문서 저장하기 / 시트 추가하기 / 셀에 입력하기 14 image 이니스프리 이니스프리 20.02.02.00:46 5577
22 [Selenium] Requests의 session을 Selenium으로 보내기 image 이니스프리 이니스프리 19.12.07.14:17 4666
21 [Selenium] Selenium에서 send_keys를 막아놓은 경우 해결책 이니스프리 이니스프리 19.07.04.05:52 4342
20 [번외편 - 구글뉴스] 리뉴얼된 구글뉴스에서 RSS 피드를 생성하는 방법 6 image 이니스프리 이니스프리 18.10.07.17:58 3532
19 [번외편 - 유튜브] Youtube API를 이용하거나 또는 이용하지 않고 채널ID를 추출하는 방법 2 image 이니스프리 이니스프리 19.07.16.17:55 2745
18 [번외편 - 아미나] 그누보드/아미나에서 게시글의 날짜를 최종수정일로 변경하고, 목록스킨 및 위젯을 최종수정일 순으로 정렬하기 2 image 이니스프리 이니스프리 18.11.11.22:36 2572
17 1. 반복문 (1) - while 문 7 image 이니스프리 이니스프리 19.12.06.20:50 2501
16 [디지털포렌식전문가] 제21회 필기시험 합격 후기 9 image 이니스프리 이니스프리 23.10.29.16:11 2475
15 6. 리스트와 관련된 기본함수 및 메서드 7 image 이니스프리 이니스프리 19.12.10.21:16 2090
14 [python-telegram-bot] 4096자 글자수 제한을 우회하는 방법 image 이니스프리 이니스프리 20.01.12.11:25 2049
13 [Selenium] proxy를 사용하지 않고 개발자도구에서 Network 탭의 로그를 얻기 image 이니스프리 이니스프리 21.03.06.23:35 1555
[Requests-HTML] Requests와 비교할 때의 장점! (네이버 뉴스 등 크롤링) 7 image 이니스프리 이니스프리 20.05.14.19:08 1420
11 [번외편 - 법률] 현행 저작권법 제30조(사적이용을 위한 복제)에 대하여 - 음원 다운로더의 처벌과 관련하여 6 이니스프리 이니스프리 18.12.07.14:16 1313
10 21. [OpenPyXL] 엑셀 문서를 열고 시트에서 셀의 값을 얻기 3 image 이니스프리 이니스프리 20.02.01.23:46 1269