>source

여기에서 프로그램 데이터를 반환하는 API에 액세스하려고합니다.페이지 아래로 스크롤하면 새 타일이 화면에 표시됩니다. Chrome 도구를 살펴보면 API가 호출되는 것을 발견하고 다음 요청 스크립트를 작성했습니다.

import requests
session = requests.session()
url = 'https://ie.api.atom.nowtv.com/adapter-atlas/v3/query/node?slug=/entertainment/collections/all-entertainment&represent=(items[take=60](items(items[select_list=iceberg])))'
session.headers = {
'Host': 'https://www.nowtv.com',
'Connection': 'keep-alive',
'Accept': 'application/json, text/javascript, */*',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36',
'Referer': 'https://www.nowtv.com',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'en-GB,en-US;q=0.9,en;q=0.8'
}
scraper = cloudscraper.create_scraper(sess=session)
r = scraper.get(url)
data = r.content
print(data)
session.close()

다음 만 반환됩니다.

b'<HTML><HEAD>\n<TITLE>Invalid URL</TITLE>\n</HEAD><BODY>\n<H1>Invalid URL</H1>\nThe requested URL "&#91;no&#32;URL&#93;", is invalid.<p>\nReference&#32;&#35;9&#46;3c0f0317&#46;1608324989&#46;5902cff\n</BODY></HTML>\n'

문제는 중괄호로 묶인 URL의 끝 부분이라고 가정합니다. 그러나 Requests 호출에서이를 처리하는 방법을 잘 모르겠습니다. 누구든지 올바른 구문을 제공 할 수 있습니까?

감사

  • 답변 # 1

    문제는 Host 세션 헤더 값, 설정하지 마십시오.

    <시간 />

    충분합니다. 그러나 몇 가지 추가 작업도 수행했습니다.

    추가 X-* 헤더 :

    session.headers.update(**{
        'X-SkyOTT-Proposition': 'NOWTV',
        'X-SkyOTT-Language': 'en',
        'X-SkyOTT-Platform': 'PC',
        'X-SkyOTT-Territory': 'GB',
        'X-SkyOTT-Device': 'COMPUTER'
    })
    
    

    XHR 헤더를 설정하지 않고 더 넓은 Accept 헤더 값 :

    text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    
    

    나는 또한 사용했다 params GET 매개 변수의 경우-할 필요가 없다고 생각합니다. 더 깨끗합니다.

    In [33]: url = 'https://ie.api.atom.nowtv.com/adapter-atlas/v3/query/node'
     In [34]: response = session.get(url, params={
                  'slug': '/entertainment/collections/all-entertainment', 
                  'represent': '(items[take=60,skip=2340](items(items[select_list=iceberg])))'
              }, headers={
                  'Accept': 'application/json, text/plain, */*', 
                  'X-Requested-With':'XMLHttpRequest'
              })
     In [35]: response
     Out[35]: <Response [200]>
     In [36]: response.text
     Out[36]: '{"links":{"self":"/adapter-atlas/v3/query/node/e5b0e516-2b84-11e9-b860-83982be1b6a6"},"id":"e5b0e516-2b84-11e9-b860-83982be1b6a6","type":"CATALOGUE/COLLECTION","segmentId":"","segmentName":"default","childTypes":{"next_items":{"nodeTypes":["ASSET/PROGRAMME","CATALOGUE/SERIES"],"count":68},"items":{"nodeTypes":["ASSET/PROGRAMME","CATALOGUE/SERIES"],"count":2376},"curation-config":{"nodeTypes":["CATALOGUE/CURATIONCONFIG"],"count":1}},"attributes":{"childNodeTyp
               ...
    
    

관련 자료

  • 이전 Haskell에서 Dynamic/fromDynamic을 사용할 때 제약 조건을 복구 할 수 있습니까?
  • 다음 c# - 문자열에서 부동 숫자를 추출하지만 동일한 문자열에서 다른 숫자를 제외하는 방법