c# - 确定页面上的哪些字段是必填的?

标签 c# python mysql sql web-scraping

我在一家小型软件公司担任 UI 测试员。为了让我的生活更轻松,我正在尝试用 Python 编写一个抓取工具,它将自动生成一些在每个页面上运行的标准测试。测试是使用 Quicktest Pro 完成的,需要用 VBScript 编写。创建数据的每个页面都需要有一个完整的案例,其中页面上的每个字段都被填写,以及减少的案例数量,其中只填写必填字段。

完整的情况应该很简单——我计划使用已经经过身份验证的 cookie 设置 requests.Session 对象,将 GET 请求发送到适当的页面,并使用 BeautifulSoup 解析响应。

案例减少,我不太确定如何处理。我可以想到三种方法来解决这个问题,但没有一个听起来很好:

A) 尝试提交空白页。检查响应中是否存在“* <field> 是必填字段”形式的错误消息。查找名称与指定名称最接近的字段。填写它们。尝试再次提交,并重复添加字段,直到成功通过,并返回字段列表。

这不太好,因为很难识别错误消息对应的字段。声明“* 需要出生日期”的消息实际上可能指的是 HTML ID 为“dob_entry1”的表单元素。我还在源代码的开发副本上进行测试,因此部分填写的表单导致服务器错误并不罕见,而且我可能需要手动清理此方法创建的任何数据。

B) 发送完整填写的表格。找到刚刚创建的数据库记录,并找出哪些列不为空。将列名与字段名匹配,并返回结果列表。

这似乎更有希望,但我不确定如何查找创建的记录。 MySQL服务器的日志(错误除外)没有打开,服务器上有大约15个数据库,所有这些数据库都在由开发人员处理,所以我不能乱用服务器的全局变量来打开它。我可以在数据库中查询我刚刚传入的所有值,但是数据库上已经有大量数据,因此我不太可能找出出生日期。我刚刚提交的一份。

谷歌搜索,像这样的工具 http://hackmysql.com/mysqlsniffer可能是一种选择,但我对对整个服务器进行任何操作都持谨慎态度,因为开发人员将同时使用服务器上的其他数据库。我对 SQL 没有太多经验,所以我不太确定如何去做这件事。

C) 以某种方式解析 C# 源代码以查找与给定页面对应的查询。找出它影响哪些列,查询数据库以找出哪些列不为空,将列名与字段名匹配并返回一个列表。

我没有使用 C# 的经验,所以我不知道这有多可行,但如果是 PHP,我认为这会非常简单。如果我四处寻找,我可以找到该网站的来源,但我还没有看过任何内容。该网站已有大约 10 年的历史,并且非常庞大,因此将页面名称与源文件相匹配可能并不简单。

我认为找出提交页面所需的表单字段对于爬虫来说是一项非常常见的任务,但谷歌并没有发现太多。这些方法是否合理?有没有一个我错过的简单解决方案?

最佳答案

我认为您的第一选择 - 从 HTML 响应中找出需要哪些字段 - 是您最安全的选择。尝试将字段名称与数据库列名称相匹配可能是一个真正的问题 - 您不知道数据在保存到数据库之前经历了多少层 - 字段名称看起来与列名称完全不同。

查看某个字段是否为必填字段应该不会太难 - 从完整的表单开始并提交以查看其是否合法。然后再次发送表单,去掉第一个字段。如果您收到错误 - 该字段是必填字段。再次填写第一个字段,清除第二个字段,然后重试。对表单中的每个字段执行此操作。

网络应用程序需要足够稳定才能正常工作。您应该能够区分缺失字段错误和服务器错误。

哦,请检查 @Ming Slogar 的评论 - 如果 HTML 人员将字段标记为 HTML 中的必填项,那么您将有很多空闲时间。

关于c# - 确定页面上的哪些字段是必填的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18177192/

相关文章:

c# - Linq IQueryable 通用筛选器

python - 了解 python 套接字 io/aiohttp 服务器中的异步等待

python - 即使使用 ui.WebDriverWait() chrome selenium python 后也会出现随机 TimeoutException

python - Windows 上的 fcntl 替代品

mysql 在where子句中显式引用table.column

jquery - CakePHP 3 - 允许用户分配和更改记录查询的顺序

c# - 如何在 WPF 应用程序中将 MySQL 表绑定(bind)到数据网格

c# - 创建新的数据库并填充另一个数据库

c# - 使用 C# 从 facebook 获取 FB 页面数据

mysql - 带通配符的 DISTINCT/GROUP BY。数据库