python 파충류 requests-html 사용
17774 단어 pythonrequests-html파충
Python 에 아주 유명한 HTTP 라 이브 러 리 가 있 습 니 다.requests다 들 들 어 보 셨 을 거 라 고 믿 습 니 다.사용 해 본 사람들 은 모두 시원 하 다 고 합 니 다!현재 requests 라 이브 러 리 의 저 자 는 새로운 라 이브 러 리 를 발 표 했 습 니 다.requests-html라 고 합 니 다.이름 을 봐 도 알 수 있 습 니 다.이것 은 HTML 을 분석 하 는 라 이브 러 리 입 니 다.requests 기능 외 에 도 더욱 강력 한 기능 을 추 가 했 습 니 다.requests 보다 더 시원 하 게 사용 할 수 있 습 니 다!이제 우리 그것 을 소개 합 시다.
#
'''
This library intends to make parsing HTML (e.g. scraping the web) as simple and intuitive as possible.
If you're interested in financially supporting Kenneth Reitz open source, consider visiting this link. Your support helps tremendously with sustainability of motivation, as Open Source is no longer part of my day job.
When using this library you automatically get:
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.
ConnectionCpooling and cookie persistence.
The Requests experience you know and love, with magical parsing abilities.
Async Support
'''
홈 페이지 는 원래 의 requests 모듈 보다 더 강력 하고 새로운 기능 을 제공 했다 고 알려 줍 니 다!requests-html 를 설치 하 는 것 은 매우 간단 합 니 다.명령 한 줄 이면 할 수 있 습 니 다.주의해 야 할 것 은 requests-html 는 Python 3.6 이상 의 버 전 만 지원 하기 때문에 오래된 버 전의 Python 을 사용 하 는 학생 들 은 Python 버 전 을 업데이트 해 야 합 니 다.
# pip3 install requests-html
3.requests-html 를 어떻게 사용 합 니까?우리 가 파충류 프로그램 을 배 울 때 가장 많이 사용 하 는 요청 라 이브 러 리 는 requests 와 urllib 입 니 다.문 제 는 이 가방 들 이 목표 사이트 에 가서 요청 을 보 내 고 응답 데 이 터 를 얻 는 방법 만 제공 하 는 것 입 니 다.그 다음 에 bs4 나 xpath 분석 라 이브 러 리 를 이용 하여 우리 가 필요 로 하 는 수 거 를 추출 할 수 있 습 니 다.
기 존 파충류 의 요청 과 해석
import requests
from bs4 import BeautifulSoup
url = 'http://www.zuihaodaxue.cn/'
HEADERS = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36'
}
response = requests.get(url, headers=HEADERS)
response.encoding = 'gbk'
# print(response.status_code)
print(response.text)
soup = BeautifulSoup(response.text, 'lxml')
#
post_rankings = soup.find_all(name='article', attrs={"class": "post_ranking"})
#
for post_ranking in post_rankings:
new = post_ranking.find(name='div', attrs={"class": 'post_summary'})
print(new.text)
그리고 requests-html 에서 한 걸음 만 있 으 면 완성 할 수 있 고 js 렌 더 링 을 직접 할 수 있 습 니 다!requests 의 작성 자Kenneth Reitz가 개발 한 requests-html 파충류 패 키 지 는 기 존의 프레임 워 크 PyQuery,Requests,lxml,beautifulsoup 4 등 라 이브 러 리 를 바탕 으로 2 차 패 키 지 를 실 시 했 고 저 자 는 Requests 의 간단 하고 편리 하 며 강력 함 을 한 번 더 업그레이드 했다.requests-html 와 다른 해석 HTML 라 이브 러 리 의 가장 큰 차이 점 은 HTML 해석 라 이브 러 리 가 일반적으로 전용 이기 때문에 우 리 는 다른 HTTP 라 이브 러 리 로 먼저 웹 페이지 를 다운로드 한 다음 HTML 분석 라 이브 러 리 에 전송 해 야 한다.한편,requests-html 는 이 기능 을 가지 고 있 기 때문에 웹 페이지 를 오 르 는 데 매우 편리 하 다.
1.기본 사용
from requests_html import HTMLSession
#
session = HTMLSession()
# get
sina = session.get('https://news.sina.com.cn/')
# print(sina.status_code)
sina.encoding = 'utf-8'
# , requests
print(sina.text)
2,링크 가 져 오기(links 와 abolutelinks)링크 반환 결과
absolute_링크 반환 결과
from requests_html import HTMLSession
#
session = HTMLSession()
# get
jd = session.get('https://jd.com/')
# , set
print(jd.html.links)
print('*' * 1000)
# , absolute_links
print(jd.html.absolute_links)
3.CSS 선택 기와 XPATHrequest-html 은 HTML 요 소 를 선택 하기 위해 CSS 선택 기와 XPATH 두 가지 문법 을 지원 합 니 다.먼저 CSS 선택 기 문법 을 살 펴 보 겠 습 니 다.HTML 의 find 함 수 를 사용 하여 요 소 를 찾 아야 합 니 다.
'''
CSS and XPATH
1. css Element
2. Element
3. Element attributes
4. Element HTML
5. Element Element ,
6. search
7. XPath
8. Element
'''
from requests_html import HTMLSession
session = HTMLSession()
url = "https://www.qiushibaike.com/text/"
#
obj = session.get(url)
# 1. css Element
id content-left div ,
content = obj.html.find('div#content-left', first=True)
# 2. Element
content
print(content.text)
# 3. Element attributes
content
print(content.attrs)
# 4. Element HTML
html = content.html
print(html)
# 5. Element Element ,
a_s = content.find('a')
print(a_s)
print(len(a_s)) # 79
# a
for a in a_s:
# a href
href = a.attrs['href']
if href.startswith('/'):
url = 'https://www.qiushibaike.com' + href
print(url)
# 6. search
{} ,
text = obj.html.search(' {} ')[0] # " " " "
text = obj.html.search(' {} ')[0] #
print(text)
print('*' * 1000)
# 7. XPath
a_s = obj.html.xpath('//a') # html a
for a in a_s:
href = a.attrs['href']
# // url
if href.startswith('continue# / )
elif href.startswith('/')
print('https://www.qiushibaike.com'+href)
# 8. Element (containing)
_ _ - title
:
title = obj.html.find('title', containing=' _ _ - ')
print(title)
4.자 바스 크 립 트 지원자 바스 크 립 트 를 지원 하 는 것 은 작가 가 업 데 이 트 를 한 후에 가장 강 한 곳 이 라 고 생각 합 니 다.그러나 render 를 처음 실행 할 때 chromeium 을 다운로드 한 다음 에 이 를 통 해 js 코드 를 실행 해 야 합 니 다.
1.render 의 사용
from requests_html import HTMLSession
session = HTMLSession()
url = 'http://www.win4000.com/'
obj = session.get(url)
obj.encoding = 'utf-8'
obj.html.render()
메모:render()방법 을 처음 실행 할 때 Chromium 을 홈 디 렉 터 리 에 다운로드 합 니 다(예:~/.pypeteer/).이런 상황 은 단 한 번 발생 한다.2.Chromeium 문제 다운로드
외국 사이트 에서 다운로드 한 지 몇 분 밖 에 안 됐 는데 3%밖 에 안 돼 서 너무 느 려 요.그래서 국내 미 러 를 통 해 다운로드 해 야 합 니 다!다음 과 같은 몇 단계 가 필요 합 니 다.
Chrome 수 동 다운로드
먼저 국내 소스 에 가서 자신 이 필요 로 하 는 버 전 을 다운로드 하고 주소:https://npm.taobao.org/mirrors/chromium-browser-snapshots/
chromeium 수정downloader.py 파일
다운로드 후 압축 을 풀 고 python 설치 디 렉 터 리 에 있 는\Lib\site-packages\\pyppeter 디 렉 터 리 에 들 어가 chromium 을 엽 니 다.downloader.py 파일.
#
'''
chromiumExecutable = {
'linux': DOWNLOADS_FOLDER / REVISION / 'chrome-linux' / 'chrome',
'mac': (DOWNLOADS_FOLDER / REVISION / 'chrome-mac' / 'Chromium.app' /
'Contents' / 'MacOS' / 'Chromium'),
'win32': DOWNLOADS_FOLDER / REVISION / 'chrome-win32' / 'chrome.exe',
'win64': DOWNLOADS_FOLDER / REVISION / 'chrome-win32' / 'chrome.exe',
}
'''
from pyppeteer import __chromium_revision__, __pyppeteer_home__
DOWNLOADS_FOLDER = Path(pyppeteer_home) / 'local-chromium'
REVISION = os.environ.get('PYPPETEER_CHROMIUM_REVISION', chromium_revision)
#
print(DOWNLOADS_FOLDER)
print(REVISION)
'''
:chromium :C:\Users\Ray\AppData\Local\pyppeteer\pyppeteer\local-chromium\575458\chrome-win32\chrome.exe
, chrome-win32 , chromium ,
'''
사용자 정의 사용자 에이전트 5 개일부 사 이 트 는 User-agent 를 사용 하여 클 라 이언 트 유형 을 식별 하고 가끔 은 UA 를 위조 하여 일부 조작 을 실현 해 야 한다.문 서 를 보면
HTMLSession
의 많은 요청 방법 에 추가 적 인 매개 변수**kwargs
가 있 음 을 알 수 있 습 니 다.이 매개 변 수 는 바 텀 요청 에 추가 적 인 파 라 메 터 를 전달 하 는 데 사 용 됩 니 다.우 리 는 먼저 사이트 에 요청 을 보 내 서 돌아 오 는 사이트 정 보 를 보 았 다.
from requests_html import HTMLSession
# pprint
from pprint import pprint
import json
get_url = 'http://httpbin.org/get'
session = HTMLSession()
# headers
res = session.get(get_url)
pprint(json.loads(res.html.html))
# user-agent
ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0'
post_url = 'http://httpbin.org/get'
res = session.get(post_url, headers={'user-agent': ua})
pprint(json.loads(res.html.html))# header 。
6 아 날로 그 폼 제출(POST) HTMLSession
전체 HTTP 방법 은 get,post,delete 등 을 포함 하여 HTTP 의 각 방법 에 대응 합 니 다.
#
r = session.post('http://httpbin.org/post', data={'username': 'tank_jam', 'password': 'tank9527'})
pprint(json.loads(r.html.html))
''' #
{'args': {},
'data': '',
'files': {},
'form': {'password': 'tank9527', 'username': 'tank_jam'},
'headers': {'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Content-Length': '35',
'Content-Type': 'application/x-www-form-urlencoded',
'Host': 'httpbin.org',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) '
'AppleWebKit/603.3.8 (KHTML, like Gecko) '
'Version/10.1.2 Safari/603.3.8'},
'json': None,
'origin': '112.65.61.109, 112.65.61.109',
'url': 'https://httpbin.org/post'}
'''
7 비동기 요청 지원requests-html 내부 에 aynsc 비동기 요청 기능 을 밀봉 하여 파충류 의 효율 을 높 일 수 있 습 니 다.
from requests_html import AsyncHTMLSession
from requests_html import HTMLSession
import time
#
async_session = AsyncHTMLSession()
async def get_baidu():
url = 'https://www.baidu.com/'
res = await async_session.get(url)
print(res.html.absolute_links)
async def get_sougou():
url = 'https://www.sogou.com/'
res = await async_session.get(url)
print(res.html.links)
start_time = time.time()
async_session.run(get_baidu, get_sougou)
print(' :', time.time() - start_time)
#
session = HTMLSession()
start_time = time.time()
res = session.get('https://www.baidu.com/')
print(res.html.links)
res = session.get('https://www.sogou.com/')
print(res.html.absolute_links)
print(' :', time.time() - start_time)
1.시작Python 에서 웹 페이지 를 분석 할 수 있 는 라 이브 러 리 는 매우 많 으 며,흔히 볼 수 있 는 것 은 BeautifulSoup 과 lxml 등 이 있다.인터넷 에서 파충 류 를 하 는 글 은 보통 Beautiful Soup 이라는 라 이브 러 리 를 소개 합 니 다.저도 평소에 이 라 이브 러 리 를 자주 사용 합 니 다.최근 에 Xpath 를 많이 사용 해서 Beautiful Soup 을 사용 하 는 것 이 익숙 하지 않 습 니 다.오래 전부터 Reitz 대신 에 Requests-HTML 이라는 라 이브 러 리 가 생 겼 다 는 것 을 알 고 관심 이 없 었 습 니 다.이번 에는 나 쁜 기회 라 고 할 수 있 습 니 다.
pip install requests-html
을 사용 하여 설치 합 니 다.손 은 Reitz 의 다른 라 이브 러 리 와 마찬가지 로 쉽 고 간단 합 니 다.
from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://www.python.org/jobs/')
이 라 이브 러 리 는 requests 라 이브 러 리 에서 이 루어 졌 습 니 다.r 가 얻 은 결 과 는 Response 대상 아래 의 하위 클래스 이 고 여러 개html
의 속성 입 니 다.그래서 requests 라 이브 러 리 의 응답 대상 은 어떤 조작 을 할 수 있 습 니까?이 r 도 가능 합 니 다.웹 페이지 를 분석 하려 면 응답 대상 의 html 속성 을 직접 가 져 옵 니 다:r.html
2.원리레이 츠 대신 에 게 경 배 를 해 야 겠 어 요.조립 기술 을 너무 잘 해 요.실제로 HTML 세 션 은 requests.Session 이라는 핵심 클래스 를 계승 한 다음 에 requests.Session 클래스 의 requests 방법 을 바 꾸 어 자신의 HTML Response 대상 으로 돌아 가 는 것 입 니 다.이 클래스 는 requests.Response 를 계승 하 는 것 입 니 다.하나의
_from_response
방법 으로 인 스 턴 스 를 구성 할 뿐 입 니 다.
class HTMLSession(requests.Session):
# request , HTMLResponse
def request(self, *args, **kwargs) -> HTMLResponse:
r = super(HTMLSession, self).request(*args, **kwargs)
return HTMLResponse._from_response(r, self)
class HTMLResponse(requests.Response):
#
@classmethod
def _from_response(cls, response, session: Union['HTMLSession', 'AsyncHTMLSession']):
html_r = cls(session=session)
html_r.__dict__.update(response.__dict__)
return html_r
그 다음 에 HTML Response 에서 속성 방법 html 를 정의 하면 html 속성 을 통 해 접근 할 수 있 습 니 다.즉,PyQuery 를 조립 하여 하 는 것 입 니 다.핵심 적 인 해석 류 도 대부분 PyQuery 와 lxml 를 사용 하여 해석 하고 이름 을 간소화 하 는 것 이 좋 습 니 다.3.요소 포 지 셔 닝
요소 포 지 셔 닝 은 두 가지 방식 을 선택 할 수 있 습 니 다.
css 선택 기
# css
jobs = r.html.find("h1.call-to-action")
# xpath
jobs = r.html.xpath("//h1[@class='call-to-action']")
방법 명 은 매우 간단 하고 Python 의 우아 한 스타일 에 부합 되 며 이 두 가지 방식 에 대해 간단하게 설명 할 수 있 습 니 다.4.CSS 단순 규칙
#id
표시.class_name
표시h1[prop=value]
// /
:: [ ]
jobs.text
jobs.full_text
원소 속성 가 져 오기:
attrs = jobs.attrs
value = attrs.get("key")
또한 패턴 을 통 해 대응 하 는 내용 과 일치 할 수 있 습 니 다.
##
r.html.search("Python {}")
r.html.search_all()
이 기능 은 보기에 비교적 닭 갈비 같 아서 깊이 연구 하여 최적화 시 킬 수 있 으 며,github 에 섞 어 제출 할 수 있 을 지도 모른다 고 말 할 수 있다.6.인성 화 된 조작
일부 기초 조작 을 제외 하고 이 라 이브 러 리 는 인성 화 된 조작 도 제공 했다.예 를 들 어 웹 페이지 의 모든 하이퍼링크 를 원 클릭 으로 가 져 오 는 것 은 전체 역 의 파충류 에 게 복음 이 어야 하고 URL 관리 가 비교적 편리 하 다.
r.html.absolute_links
r.html.links
내용 페이지 는 보통 페이지 로 나 뉘 어 져 있 습 니 다.한 번 에 많이 캡 처 할 수 없습니다.이 라 이브 러 리 는 페이지 정 보 를 얻 을 수 있 습 니 다.
print(r.html)
#
for url in r.html:
print(url)
결 과 는 다음 과 같다.
# print(r.html)
<HTML url='https://www.python.org/jobs/'>
# for
<HTML url='https://www.python.org/jobs/'>
<HTML url='https://www.python.org/jobs/?page=2'>
<HTML url='https://www.python.org/jobs/?page=3'>
<HTML url='https://www.python.org/jobs/?page=4'>
<HTML url='https://www.python.org/jobs/?page=5'>
교체 기 를 통 해 스마트 발견 페이지 를 실현 했다.이 교체 기 안 에는_next
라 는 방법 으로 소스 코드 를 붙 여 느낀다.
def get_next():
candidates = self.find('a', containing=next_symbol)
for candidate in candidates:
if candidate.attrs.get('href'):
# Support 'next' rel (e.g. reddit).
if 'next' in candidate.attrs.get('rel', []):
return candidate.attrs['href']
a 태그 에 지정 한 텍스트 가 있 는 지 찾 아 다음 페이지 가 있 는 지 판단 합 니 다.보통 우리 의 다음 페이지 는
또는
를 통 해 안내 합 니 다.그 는 이 표 지 를 이용 하여 판단 합 니 다.기본 값 은 목록 형식 으로 전역 이 존재 합 니 다:['next', 'more', 'older']
.나 는 개인 적 으로 이런 방식 이 매우 융통성 이 없고 확장 성 이 거의 없다 고 생각한다.관심 있 는 것 은 github 에 코드 최적화 를 제출 할 수 있 습 니 다.7.js 불 러 오기
현재 js 의 비동기 로 딩 을 고려 한 것 일 수도 있 습 니 다.이 라 이브 러 리 는 js 실행 을 지원 할 때 공식 설명 은 다음 과 같 습 니 다.
Reloads the response in Chromium, and replaces HTML contentwith an updated version, with JavaScript executed.
사용 이 매우 간단 합 니 다.다음 과 같은 방법 을 직접 호출 합 니 다.
r.html.render()
처음 사용 할 때 는 Chromium 을 다운로드 하지만 국내 에 서 는 알 잖 아 요.어떻게 든 내 려 보 세 요.다운로드 기다 리 지 마 세 요.render 함 수 는 js 스 크 립 트 를 사용 하여 페이지 를 조작 할 수 있 습 니 다.스크롤 작업 은 단독으로 인 자 를 만 들 었 습 니 다.이것 은 로 딩 등 새로운 페이지 에 매우 우호 적 입 니 다.8.총화
Reitz 대신 이 디자인 한 것 은 예전 과 같이 간단 하고 쓰기 좋 습 니 다.자신 이 많이 하지 않 고 대부분 다른 사람의 물건 으로 조립 하여 api 를 간소화 합 니 다.인간 적 이 네.하지만 공간 을 최적화 하 는 곳 도 있 습 니 다.관심 과 정력 이 있 는 어린이 신발 이 github 에 가서 이 프로젝트 를 주목 하고 싶 습 니 다.
python 파충류 requests-html 사용 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 python requests-html 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.