【问题标题】:How to submit query to .do page如何向 .do 页面提交查询
【发布时间】:2013-12-17 11:02:01
【问题描述】:

这是我第一次使用 stackexchange,遇到一个问题,我在 Google 上花费了数小时都无法找到解决方案。由于缺少更多图片,请提前道歉,stackexchange 将不允许我添加更多照片,直到我的声誉更高。

我需要从 .do 页面获取结果:

http://webapps2.rrc.state.tx.us/EWA/productionQueryAction.do

当大型查询时,url 保持静态,例如

已提交 - 我无法通过更改 url 来更改我的查询。

一旦提交,加载时间较长,加载后呈现结果表格。

然后我要求所有数据都在一个页面上,因此我从表格左上角的下拉菜单中选择“查看全部”作为页面大小以获取下一页(其中的行数比显示的多得多在这里)

最后,为了导入这些数据,我打开一个电子表格并将其全部复制粘贴进去。

即使是一个县/查询/提交,这个过程也非常繁琐,我必须每月为大约 20 个县执行此操作,然后再为 10 个区执行此操作。由于与每个查询的返回相关的加载时间较长,因此这项任务很容易需要 2-3 小时才能完成。

因此,我希望这里有人能提供某种解决方案来自动化/简化流程,甚至只是建议我在哪里可以找到信息来自己创建解决方案。如果我可以直接查询数据库将数据导入电子表格,我的问题就解决了。如果查询服务器的整个过程可以自动化,则加载时间无关紧要,因为它可以在后台运行而无需用户输入。

对于这个冗长且不具体的问题,我深表歉意,我们将不胜感激。

非常感谢。

【问题讨论】:

  • 创建通过 cli 运行的 cron 作业以获取详细信息并将其每月保存到 excel 中
  • cronjobexport to excel 的示例
  • @Anusha:感谢您的建议和链接。你认为这样的 cron 作业适用于 javascript/dojo 源吗?
  • 您是否尝试联系网站所有者并要求提供公共 API?另一种选择可能是通过docs.seleniumhq.org 尝试自动化 - 但由于 AJAX 请求,这可能会很困难

标签: javascript database dojo download automation


【解决方案1】:

好吧,您实际上可以检查为获取 CSV 文件而执行的网络调用。我刚刚为你做了那个,但是它包含很多你需要发送的参数。下面是你需要发送的实际参数:

searchArgs.orderByColumnName=
&searchArgs.initialViewArgHndlr.inputValue=County
&searchArgs.startMonthArgHndlr.inputValue=01
&searchArgs.startYearArgHndlr.inputValue=1993
&searchArgs.endMonthArgHndlr.inputValue=01
&searchArgs.endYearArgHndlr.inputValue=2013
&searchArgs.oilOrGasArgHndlr.inputValue=
&searchArgs.gasWellNoHndlr.inputValue=
&searchArgs.searchTypeHndlr.inputValue=production
&searchArgs.viewTypeHndlr.inputValue=monthlyTotals
&searchArgs.activeTabsFlagwordHndlr.inputValue=11
&searchArgs.orderByHndlr.inputValue=
&searchArgs.leaseTypeArgHndlr.inputValue=O
&searchArgs.districtCodeArgHndlr.inputValue=
&searchArgs.leaseNumberArgHndlr.inputValue=
&searchArgs.fieldNumbersArgHndlr.inputValue=
&searchArgs.fieldNamesHndlr.inputValue=
&searchArgs.operatorNumbersArgHndlr.inputValue=
&searchArgs.operatorNamesHndlr.inputValue=
&searchArgs.onShoreCountyCodeArgHndlr.inputValue=001
&searchArgs.offShoreCountyCodeArgHndlr.inputValue=
&searchArgs.leaseNameArgHndlr.inputValue=
&searchArgs.geoRegionOptionHndlr.inputValue=county
&searchArgs.statewideFlagHndlr.inputValue=
&methodToCall=generateProductionQueryReportCsv
&actionManager.recordCountHndlr.inputValue=2
&actionManager.currentIndexHndlr.inputValue=1
&actionManager.actionRcrd%5B0%5D.actionDisplayNmHndlr.inputValue=Search+Criteria
&actionManager.actionRcrd%5B0%5D.hostHndlr.inputValue=webapps2.rrc.state.tx.us%3A80
&actionManager.actionRcrd%5B0%5D.contextPathHndlr.inputValue=%2FEWA
&actionManager.actionRcrd%5B0%5D.actionHndlr.inputValue=%2FproductionQueryAction.do
&actionManager.actionRcrd%5B0%5D.actionParameterHndlr.inputValue=methodToCall
&actionManager.actionRcrd%5B0%5D.actionMethodHndlr.inputValue=unspecified
&actionManager.actionRcrd%5B0%5D.pagerParameterKeyHndlr.inputValue=
&actionManager.actionRcrd%5B0%5D.actionParametersHndlr.inputValue=
&actionManager.actionRcrd%5B0%5D.returnIndexHndlr.inputValue=0
&actionManager.actionRcrd%5B0%5D.argRcrdParameters%28searchArgs.paramValue%29=%7C1%3DCounty%7C2%3D01%7C3%3D1993%7C4%3D01%7C5%3D2013%7C8%3Dproduction%7C9%3DmonthlyTotals%7C10%3D11%7C101%3DO%7C201%3D001%7C204%3Dcounty
&actionManager.actionRcrd%5B1%5D.actionDisplayNmHndlr.inputValue=County%3A+ANDERSON
&actionManager.actionRcrd%5B1%5D.hostHndlr.inputValue=webapps2.rrc.state.tx.us%3A80
&actionManager.actionRcrd%5B1%5D.contextPathHndlr.inputValue=%2FEWA
&actionManager.actionRcrd%5B1%5D.actionHndlr.inputValue=%2FproductionQueryAction.do
&actionManager.actionRcrd%5B1%5D.actionParameterHndlr.inputValue=methodToCall
&actionManager.actionRcrd%5B1%5D.actionMethodHndlr.inputValue=search
&actionManager.actionRcrd%5B1%5D.pagerParameterKeyHndlr.inputValue=prodPager.paramValue
&actionManager.actionRcrd%5B1%5D.actionParametersHndlr.inputValue=
&actionManager.actionRcrd%5B1%5D.returnIndexHndlr.inputValue=0
&actionManager.actionRcrd%5B1%5D.argRcrdParameters%28prodPager.paramValue%29=%7C1%3D1%7C2%3D-1%7C3%3D241%7C4%3D0%7C5%3D0%7C6%3D10
&actionManager.actionRcrd%5B1%5D.argRcrdParameters%28searchArgs.paramValue%29=%7C1%3DCounty%7C2%3D01%7C3%3D1993%7C4%3D01%7C5%3D2013%7C8%3Dproduction%7C9%3DmonthlyTotals%7C10%3D11%7C101%3DO%7C201%3D001%7C204%3Dcounty
&searchArgs.startMonthArg=01
&searchArgs.startYearArg=1993
&searchArgs.endMonthArg=01
&searchArgs.endYearArg=2013
&pager.pageSize=-1

我希望你只有以searchArgs为前缀的参数是重要的(它们包含表单的信息,比如月/年/....

actionManager前缀参数包含一些复杂的数据,你需要定义它们(否则你会出错),但我不知道它们是否真的被使用,所以你可以把它们留空。

执行此调用时,您将立即收到可以使用任何语言解析的 CSV 文件(查找 CSV 解析库)并将其插入数据库或其他东西。


但是,最好的办法是寻找此源的替代方案(或您可以访问的公共 API),因为使用它真的很疯狂,而且它可能会改变。


使用 PHP 的示例

以下代码是 PHP 检索 CSV(使用 cURL)并将其解析为数组的示例。

<?php

/** The data */
$minMonth = '01';
$minYear = '1993';
$maxMonth = '01';
$maxYear = '2013';
$view = 'County';
$region = 'county';
$location = '001'; /** This is the county code of ANDERSON */

$ch = curl_init();
/** URL */
curl_setopt($ch, CURLOPT_URL, "http://webapps2.rrc.state.tx.us/EWA/productionQueryAction.do");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);

