我试着用mechanize发送一篇文章,但是我的代码有时不起作用(我知道原因)。我使用机械化,斜纹布和要求。有了机械化和斜纹布,它就工作了,有了要求,它就不工作了。可能我做错了。
我的机械化代码。以下工作:
#!/usr/bin/env python
import sys
import urllib
import mechanize
from mechanize import ParseResponse, urlopen, urljoin
response = urlopen(url)
forms = ParseResponse(response, backwards_compat=False)
form = forms[0]
form["username"] = "avi"
form["password"] = "stackoverflow"
urlopen(form.click())
我的斜纹代码。它还可以工作:
import os
import twill
from twill.commands import *
out = open(os.devnull,"w")
twill.set_output(out)
go(url)
formvalue("1", "username", "avi")
formvalue("1", "password", "stackoverflow")
submit()
go(url2) #some protected page
content = show()
print 'content is',content[:100]
据我所知,mechanize或twill首先获取页面,填充表单并发送表单。但这里的问题是,有时目标页显示随机页,没有任何形式。在这种情况下,我得到一个错误,显然是因为没有表格显示。我不想处理这个错误,因为我已经知道post URL。即使显示了一些随机页面,但在我单击“下一步”之后,也会加载相同的表单。POST url、字段都保持不变。所以我想直接发送POST请求,因为我已经知道所需的所有细节。这是我的代码,based on:
browser = mechanize.Browser()
parameters = {"username" : "avi",
"password" : "stackoverflow",
}
data = urllib.urlencode(parameters)
browser.open(post_url,data)
cool = browser.open(post_url + '%s' % data).read()
print cool
我得到一个错误:
urllib2.URLError: <urlopen error [Errno 61] Connection refused>
我也试过同样的要求。但我也犯了同样的错误。代码如下:
import requests
from requests import session
payload = { 'username': 'avi','password': 'stackoverflow'}
url1 = 'http://example.com/login.php'
url2 = 'http://example.com/protected.php'
with session() as c:
c.post(url1, data=payload)
c.get(url2)
所以我到处戳,在网上看了很少的代码,我认为这不起作用,因为要防止CSRF。所以我和twill上了同一页,做了展示,看到了一些象征的价值:
我想要的是:
您必须检索表单页才能获取会话cookies和csrf令牌。
“连接被拒绝”错误可能是由于您通过自动方式发布到登录页而被网站阻止所致。
我成功地使用了下面的代码:
为了处理CSRF令牌问题,我在控制器中添加了以下行:
为了保持请求之间的会话,我使用cookiesJar。但您可以从请求中检索CSRF令牌并将其保存在应用程序中,将其添加到每个新请求中。
相关问题 更多 >
编程相关推荐