代码之家  ›  专栏  ›  技术社区  ›  jim jarnac

使用会话中的cookie发布请求

  •  1
  • jim jarnac  · 技术社区  · 6 年前

    我正在尝试使用POST request来创建一个网站来填写表单:

    http://www.planning2.cityoflondon.gov.uk/online-applications/search.do?action=advanced

    在python中,如下所示:

    import requests
    import webbrowser
    
    headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'en-US,en;q=0.9',
    'Cache-Control': 'max-age=0',
    'Connection': 'keep-alive',
    'Cookie': 'JSESSIONID=OwXG0Hkxj+X9ELygHZa-aLQ5.undefined; _ga=GA1.3.1911942552.',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Host': 'www.planning2.cityoflondon.gov.uk',
    'Origin': 'http://www.planning2.cityoflondon.gov.uk',
    'Referer': 'http://www.planning2.cityoflondon.gov.uk/online-applications/search.do?action=advanced',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
    }
    
    data = {
    'searchCriteria.developmentType': '002',
    'date(applicationReceivedStart)': '01/08/2000',
    'date(applicationReceivedEnd)': '01/08/2018'
    }
    
    url = 'http://www.planning2.cityoflondon.gov.uk/online-applications/advancedSearchResults.do?action=firstPage'
    test_file = 'planning_app.html'
    
    with requests.Session() as session:
        r = session.post(url, headers = headers, data = data)
        with open (test_file, 'w') as file:
            file.write(r.text)
        webbrowser.open(test_file)
    

    从重新打开的页面中可以看到 webbrowser ,这将给出过时cookie的错误。

    为此,我需要手动转到网页,在打开“网络”选项卡上google chrome的“检查”面板时执行查询,查看“请求”标题中的cookie并将cookie复制粘贴到我的代码中。当然,这会一直持续到cookie再次过期。

    我尝试通过执行以下操作来自动检索cookie:

    headers_get = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'en-US,en;q=0.9',
    'Cache-Control': 'max-age=0',
    'Connection': 'keep-alive',
    'Host': 'www.planning2.cityoflondon.gov.uk',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
    }
    
    with requests.Session() as session:
        c = session.get('http://www.planning2.cityoflondon.gov.uk/online-applications/', headers = headers_get)
        headers['Cookie'] = 'JSESSIONID=' + list(c.cookies.get_dict().values())[0]
        r = session.post(url, headers = headers, data = data)
        with open (test_file, 'w') as file:
            file.write(r.text)
        webbrowser.open(test_file)
    

    我希望它能正常工作,因为它只是自动执行我的手动操作: 转到GET请求的页面,从中获取cookie将said cookie添加到POST请求的headers dict。

    有谁能理解为什么会这样?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Andriy Ivaneyko    6 年前

    这个 requests.post

    with requests.Session() as session:
        c = session.get('http://www.planning2.cityoflondon.gov.uk/online- applications/', headers = headers_get)
        # Also, you can set with cookies=session.cookies
        r = session.post(url, headers = headers, data = data, cookies=c.cookies)
    

    基本上,我认为站点上可能有一些javascript逻辑,这不是使用requests.post执行的。如果是这样的话,要解决这个问题 selenium 用于填写和提交表格。

    请看 Dynamic Data Web Scraping with Python, BeautifulSoup