/** All these form parameters */
$data = array(
    'searchArgs.orderByColumnName' => '',
    'searchArgs.initialViewArgHndlr.inputValue' => $view,
    'searchArgs.startMonthArgHndlr.inputValue' => $minMonth,
    'searchArgs.startYearArgHndlr.inputValue' => $minYear,
    'searchArgs.endMonthArgHndlr.inputValue' => $maxMonth,
    'searchArgs.endYearArgHndlr.inputValue' => $maxYear,
    'searchArgs.oilOrGasArgHndlr.inputValue' => '',
    'searchArgs.gasWellNoHndlr.inputValue' => '',
    'searchArgs.searchTypeHndlr.inputValue' => 'production',
    'searchArgs.viewTypeHndlr.inputValue' => 'monthlyTotals',
    'searchArgs.activeTabsFlagwordHndlr.inputValue' => '11',
    'searchArgs.orderByHndlr.inputValue' => '',
    'searchArgs.leaseTypeArgHndlr.inputValue' => 'O',
    'searchArgs.districtCodeArgHndlr.inputValue' => '',
    'searchArgs.leaseNumberArgHndlr.inputValue' => '',
    'searchArgs.fieldNumbersArgHndlr.inputValue' => '',
    'searchArgs.fieldNamesHndlr.inputValue' => '',
    'searchArgs.operatorNumbersArgHndlr.inputValue' => '',
    'searchArgs.operatorNamesHndlr.inputValue' => '',
    'searchArgs.onShoreCountyCodeArgHndlr.inputValue' => $location,
    'searchArgs.offShoreCountyCodeArgHndlr.inputValue' => '',
    'searchArgs.leaseNameArgHndlr.inputValue' => '',
    'searchArgs.geoRegionOptionHndlr.inputValue' => $region,
    'searchArgs.statewideFlagHndlr.inputValue' => '',
    'methodToCall' => 'generateProductionQueryReportCsv',
    'actionManager.recordCountHndlr.inputValue' => '2',
    'actionManager.currentIndexHndlr.inputValue' => '1',
    'actionManager.actionRcrd%5B0%5D.actionDisplayNmHndlr.inputValue' => 'Search+Criteria',
    'actionManager.actionRcrd%5B0%5D.hostHndlr.inputValue' => 'webapps2.rrc.state.tx.us%3A80',
    'actionManager.actionRcrd%5B0%5D.contextPathHndlr.inputValue' => '%2FEWA',
    'actionManager.actionRcrd%5B0%5D.actionHndlr.inputValue' => '%2FproductionQueryAction.do',
    'actionManager.actionRcrd%5B0%5D.actionParameterHndlr.inputValue' => 'methodToCall',
    'actionManager.actionRcrd%5B0%5D.actionMethodHndlr.inputValue' => 'unspecified',
    'actionManager.actionRcrd%5B0%5D.pagerParameterKeyHndlr.inputValue' => '',
    'actionManager.actionRcrd%5B0%5D.actionParametersHndlr.inputValue' => '',
    'actionManager.actionRcrd%5B0%5D.returnIndexHndlr.inputValue' => '0',
    'actionManager.actionRcrd%5B0%5D.argRcrdParameters%28searchArgs.paramValue%29' => '%7C1%3DCounty%7C2%3D01%7C3%3D1993%7C4%3D01%7C5%3D2013%7C8%3Dproduction%7C9%3DmonthlyTotals%7C10%3D11%7C101%3DO%7C201%3D001%7C204%3Dcounty',
    'actionManager.actionRcrd%5B1%5D.actionDisplayNmHndlr.inputValue' => 'County%3A+ANDERSON',
    'actionManager.actionRcrd%5B1%5D.hostHndlr.inputValue' => 'webapps2.rrc.state.tx.us%3A80',
    'actionManager.actionRcrd%5B1%5D.contextPathHndlr.inputValue' => '%2FEWA',
    'actionManager.actionRcrd%5B1%5D.actionHndlr.inputValue' => '%2FproductionQueryAction.do',
    'actionManager.actionRcrd%5B1%5D.actionParameterHndlr.inputValue' => 'methodToCall',
    'actionManager.actionRcrd%5B1%5D.actionMethodHndlr.inputValue' => 'search',
    'actionManager.actionRcrd%5B1%5D.pagerParameterKeyHndlr.inputValue' => 'prodPager.paramValue',
    'actionManager.actionRcrd%5B1%5D.actionParametersHndlr.inputValue' => '',
    'actionManager.actionRcrd%5B1%5D.returnIndexHndlr.inputValue' => '0',
    'actionManager.actionRcrd%5B1%5D.argRcrdParameters%28prodPager.paramValue%29' => '%7C1%3D1%7C2%3D-1%7C3%3D241%7C4%3D0%7C5%3D0%7C6%3D10',
    'actionManager.actionRcrd%5B1%5D.argRcrdParameters%28searchArgs.paramValue%29' => '%7C1%3DCounty%7C2%3D01%7C3%3D1993%7C4%3D01%7C5%3D2013%7C8%3Dproduction%7C9%3DmonthlyTotals%7C10%3D11%7C101%3DO%7C201%3D001%7C204%3Dcounty',
    'searchArgs.startMonthArg' => $minMonth,
    'searchArgs.startYearArg' => $minYear,
    'searchArgs.endMonthArg' => $maxMonth,
    'searchArgs.endYearArg' => $maxYear,
    'pager.pageSize' => '-1'
);

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$output = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);

/** Convert CSV string to array */
$data = str_getcsv($output);

/** Print array */
print_r($data);

?>

【讨论】:

  • 这看起来很有希望,谢谢你这样做。很抱歉在这里很痛苦,但您能否解释一下如何在网站上执行这样的网络调用,或者建议我可以了解的地方?
  • 取决于你想用哪种语言编写它......我的意思是,我认为将这些内容导入 Excel 工作表不是你应该用 Dojo 做的事情(除非你可能将 Dojo 与 Node.js 结合使用)。
  • 我想我更喜欢用 php 编写它。正如你所说,我只需要生成一个csv文件。我可以轻松解析它,或者我可以将它输入 vba 并以这种方式进行整理。但我不知道如何像您在这里所做的那样执行网络调用
  • 你可以使用 PHP 的 cURL 模块。例如:electrictoolbox.com/php-curl-form-post。该示例中的 $data 数组必须包含我在答案中列出的参数。
  • 太完美了,非常感谢,你为我节省了很多时间!
【解决方案2】:

根据您的描述,这听起来像是数据库花时间生成结果的问题。

如果是这样,你知道被查询的数据库上有没有索引吗?

如果您在没有任何索引的情况下跨多个链接表(看起来和听起来像)查询数据,那么查询将像狗一样运行。

This 网站很好地介绍了可能值得一看的索引。

除此之外,设置一个 cron 来为您自动执行该过程可能很普遍,就像 Anusha 在 cmets 中描述的那样。

我建议您查看索引以及设置 cron 作业,而不是仅仅减少您每月生成数据所需的时间,您可以完全自动化它并让它运行几分钟,而不是每个月的几个小时。

【讨论】:

  • 但是我查询的网站/数据库不是我自己的,我无法访问他们的服务器。 cron 作业能否以我必须的方式查询网站并到达最后一页 (link),然后下载表格?
  • 说实话,我不确定。我查看了来自浏览器的查看源请求中显示的源代码,并下载了 .do 文件以查看是否可以从 php 角度完成任何操作,但似乎该站点是编写的混合使用 javascript 和 dojo,这真的不是我的专长可用于查询网站。很抱歉,我无法提供更多帮助。
  • 完全没有问题,非常感谢您努力检查它,我很感激!我会更新标签,所以也许有 php 和 dojo 方面的专业知识的人会遇到这个问题。现在是圣诞节,所以不太可能收到网站运营商的回复
猜你喜欢
  • 2010-12-01
  • 1970-01-01
  • 2011-01-04
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 2011-09-10
  • 2015-12-30
相关资源
最近更新 更多