簡體   English   中英

如何獲得正確的 session_id? (Scrapy,Python)

[英]How to get a correct session_id? (Scrapy, Python)

有一個網址: https : //maps.leicester.gov.uk/map/Aurora.svc/run? inspect_query = QPPRN & inspect_value = ROH9385 & script =% 5CAurora%5Cw3%5CPLANNING%5Cw3PlanApp_MG.AuroraScript%24 & nocache56- f73ee- 87e7-42e82982370f&resize=總是

它返回坐標。 要獲取坐標 - 它執行 3 個請求(我假設):

  1. 上面提到的網址
  2. 請求 session_id
  3. 使用先前提到的 session_id 獲取坐標。

我在第二步得到 session_id,但這是錯誤的。 我無法使用它在步驟 3 中獲取坐標。 我怎么知道問題出在 session_id 上? 當我插入從瀏覽器獲取的 session_id 時 - 我的代碼工作正常並且接收到坐標。

以下是瀏覽器中的請求: 第一個請求

第二個請求

第三次請求

以下是瀏覽器的正確響應:

正確的回應

這就是我用我的代碼得到的:

錯誤的反應

這是我的代碼(用於 Scrapy 框架):

''' 導入 inline_requests

@inline_requests.inline_requests
def get_map_data(self, response):
    """ Getting map data. """

    map_referer = ("https://maps.leicester.gov.uk/map/Aurora.svc/run?inspect_query=QPPRN&"
        "inspect_value=ROH9385&script=%5CAurora%5Cw3%5CPLANNING%5Cw3PlanApp_MG.AuroraScript"
        "%24&nocache=f73eee56-45da-f708-87e7-42e82982370f&resize=always")

    response = yield scrapy.Request(
        url=map_referer,
        meta=response.meta,
        method='GET',
        dont_filter=True,
        )

    time_str = str(int(time.time()*1000))

    headers = {
        'Referer': response.url,
        'Accept': 'application/javascript, */*; q=0.8',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
        'Host': 'maps.leicester.gov.uk',
        'Sec-Fetch-Dest': 'script',
        'Sec-Fetch-Mode': 'no-cors',
        'Sec-Fetch-Site': 'same-origin',
        'Connection': 'keep-alive',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36'
        }

    response.meta['handle_httpstatus_all'] = True

    url = ( 'https://maps.leicester.gov.uk/map/Aurora.svc/RequestSession?userName=inguest'
            '&password=&script=%5CAurora%5Cw3%5CPLANNING%5Cw3PlanApp_MG.AuroraScript%24&'
            f'callback=_jqjsp&_{time_str}=' )

    reqest_session_response = yield scrapy.Request(
        url=url,
        meta=response.meta,
        method='GET',
        headers=headers,
        dont_filter=True,
        )

    session_id = re.search(r'"SessionId":"([^"]+)', reqest_session_response.text)
    session_id = session_id.group(1) if session_id else None

    print(8888888888888)
    print(session_id)

    # session_id = '954f04e2-e52c-4dd9-9046-f3f013d3f633'

    # pprn = item.get('other', {}).get('PPRN')
    pprn = 'ROH9385' # hard coded for the current page

    if session_id and pprn:
        time_str = str(int(time.time()*1000))

        url = ('https://maps.leicester.gov.uk/map/Aurora.svc/FindValue'
                f'Location?sessionId={session_id}&value={pprn}&query=QPPRN&callback=_jqjsp'
                f'&_{time_str}=')

        coords_response = yield scrapy.Request(
            url = url,
            method='GET',
            meta=reqest_session_response.meta,
            dont_filter = True,
            )

        print(coords_response.text)
        breakpoint()'''

你能更正我的代碼以便它可以得到坐標嗎?

該網站首先創建一個 sessionId,然后使用 sessionId 在服務器上創建一個層(我猜)。 然后就可以開始請求了,不然就找不到那個sessionId下的地圖圖層了。

import requests

url = "https://maps.leicester.gov.uk/map/Aurora.svc/RequestSession?userName=inguest&password=&script=%5CAurora%5Cw3%5CPLANNING%5Cw3PlanApp_MG.AuroraScript%24"
res = requests.get(url, verify=False).json()
sid = res["Session"]["SessionId"]

url = f"https://maps.leicester.gov.uk/map/Aurora.svc/OpenScriptMap?sessionId={sid}"
res = requests.get(url, verify=False)

url = f"https://maps.leicester.gov.uk/map/Aurora.svc/FindValueLocation?sessionId={sid}&value=ROH9385&query=QPPRN"
res = requests.get(url, verify=False).json()
print(res)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM