在python中使用Requests库进行抓取时管理会话

时间:2016-07-23 08:16:27

标签: python asp.net python-requests screen-scraping robobrowser

在抓页时,我无法创建和保留新会话。我使用Requests库在我的脚本中启动一个会话,然后将值解析为Web表单。然而,它正在返回一个"你的会话已超时"页。

这是我的来源:

import requests

session = requests.Session()

params = {'Rctl00$ContentPlaceHolder1$txtName': 'Andrew'}
r = session.post("https://www.searchiqs.com/NYALB/SearchResultsMP.aspx", data=params)
print(r.text)

我要搜索的网址是https://www.searchiqs.com/NYALB/SearchAdvancedMP.aspx

我正在寻找名为" Andrew"的Party 1名称。我已将包含此搜索框的表单元素标识为' Rctl00 $ ContentPlaceHolder1 $ txtName'。动作网址是SearchResultsMP.aspx。

当我从浏览器中执行此操作时,它会显示结果的第一页。当我在终端中执行此操作时,它会为我提供会话过期页面。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

首先,我将向您推荐与requests Python模块中的会话使用相关的高级文档。

http://docs.python-requests.org/en/master/user/advanced/

我还注意到,在sessions.post调用中导航到基本网址会重定向到:

https://www.searchiqs.com/NYALB/InvalidLogin.aspx?InvLogInCode=OldSession%2007/24/2016%2004:19:37%20AM

我"黑客攻击"要导航到的URL:

https://www.searchiqs.com/NYALB/

...请注意,如果我点击该页面上的Show Login Fields链接,系统会显示一个表单,其中会显示User IDPassword的提示。您尝试以编程方式进行搜索可能会失败,因为您尚未进行任何类型的身份验证。它可能在您的浏览器中有效,因为您已被允许通过先前已完成并可能已忘记的某些身份验证或某些服务器端访问规则(根据某些条件不要求这样做)来访问此浏览器

在本地解释器中运行这些命令,我​​可以看到网站所有者不愿意返回指示auth失败的状态代码。如果您选中,则r.status_code为200,但r.text将是Invalid Login页面。我知道关于ASP的nada,但我猜测HTTP状态代码应该表明实际发生了什么。

以下是一些不起作用的代码,但可能会说明您可能希望如何与网站和会话进行互动。

import requests

# Create dicts with our login and search data
login_params = {'btnGuestLogin': 'Log+In+as+GUEST'}
search_params = {'ctl00$ContentPlaceHolder1$txtName': 'Andrew'}
full_params = {'btnGuestLogin': 'Log+In+as+GUEST', 'ctl00$ContentPlaceHolder1$txtName': 'Andrew'}


# Create session and add login params
albany_session = requests.session()
albany_session.params = login_params

# Login and confirm login via searching for the 'ASP.NET_SessionId' cookie.
# Use the login page, not the search page first.
albany_session.post('https://www.searchiqs.com/NYALB/LogIn.aspx')
print(albany_session.cookies)

# Prepare a your search request
search_req = requests.Request('POST', 'https://www.searchiqs.com/NYALB/SearchAdvancedMP.aspx',data=search_params)
prepped_search_req = albany_session.prepare_request(search_req)

# Probably should work but does not seem to, for "reasons" unknown to me.
search_response = albany_session.send(prepped_search_req)
print(search_response.text)

您可以考虑选择使用Python绑定的Selenium浏览器自动化。

http://selenium-python.readthedocs.io/