python 파충류 requests-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 모듈 보다 더 강력 하고 새로운 기능 을 제공 했다 고 알려 줍 니 다!
  • JavaScript 지원
  • CSS 선택 기 지원(일명 jQuery 스타일,PyQuery 감사합니다)
  • Xpath 선택 기 지원
  • 사용자 정의 아 날로 그 User-agent(실제 웹 브 라 우 저 처럼 아 날로 그)
  • 자동 추적 재 정립
  • 연결 탱크 와 쿠키 의 지속 화
  • 비동기 요청 지원
  • 2 설치
    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 선택 기와 XPATH
    request-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.html2.원리
    레이 츠 대신 에 게 경 배 를 해 야 겠 어 요.조립 기술 을 너무 잘 해 요.실제로 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 선택 기
  • xpath
  • 
     # css         
     jobs = r.html.find("h1.call-to-action")
     # xpath   
     jobs = r.html.xpath("//h1[@class='call-to-action']")
    방법 명 은 매우 간단 하고 Python 의 우아 한 스타일 에 부합 되 며 이 두 가지 방식 에 대해 간단하게 설명 할 수 있 습 니 다.
    4.CSS 단순 규칙
  • 라벨 이름 h1
  • id 사용#id표시
  • class 사용.class_name표시
  • 술어:h1[prop=value]
  • 5.Xpath 간단 한 규칙
  • 경로// /
  • 태그 명
  • 술어[@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 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기