下面有一个python requests / beatiful soup code,可以让我成功登录网址。但是,登录后,要获取我需要的数据通常必须手动:
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作为表单条目(下面的标题和表单信息)使用选定日期发布? (referral header
是上面的第2步):
编辑1:来自csv文件下载的网络请求:
答案 0 :(得分:0)
使用selenium webdriver,它有很多很好的功能来处理Web服务。
答案 1 :(得分:0)
Selenium将是您自动浏览器互动的最佳选择。它不仅可以用于从网站上抓取数据,还可以用于与不同的表单等进行交互。我强烈推荐它,因为我过去曾经使用过它。 如果你已经安装了pip和python,请继续输入
pip install selenium
那将安装selenium但你还需要安装geckodriver(用于Firefox)或chromedriver(用于chrome) 然后你就应该开始运作了!
答案 2 :(得分:0)
正如其他人所推荐的那样,Selenium是完成此类任务的好工具。但是,我会尝试为此目的建议一种使用requests
的方法,因为这就是您在问题中要求的内容。
这种方法的成功与否取决于网页的构建方式以及数据文件的可用性(如果视图数据中的“另存为CSV”是您的目标)。
如果登录机制是基于cookie的,您可以在请求中使用Sessions和Cookies。提交登录表单时,会在响应标头中返回cookie。您可以在任何后续页面请求中添加cookie以请求标题,以使您的登录成为可能。
此外,您应该在Developer Tools网络窗格中检查网络请求“另存为CSV”操作。如果您可以看到请求的结构,您可以在经过身份验证的会话中发出直接请求,并使用语句标识符和日期作为有效负载来获取结果。