1

我在抓取页面时无法创建和保持新会话。我正在使用 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”的第 1 方名称。我已将包含此搜索框的表单元素标识为“Rctl00$ContentPlaceHolder1$txtName”。操作 url 是 SearchResultsMP.aspx。

当我从浏览器执行此操作时,它会给出结果的第一页。当我在终端中执行此操作时,它会给我会话过期页面。有任何想法吗?

4

1 回答 1

0

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

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

我还注意到,在您调用sessions.post重定向时导航到基本 URL:

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。您以编程方式进行搜索的尝试可能会失败,因为您尚未进行任何类型的身份验证。它可能在您的浏览器中有效,因为您已被允许访问它,或者通过您已完成但可能已经忘记的某些先前的身份验证,或者某种服务器端访问规则根据某些标准不要求这样做。

在本地解释器中运行这些命令,我​​可以看到站点所有者没有费心返回指示身份验证失败的状态代码。如果您检查,r.status_code则为 200,但您r.text将是Invalid Login页面。我对 ASP 知之甚少,但我猜测 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/

于 2016-07-24T19:24:55.003 回答