从网站上的按钮下载文件的 Python 脚本

2023-11-30

我想通过单击以下网址中的“导出到 Excel”按钮来下载 xls 文件:https://apps.tampagov.net/CallsForService_Webapp/Default.aspx?type=TPD.

更具体地说,按钮:name =“ctl00$MainContent$btndata”。我已经能够使用 selenium 执行此操作,但是,我计划使用此脚本构建 docker 映像并作为 docker 容器运行,因为此 xls 会定期更新,并且我需要本地计算机上的最新数据,但它并不经常打开浏览器来获取这些数据是没有意义的。我知道 chrome 和 firefox 有无头版本,尽管我不相信它们支持下载。另外,我知道 web get 在这种情况下不起作用,因为该按钮不是资源的静态链接。也许有一种完全不同的方法来下载这些数据并将其更新到我的计算机?

import urllib
import requests
from bs4 import BeautifulSoup

headers = {
    'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=.08',
    'Origin': 'https://www.tampagov.net',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.17 (KHTML, like Gecko)  Chrome/24.0.1312.57 Safari/537.17',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Referer': 'https://apps.tampagov.net/CallsForService_Webapp/Default.aspx?type=TPD',
    'Accept-Encoding': 'gzip,deflate,br',
    'Accept-Language': 'en-US,en;q=0.5',
}

class MyOpener(urllib.FancyURLopener):
    version = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17'

myopener = MyOpener()
url = 'https://apps.tampagov.net/CallsForService_Webapp/Default.aspx?type=TPD'
# first HTTP request without form data
f = myopener.open(url)
soup = BeautifulSoup(f, "html.parser")
# parse and retrieve two vital form values
viewstate = soup.select("#__VIEWSTATE")[0]['value']
eventvalidation = soup.select("#__EVENTVALIDATION")[0]['value']

