2012-11-13 29 views
1

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

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

+1

有很多方法可以登录到网站。你需要提交一个带有用户名和密码字段的HTML表单吗?你需要填写CAPTCHA吗?你需要提供HTTP认证凭证吗?或提交身份验证Cookie,或执行OAuth登录? –

+0

我已经为我的问题添加了更多参数,但是我觉得给出一个通用的解决方案会更好,可以扩展到包含这些选项。 – Lars

+0

没有一个通用的解决方案。有十几种不同的解决方案。 –

回答

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的方法。因此,您需要向https://example.com/auth发出POST请求。

按照惯例,用于以这样的请求中的数据的编码使用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="[email protected]", Password="secret")), 
    cookies=cookies) 

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

所有这一切说,我喜欢使用scrapy的建议。它会为你做很多低级别的事情,让你专注于你的问题中更有趣的部分。

+0

这很好。我只是添加了另一个回调来请求另一个页面,并从该页面获取我想要的HTML。 Scrapy很好,但我想在一个更大的脚本中使用它,并且想要提取这个功能。谢谢! – Lars