【问题标题】:How to get a correct session_id? (Scrapy, Python)如何获得正确的 session_id? (爬虫,Python)
【发布时间】:2020-11-03 18:55:43
【问题描述】:

有一个网址: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

它返回坐标。要获取坐标 - 它会执行 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()'''

您能否更正我的代码以获取坐标?

【问题讨论】:

    标签: python python-3.x web-scraping scrapy


    【解决方案1】:

    网站首先创建一个 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)
    

    【讨论】:

    • 弗兰克,非常感谢。你是怎么理解需要那个(OpenScriptMap)额外请求的?
    • 我只是检查RequestSessionFindValueLocation 之间的请求并尝试这些请求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多