我下面有一个 python requests/betiful soup 代码,它使我能够成功登录到 URL。但是,登录后,要获取我需要的数据通常必须手动执行:
1)点击第一行的“声明”:
2) 选择日期,点击“运行报表”:
3)查看数据:
这是我用来登录以进入上述步骤 1 的代码:
import requests
from bs4 import BeautifulSoup
logurl = "https://login.flash.co.za/apex/f?p=pwfone:login"
posturl = 'https://login.flash.co.za/apex/wwv_flow.accept'
with requests.Session() as s:
s.headers = {"User-Agent":"Mozilla/5.0"}
res = s.get(logurl)
soup = BeautifulSoup(res.text,"html.parser")
arg_names =[]
for name in soup.select("[name='p_arg_names']"):
arg_names.append(name['value'])
values = {
'p_flow_id': soup.select_one("[name='p_flow_id']")['value'],
'p_flow_step_id': soup.select_one("[name='p_flow_step_id']")['value'],
'p_instance': soup.select_one("[name='p_instance']")['value'],
'p_page_submission_id': soup.select_one("[name='p_page_submission_id']")['value'],
'p_request': 'LOGIN',
'p_t01': 'solar',
'p_arg_names': arg_names,
'p_t02': 'password',
'p_md5_checksum': soup.select_one("[name='p_md5_checksum']")['value'],
'p_page_checksum': soup.select_one("[name='p_page_checksum']")['value']
}
s.headers.update({'Referer': logurl})
r = s.post(posturl, data=values)
print (r.content)
我的问题是,(对于初学者来说),我如何跳过步骤 1 和 2,而只是使用最终 URL 使用选定日期作为表单条目(下面的标题和表单信息)进行另一个标题更新和发布? (引荐 header
是上面的步骤 2):
编辑1:来自csv文件下载的网络请求:
最佳答案
正如其他人所推荐的,Selenium 是完成此类任务的一个很好的工具。不过,我会尝试建议一种使用 requests
来实现此目的的方法,因为这就是您在问题中所要求的。
此方法的成功实际上取决于网页的构建方式以及数据文件的可用方式(如果 View 数据中的“另存为 CSV”是您的目标)。
如果登录机制是基于cookie的,可以使用 Sessions和 Cookies在请求中。当您提交登录表单时,响应 header 中会返回一个 cookie。您可以将 cookie 添加到任何后续页面请求的请求 header 中,以使您的登录保持不变。
此外,您还应该在开发人员工具网络 Pane 中检查“另存为 CSV”操作的网络请求。如果您可以看到请求的结构,则可以在经过身份验证的 session 中发出直接请求,并使用语句标识符和日期作为有效负载来获取结果。
关于带请求的 Python 网页抓取 - 登录后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50912466/