formData = (
    ('__EVENTVALIDATION', eventvalidation),
    ('__VIEWSTATE', viewstate),
    ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'),
    ('Accept-Encoding', 'gzip, deflate, br'),
    ('Accept-Language', 'en-US,en;q=0.5'),
    ('Host', 'apps,tampagov.net'),
    ('User-Agent', 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0'))



payload = urllib.urlencode(formData)
# second HTTP request with form data
r = requests.post("https://apps.tampagov.net/CallsForService_Webapp/Default.aspx?type=TPD", params=payload)
print(r.status_code, r.reason)

第一:我删除了import urllib因为“要求”就足够了。

您遇到的一些问题:

  1. 您不需要创建一个嵌套元组然后应用urllib.urlencode,使用一本字典,这就是 requests 如此受欢迎的原因之一。

  2. 您最好填充所有参数http post要求。就像下面我所做的那样,否则请求可能会被后端拒绝。

  3. 我添加了一段简单的代码将内容保存到本地。

PS:对于那些表单参数,您可以通过分析 html 响应来获取它们的值http get。您还可以根据需要自定义参数,例如页面大小等。

下面是一个工作示例:

import requests
from bs4 import BeautifulSoup
from tqdm import tqdm

def downloadExcel():
    headers = {
        'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=.08',
        'Origin': 'https://www.tampagov.net',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.17 (KHTML, like Gecko)  Chrome/24.0.1312.57 Safari/537.17',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Referer': 'https://apps.tampagov.net/CallsForService_Webapp/Default.aspx?type=TPD',
        'Accept-Encoding': 'gzip,deflate,br',
        'Accept-Language': 'en-US,en;q=0.5',
    }

    r = requests.get("https://apps.tampagov.net/CallsForService_Webapp/Default.aspx?type=TPD", headers=headers)
    # parse and retrieve two vital form values
    if not r.status_code == 200:
        print('Error')
        return
    soup = BeautifulSoup(r.content, "html.parser")
    viewstate = soup.select("#__VIEWSTATE")[0]['value']
    eventvalidation = soup.select("#__EVENTVALIDATION")[0]['value']
    print ('__VIEWSTATE:', viewstate)
    print ('__EVENTVALIDATION:', eventvalidation)
    formData = {
        '__EVENTVALIDATION': eventvalidation,
        '__VIEWSTATE': viewstate,
        '__EVENTTARGET': '',
        '__EVENTARGUMENT': '',
        '__VIEWSTATEGENERATOR': '49DF2C80',
        'MainContent_RadScriptManager1_TSM':""";;System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35:en-US:59e0a739-153b-40bd-883f-4e212fc43305:ea597d4b:b25378d2;Telerik.Web.UI, Version=2015.2.826.40, Culture=neutral, PublicKeyToken=121fae78165ba3d4:en-US:c2ba43dc-851e-4009-beab-3032480b6a4b:16e4e7cd:f7645509:24ee1bba:c128760b:874f8ea2:19620875:4877f69a:f46195d3:92fe8ea0:fa31b949:490a9d4e:bd8f85e4:58366029:ed16cbdc:2003d0b8:88144a7a:1e771326:aa288e2d:b092aa46:7c926187:8674cba1:ef347303:2e42e72a:b7778d6c:c08e9f8a:e330518b:c8618e41:e4f8f289:1a73651d:16d8629e:59462f1:a51ee93e""",
        'search_block_form':'',
        'ctl00$MainContent$btndata':'Export to Excel',
        'ctl00_MainContent_RadWindow1_C_RadGridVehicles_ClientState':'',
        'ctl00_MainContent_RadWindow1_ClientState':'',
        'ctl00_MainContent_RadWindowManager1_ClientState':'',
        'ctl00$MainContent$RadGrid1$ctl00$ctl02$ctl00$PageSizeComboBox':'20',
        'ctl00_MainContent_RadGrid1_ctl00_ctl02_ctl00_PageSizeComboBox_ClientState':'',
        'ctl00$MainContent$RadGrid1$ctl00$ctl02$ctl02$RDIPFdispatch_time':'',
        'ctl00$MainContent$RadGrid1$ctl00$ctl02$ctl02$RDIPFdispatch_time$dateInput':'',
        'ctl00_MainContent_RadGrid1_ctl00_ctl02_ctl02_RDIPFdispatch_time_dateInput_ClientState':'{"enabled":true,"emptyMessage":"","validationText":"","valueAsString":"","minDateStr":"1900-01-01-00-00-00","maxDateStr":"2099-12-31-00-00-00","lastSetTextBoxValue":""}',
        'ctl00_MainContent_RadGrid1_ctl00_ctl02_ctl02_RDIPFdispatch_time_ClientState':'{"minDateStr":"1900-01-01-00-00-00","maxDateStr":"2099-12-31-00-00-00"}',
        'ctl00$MainContent$RadGrid1$ctl00$ctl02$ctl02$RadComboBox1address':'',
        'ctl00_MainContent_RadGrid1_ctl00_ctl02_ctl02_RadComboBox1address_ClientState':'',
        'ctl00$MainContent$RadGrid1$ctl00$ctl02$ctl02$RadComboBox1case_description':'',
        'ctl00_MainContent_RadGrid1_ctl00_ctl02_ctl02_RadComboBox1case_description_ClientState':'',
        'ctl00$MainContent$RadGrid1$ctl00$ctl02$ctl02$FilterTextBox_grid':'',
        'ctl00$MainContent$RadGrid1$ctl00$ctl02$ctl02$RadComboBox1report_number':'',
        'ctl00_MainContent_RadGrid1_ctl00_ctl02_ctl02_RadComboBox1report_number_ClientState':'',
        'ctl00$MainContent$RadGrid1$ctl00$ctl02$ctl02$FilterTextBox_out_max_date':'',
        'ctl00$MainContent$RadGrid1$ctl00$ctl02$ctl02$FilterTextBox_out_rowcount':'',
        'ctl00$MainContent$RadGrid1$ctl00$ctl03$ctl01$PageSizeComboBox':'20',
        'ctl00_MainContent_RadGrid1_ctl00_ctl03_ctl01_PageSizeComboBox_ClientState':'',
        'ctl00_MainContent_RadGrid1_rfltMenu_ClientState':'',
        'ctl00_MainContent_RadGrid1_gdtcSharedTimeView_ClientState':'',
        'ctl00_MainContent_RadGrid1_gdtcSharedCalendar_SD':'[]',
        'ctl00_MainContent_RadGrid1_gdtcSharedCalendar_AD':'[[1900,1,1],[2099,12,31],[2018,3,29]]',
        'ctl00_MainContent_RadGrid1_ClientState':'',
        }

    # second HTTP request with form data
    r = requests.post("https://apps.tampagov.net/CallsForService_Webapp/Default.aspx?type=TPD", data=formData, headers=headers)
    print('received:', r.status_code, len(r.content))
    with open(r"C:\Users\xxx\Desktop\test\test\apps.xls", "wb") as handle:
        for data in tqdm(r.iter_content()):
            handle.write(data)

downloadExcel()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从网站上的按钮下载文件的 Python 脚本 的相关文章

  • 如何使用显式引用转储 YAML?

    递归引用非常适合ruamel yaml or pyyaml ruamel yaml dump ruamel yaml load A A id001 id001 然而 它 显然 不适用于普通引用 ruamel yaml dump ruamel
  • 了解 Python 中的酸洗

    我最近接到一项作业 需要以腌制形式放置一本字典 其中每个键引用一个列表 唯一的问题是我不知道腌制形式是什么 谁能给我指出一些好的资源的正确方向来帮助我学习这个概念 pickle 模块实现了一个基本但强大的算法 用于序列化和反序列化 Pyth
  • 根据开始列和结束列扩展数据框(速度)

    我有一个pandas DataFrame含有start and end列 加上几个附加列 我想将此数据框扩展为一个时间序列 从start值并结束于end值 但复制我的其他专栏 到目前为止 我想出了以下内容 import pandas as
  • 可以用 Django 制作移动应用程序吗?

    我想知道我是否可以在我的网站上使用 Django 代码 并以某种方式在移动应用程序 Flutter 等框架中使用它 那么是否可以使用我现在拥有的 Django 后端并在移动应用程序中使用它 所以就像models views etc 是的 有
  • 如何显示接下来的三个图像单击加载更多按钮

    我需要一个加载更多按钮来显示图像 页面加载时 我显示 3 个图像 单击 加载更多 按钮后 接下来的 3 个图像将显示在屏幕上 我尝试了下面的代码 但它不起作用 你能帮我解决这个问题吗 function item slice 0 2 show
  • 全高全宽 CSS 布局

    我正在寻找一种方法来创建具有 5 个区域的纯 CSS 无 JavaScript 布局 如下所示 H A B C F
  • 为什么我无法在 Mac OS X Terminal.app 上的 Python 解释器中显示 unicode 字符?

    如果我尝试粘贴 unicode 字符 例如中间的点 在我的 python 解释器中它什么也不做 我在 Mac OS X 上使用 Terminal app 当我只是在 bash 中时 我没有遇到任何问题 但在解释器中 python Pytho
  • 如何使用 Django 项目设置 SQLite?

    我已阅读 Django 文档 仅供参考 https docs djangoproject com en 1 3 intro tutorial01 https docs djangoproject com en 1 3 intro tutor
  • 在Python中计算内存碎片

    我有一个长时间运行的进程 不断分配和释放对象 尽管正在释放对象 但 RSS 内存使用量会随着时间的推移而增加 如何计算发生了多少碎片 一种可能性是计算 RSS sum of allocations 并将其作为指标 即便如此 我该如何计算分母
  • Python多处理错误“ForkAwareLocal”对象没有属性“连接”

    下面是我的代码 我面临着多处理问题 我看到这个问题之前已经被问过 我已经尝试过这些解决方案 但它似乎不起作用 有人可以帮我吗 from multiprocessing import Pool Manager Class X def init
  • Python 惰性迭代器

    我试图了解迭代器表达式如何以及何时被求值 以下似乎是一个懒惰的表达 g i for i in range 1000 if i 3 i 2 然而 这个在构造上失败了 g line strip for line in open xxx r if
  • 具有屏蔽无效值的 pcolormesh

    我试图将一维数组绘制为 pcolormesh 因此颜色沿 x 轴变化 但每个 x 的 y 轴保持不变 但我的数据有一些错误值 因此我使用屏蔽数组和自定义颜色图 其中屏蔽值设置为蓝色 import numpy as np import mat
  • Python 类型安全吗?

    根据维基百科 https en wikipedia org wiki Type system Type safety and memory safety 如果一种语言不允许违反类型系统规则的操作或转换 计算机科学家就认为该语言是 类型安全的
  • 解析根元素内元素之间的 XML 文本

    我正在尝试用 Python 解析 XML 以下是 XML 结构的示例 a aaaa1 b bbbb b aaaa2 a
  • Python 声音(“铃声”)

    我想让一个 python 程序在完成任务时通过发出嘟嘟声来提醒我 目前 我使用import os然后使用命令行语音程序说 进程完成 我更愿意它是一个简单的 铃 我知道有一个函数可以用于Cocoa apps NSBeep 但我认为这与此没有太
  • 在 virtualenvwrapper 中激活环境

    我安装了virtualenv and virtualenvwrapper用这个命令我创建了一个环境 mkvirtualenv cv 它有效 创建后我就处于新环境中 现在我重新启动了我的电脑 我想activate又是那个环境 但是怎么样 我使
  • 如何在单元测试中使用 JSON 发送请求

    我的 Flask 应用程序中有在请求中使用 JSON 的代码 我可以像这样获取 JSON 对象 Request request get json 这一直工作得很好 但是我正在尝试使用 Python 的 unittest 模块创建单元测试 但
  • 如何循环遍历字典列表并打印特定键的值?

    我是 Python 新手 有一个问题 我知道这是一个非常简单的问题 运行Python 3 4 我有一个需要迭代并提取特定信息的列表 以下是列表 称为部分 的示例 已截断 数千个项目 state DEAD id phwl type name
  • 在 Django shell 会话期间获取 SQL 查询计数

    有没有办法打印 Django ORM 在 Django shell 会话期间执行的原始 SQL 查询的数量 Django 调试工具栏已经提供了此类信息 例如 5 QUERIES in 5 83MS但如何从 shell 中获取它并不明显 您可
  • 长/宽数据到宽/长

    我有一个数据框 如下所示 import pandas as pd d decil 1 decil 1 decil 2 decil 2 decil 3 decil 3 decil kommune AA BB AA BB AA BB 2010

随机推荐

  • 如何检查一个列表是否在另一个具有相同顺序的列表中python [重复]

    这个问题在这里已经有答案了 我的问题与典型的问题不同 假设我们有 X 123 456 789 并且 我们想要查找 X 中是否有另一个列表具有完全相同的顺序 例如 A 123 456 should return True since A in
  • 从 xsd 架构文件生成类时出错

    我试图从 xsd 架构生成一个类 但收到以下错误消息 警告 无法生成类 因为未找到具有复杂类型的顶级元素 我的 xsd 文件如下所示
  • 使用 getline() 输入时出现分段错误

    我正在尝试编写一个简单的程序 该程序接受用户输入 然后将其打印出来 一直这样做直到用户输入 done 当我运行下面的代码时 我输入 01 然后得到一个Segmentation Fault core dumped 我认为这与getline 但
  • WCF 回调服务与 netTcp 绑定在 10 分钟后超时

    我正在使用 WCF 使用回调合约 和 netTcpBinding 创建一个聊天应用程序 我将该服务托管为 Windows 服务并从其他计算机访问它 通过客户端应用程序 我现在面临的问题是客户端连接在之后进入故障状态 10 分钟 似乎发生了某
  • 在特定位置添加字典元素

    考虑以下代码 var myDict new Dictionary
  • 如何保持 Tomcat 会话?

    我有一个 JSP 网页 每 1 分钟刷新一次 每次刷新时 都会检查会话对象的有效性 当 tomcat Web 服务器重新启动时 会话消失 并且当页面刷新时 它显示 无效 有人能解决我的问题吗 查看 Tomcat 配置文件中的配置 该文档位于
  • 在引导程序日期时间选择器中设置默认时间?

    如何将默认小时和分钟设置为 00 00 这里我只想设置时间而不是日期 我正在使用以下日期时间选择器代码 在此代码中 如何将默认时间设置为 00 00 timepicker rowIndx datetimepicker format dd M
  • 如何使用 jQuery 附加到跨度内的

    标记?

    jsFiddle 我正在尝试将一些文本附加到跨度中的标题中 但我不知道如何附加到实际标题 而不仅仅是跨度 Style h1 font size 250 color red HTML span class note h1 some text

  • 我可以将 CSS 应用于 iframe 中的元素吗?

    我经常看到使用包含外部站点的 iframe 的网站 以及包含供用户使用的 JavaScript 功能的顶部框架 例如用户分析软件 Digg bar 等 对于尝试类似的东西有什么建议吗 如果知道的话那就太好了 不 不是来自outsideifr
  • 在 Jenkins 中远程触发构建

    我曾尝试通过在提交挂钩中使用此 URL 来触发我的 Jenkins 项目 curl http jenkins server job job name build token TOKEN 并且没有被触发 但是当我在网络浏览器中输入这个 URL
  • 如何使用 Codeigniter 从数据库检索数据并将其显示在 html 表格中

    任何人请帮助我检索数据库数据以及如何在 html 表中查看它 我给出的编码是否正确 如果不正确 你能说出我必须如何给出吗 以便在 html 表中查看它 控制器 class edit content extends CI Controller
  • 如何获取传递给 multiprocessing.Process 的函数的返回值?

    在下面的示例代码中 我想获取函数的返回值worker 我该怎么做呢 这个值存储在哪里 示例代码 import multiprocessing def worker procnum worker function print str proc
  • 从 Mac 向 iPhone/iPad/iPod touch 发送通知

    我目前销售一款仅适用于 Mac 的生产力工具 该工具使用视觉和音频通知来提醒用户正在发生的某些事件 我已经开始规划该 Mac 程序的 iPhone 和 iPad 版本 并希望能够提供从 Mac 到 iPhone 的通知服务 例如iPhone
  • 使用 LINQ 获取配对集

    当我有一个清单时 IList
  • 如何在 map() 中使用异步代码(Flutter、Firestore)

    我正在使用 Flutter 和 Firestore 插件开发一个群聊应用程序 从数据库获取数据并将快照转换为消息列表完全可以正常工作 但现在我想将数据库中的 uid 转换为用户名 uid 及其用户名保存在数据库中 这是我的代码 final
  • 使用 XSLT 2.0 的两阶段转换

    我正在尝试将 CSV 文件作为输入并将其转换为 XML 我是 XSLT 新手 我找到了一种将 CSV 转换为 XML 的方法 使用来自安德鲁韦尔奇 像这样 输入 CSV 文件 car manufacturer model color pri
  • yaml 中的“>-”和“|-”有什么区别?

    我想确切地知道 gt 和 之间的区别 特别是在 kubernetes yaml 清单中 折叠块标量中的换行符 gt 受到行折叠 文字块标量中的换行符 不是 行折叠将非空行之间的单个换行符替换为空格 并且在空行的情况下 将周围非空行之间的换行
  • ASP.NET Core执行Linux shell命令

    有没有办法从 ASP NET Core 应用程序中执行 Linux shell 命令并将值返回到变量中 目前最好的可能性似乎是使用预发布版SSH Net Core https www nuget org packages SSH Net C
  • 使用 PHP 脚本进行 ERR_CONNECTION_RESET

    我有一个 PHP 脚本 可以下载和处理一些文件 有时文件数量非常大 因此需要一些时间 但是 当有大量文件需要处理时 连接会中断并出现 ERR CONNECTION RESET 错误 Chrome 这是我的配置 upload max file
  • 从网站上的按钮下载文件的 Python 脚本

    我想通过单击以下网址中的 导出到 Excel 按钮来下载 xls 文件 https apps tampagov net CallsForService Webapp Default aspx type TPD 更具体地说 按钮 name c