【问题标题】:Is there a way to submit a form from an online app without using selenium or browser client?有没有办法在不使用 selenium 或浏览器客户端的情况下从在线应用程序提交表单?
【发布时间】:2016-08-16 01:18:08
【问题描述】:

我想为自己构建一个在线应用程序,为自己管理库存并将商品提交到本地分类网站。这个本地分类网站没有 API,只有一些看起来很旧的 HTML 表单,它们有多个步骤。

不使用 selenium / webdriver,或通过 firefox / chrome 启动虚拟客户端,在哪里可以远程提交网页上的表单?它必须支持某种会话,因为提交过程是多个步骤。

我已经使用 webdriver 和 python 完成了它,这似乎是在线类似问题的最受欢迎的答案。

【问题讨论】:

  • 你可以使用 PHP 中的cURL
  • 或 Python 中类似的库。
  • 谢谢,我对 PHP 非常熟悉,但这同样是一个学习项目。我正在考虑继续使用 Python,因为 requests 库看起来非常简单。学习 NodeJS 是我目前的目标。 NodeJS 是否有任何人都可以推荐的类似于 Python 请求的好库?

标签: javascript python forms selenium web-scraping


【解决方案1】:

一般来说,您应该能够使用任何 HTTP 客户端/库来执行此任务(因为,在幕后,一切都归结为对某些服务器进行正确的 HTTP 调用)。

它的难度在很大程度上取决于您与之交互的应用程序的设计方式(严重程度)。

在简单的场景中,您需要:

  • 登录并跟踪会话 cookie
  • 通过 POST 将数据发送到服务器

这里的示例使用 Python requests,这几乎是当今最好的选择。

让我们开始吧。

首先,您需要检查您的登录页面表单。通常看一下页面 HTML 就会为您提供有关如何构建请求的足够信息。

一个例子可以是:

<form action="/login" method="POST">
    <input type="text" name="username">
    <input type="password" name="password">
    ...
</form>

为了跟踪 cookie,我们将使用 Session 对象:

import requests
session = requests.Session()

接下来,我们将通过 POST 提交凭据(假设您的应用位于 http://example.com):

response = session.post(
    'http://example.com/login',
    data={'username': 'your_user', 'password': 'your_password'})

此时,您可以检查response.ok 以确保一切正常。如果您检查 session.cookies,您应该会看到您的会话 cookie 已设置。

从现在开始,使用该会话向您的应用发出的所有请求都将经过身份验证,因此等同于您从浏览器运行的请求。

要提交表单数据,只需开始检查应用程序的工作方式(通过检查表单获取提交 URI 和表单字段名称,就像我们对登录页面所做的那样,并使用同一会话通过 POST 提交数据)。

如果页面 HTML 很复杂,使用浏览器开发人员工具查看 HTTP 请求并通过代码复制它们也可能会有所帮助。

【讨论】:

  • 谢谢redShadow!这太棒了,正是我想要的。我只有一两个小问题。 1. 维护依赖于别人网站工作的代码有多难?如果他们更改元素名称,或者在此过程中进行任何小的更改,我相信我每次都需要更新我的应用程序。 2. 你有没有可以推荐 NodeJS 的库,或者你会推荐我坚持使用 Python 或者 Django?
  • 关于可维护性,这正是他们发明 API 的原因 :) 一般来说,您希望就系统应该如何集成有一个明确的“合同”,并有一些保证不会突然改变和破坏你的应用程序。因此,最好的长期解决方案是说服 3rd 方应用程序的作者创建一个您可以使用的适当 API。不幸的是,这并不总是可行的,因此您需要小心,并确保在出现问题时收到通知。
  • 关于 Python vs javascript/Nodejs,我个人的推荐是 Python(我有使用它们构建东西的经验,并且在几乎所有方面都非常喜欢 Python)。如果您刚刚开始使用 Web 应用程序开发,一定要看看 django,它提供了您可能需要的几乎所有东西。
【解决方案2】:

只要知道帖子要查找的帖子变量,就可以在Python2.7中使用urllib2,在python 3.5中使用urllib.requests或者requests来提交每个页面并获取结果,假设他们真的只是在提交帖子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多