使用会话中的Cookie的POST请求

时间:2018-08-23 12:40:48

标签: python python-requests

我正在尝试使用POST请求抓取网站以填写表格:

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,然后将所述cookie添加到POST请求的标头字典中。

但是,我仍然从POST请求中收到“服务器错误”页面。 任何人都可以了解为什么会发生这种情况?

1 个答案:

答案 0 :(得分:0)

requests.post接受cookie名称参数。使用它而不是直接在标头中发送cookie可能会解决此问题:

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逻辑,这些逻辑不会通过使用request.post来执行。在这种情况下,要解决此问题,您必须使用selenium来填写和提交表单。

请参阅有类似问题的Dynamic Data Web Scraping with Python, BeautifulSoup-未执行javascript。