- 8
- 이니스프리
- 조회 수 1508
안녕하세요?
모처럼 짬이 나서 오래간만에 강좌 게시판에 글을 올리네요 :)
오늘은 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
작성자
댓글 8
![comment menu](/modules/board/skins/comely_board/images/icn_more.png)
![profile image](/files/member_extra_info/profile_image/819/059/59819.png?t=1717193427)
앞으로 Requests보다는 Requests-HTML을 보다 많이 이용할 것 같아요 :)
![comment menu](/modules/board/skins/comely_board/images/icn_more.png)
![profile image](/files/member_extra_info/profile_image/819/059/59819.png?t=1717193427)
존재하지 않는 스티커입니다.
![comment menu](/modules/board/skins/comely_board/images/icn_more.png)
요즘 무료 템플릿 긁어와서 홈피에 끼워 맞추는 중인데, php와 html가 연동이 안되는(?) 못하는 상황인 것 같아 하나의 과제였는데,
이글 보니 이런 문제도 곧 해결 되지 않을까 하는 막연한 기대를 합니다.
![comment menu](/modules/board/skins/comely_board/images/icn_more.png)
![profile image](/files/member_extra_info/profile_image/819/059/59819.png?t=1717193427)
말씀하신 문제도 잘 해결되시길 기원할게요!!
그럼 즐거운 불금 되세요 :)
![comment menu](/modules/board/skins/comely_board/images/icn_more.png)
![profile image](/files/member_extra_info/profile_image/819/059/59819.png?t=1717193427)
존재하지 않는 스티커입니다.
![comment menu](/modules/board/skins/comely_board/images/icn_more.png)
학습의 정도는 이해와 반복이죠!
![comment menu](/modules/board/skins/comely_board/images/icn_more.png)
![profile image](/files/member_extra_info/profile_image/819/059/59819.png?t=1717193427)