我想写使用双绞线一个简单的Web客户端,即登录到网站的用户名和密码,并从给定的页面抓取一些数据。做这个的最好方式是什么?登录到网页使用双绞线网络
编辑:要添加一些更多的细节:这是一个简单的用户名/密码的HTML表单提交。有一个PHPSESSID cookie涉及这是一个PHP网站。没有验证码。没有HTTP认证。
我想写使用双绞线一个简单的Web客户端,即登录到网站的用户名和密码,并从给定的页面抓取一些数据。做这个的最好方式是什么?登录到网页使用双绞线网络
编辑:要添加一些更多的细节:这是一个简单的用户名/密码的HTML表单提交。有一个PHPSESSID cookie涉及这是一个PHP网站。没有验证码。没有HTTP认证。
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的建议。它会为你做很多低级别的事情,让你专注于你的问题中更有趣的部分。
这很好。我只是添加了另一个回调来请求另一个页面,并从该页面获取我想要的HTML。 Scrapy很好,但我想在一个更大的脚本中使用它,并且想要提取这个功能。谢谢! – Lars
有很多方法可以登录到网站。你需要提交一个带有用户名和密码字段的HTML表单吗?你需要填写CAPTCHA吗?你需要提供HTTP认证凭证吗?或提交身份验证Cookie,或执行OAuth登录? –
我已经为我的问题添加了更多参数,但是我觉得给出一个通用的解决方案会更好,可以扩展到包含这些选项。 – Lars
没有一个通用的解决方案。有十几种不同的解决方案。 –