带请求的 Python 网页抓取 - 登录后

标签 python web-scraping beautifulsoup python-requests

我下面有一个 python requests/betiful soup 代码,它使我能够成功登录到 URL。但是,登录后,要获取我需要的数据通常必须手动执行:

1)点击第一行的“声明”:

enter image description here

2) 选择日期,点击“运行报表”:

enter image description here

3)查看数据:

enter image description here

这是我用来登录以进入上述步骤 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):

enter image description here ]

编辑1:来自csv文件下载的网络请求:

enter image description here

最佳答案

正如其他人所推荐的,Selenium 是完成此类任务的一个很好的工具。不过,我会尝试建议一种使用 requests 来实现此目的的方法,因为这就是您在问题中所要求的。

此方法的成功实际上取决于网页的构建方式以及数据文件的可用方式(如果 View 数据中的“另存为 CSV”是您的目标)。

如果登录机制是基于cookie的,可以使用 SessionsCookies在请求中。当您提交登录表单时,响应 header 中会返回一个 cookie。您可以将 cookie 添加到任何后续页面请求的请求 header 中,以使您的登录保持不变。

此外,您还应该在开发人员工具网络 Pane 中检查“另存为 CSV”操作的网络请求。如果您可以看到请求的结构,则可以在经过身份验证的 session 中发出直接请求,并使用语句标识符和日期作为有效负载来获取结果。

关于带请求的 Python 网页抓取 - 登录后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50912466/

相关文章:

python - 如何在 pandas dataframe python 中将名称的第一个字符转换为大写?

python - 在 python 3.7 中使用 Beautifulsoup 从《华尔街日报》中抓取文章?

python - PySpark - Spark DataFrame 数组与 Python 列表不同吗?

python - 所有 os.popen() 方法之间有什么区别?

python - 如何使用 odbc 查询 Sybase IQ 服务器?

java - JSoup 从 img 类中提取标题

ruby - 在两个单独的页面上抓取需要登录用户名和密码的站点

python - 如何根据父类中的 cli kwargs 重写 FEED_URI?

python - 使用 BS4 从隐藏的 html(弹出窗口)获取数据

python - 是否可以在没有循环或附加模块的情况下从 BeautifulSoup 获取以下信息?