1

我想使用twisted编写一个简单的网络客户端,它使用用户名和密码登录到一个网站,并从给定页面获取一些数据。做这个的最好方式是什么?

编辑:添加更多细节:这是一个简单的用户名/密码 HTML 表单提交。涉及一个 PHPSESSID cookie,这是一个 PHP 站点。没有验证码。没有 HTTP 身份验证。

4

1 回答 1

2

HTML 表单认证是通过提交认证表单来完成的。这意味着知道表单动作和方法。对于初学者,您可以手动阅读页面源并找出此信息。更通用的解决方案将涉及解析页面(可能使用 lxml 或 html5lib 之类的东西)并自动提取此信息。

您还需要知道表单中用户名和密码字段的名称,以及任何其他必填表单字段的名称和正确值。

例如,一个看起来像这样的表单:

<form action="https://example.com/auth" method="post">
    <input type="text" name="Email" id="Email" value="">
    <input type="password" name="Password" id="Password" value="">
</form>

有一个 的形式动作https://example.com/auth和一个 的方法post。因此,您需要POSThttps://example.com/auth.

按照惯例,此类请求中数据的编码application/x-www-form-urlencoded用作其内容类型。

您可以使用 Python stdlib 对此类请求的正文进行编码urllib.urlencode

最后,如果身份验证成功被表示为一个 cookie,必须在未来的请求中重新呈现,您需要确保捕获 cookie 的值并重新发送它。

所以,把这一切放在一起:

from twisted.web.client import getPage

cookies = {}
d = getPage(
    "https://example.com/auth",
    method="POST",
    headers={"content-type": "application/x-www-form-urlencoded"},
    postdata=urllib.urlencode(dict(Email="alice@example.com", Password="secret")),
    cookies=cookies)

字典将cookie填充服务器设置的任何 cookie 的值。getPage将它与您希望使用此身份验证结果的任何未来调用一起传递。

尽管如此,我喜欢使用scrapy的建议。它会为你做很多低级的事情,让你专注于问题中更有趣的部分。

于 2012-11-14T13:31:09.877 回答