使用Python登录网站,填写表单,然后退出。

31

作为提高Python技能的一部分,我现在正在尝试登录一个我经常访问的网站并给自己发送一条私信,然后退出。目前为止,我已经成功登录(使用urllib、cookiejar和urllib2)。但是,我无法弄清楚如何填写所需的表单以发送消息。

该表单位于/messages.php?action=send。发送消息需要填写三个文本字段,分别是name、title和message。此外,还有一个提交按钮(名为“submit”)。

我应该如何填写这个表单并发送它?


可能是重复的问题:通过Python脚本(非测试)填写网页上的表单值 - ravi404
5个回答

16
import urllib
import urllib2

name =  "name field"
data = {
        "name" : name 
       }

encoded_data = urllib.urlencode(data)
content = urllib2.urlopen("http://www.abc.com/messages.php?action=send",
        encoded_data)
print content.readlines()

只需将 http://www.abc.com/messages.php?action=send 替换为您的表单提交的 URL。

回复评论:如果该 URL 是您的表单所在的 URL,并且您只需要针对一个网站执行此操作,请查看页面的源代码并查找。

<form method="POST" action="some_address.php">

将此地址作为urllib2.urlopen的参数。

您必须意识到submit按钮的作用。 它只是向表单中定义的action URL发送一个Http请求。 因此,您要做的就是使用urllib2模拟这个请求。


抱歉,它是包含表格的页面。 (由于我的iPod愚蠢,继续在下一条评论中) - Matthew
谢谢!看起来这个方法会有效。我明天试一下 - 这样会提交表单吗,还是我需要在数据列表中加入“submit”? - Matthew

16

您可以使用Mechanize轻松处理此操作。这将简化您提交表单的工作。不要忘记通过查看HTML表单的源代码来检查参数,例如名称、标题和消息。

import mechanize
br = mechanize.Browser()
br.open("http://mywebsite.com/messages.php?action=send")
br.select_form(nr=0)
br.form['name'] = 'Enter your Name'
br.form['title'] = 'Enter your Title'
br.form['message'] = 'Enter your message'
req = br.submit()

14
你需要使用 mechanize 库。它可以帮助你轻松自动化浏览网站和提交表单/跟踪链接的过程。我提供的链接网站有相当不错的示例和文档。

我已经安装好了,我会试着玩一下!谢谢 :D - Matthew
当我尝试导入 mechanize 时,出现以下错误:Traceback (most recent call last): File "<pyshell#7>", line 1, in <module> import mechanize File "C:\Users\Admin\Desktop\WinPython-64bit-3.6.1.0Qt5\python-3.6.1.amd64\lib\site-packages\mechanize_init_.py", line 119, in <module> from _version import version ModuleNotFoundError: 找不到名为 '_version' 的模块 - girl101

3
尝试解析所发出的请求 (例如使用Chrome网络开发者工具或Firefox/Firebug),并模仿包含所需表单数据的POST请求。除了Andrew提到的出色机械库外,我还建议您使用BeautifulSoup解析HTML。如果您不想使用机械库但仍希望使用简单、干净的解决方案创建HTTP请求,我推荐优秀的requests模块。

2
要向网页发布数据,使用cURL,像这样:
curl -d Name="Shrimant" -d title="Hello world" -d message="Hello, how are you" -d Form_Submit="Send" http://www.example.com/messages.php?action=send
“-d”选项告诉cURL下一个项目是要发送到http://www.example.com/messages.php?action=send服务器的一些数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接