【问题标题】:Sending a POST with mechanize and requests.发送带有机械化和请求的 POST。
【发布时间】:2013-10-06 09:38:50
【问题描述】:

我正在尝试使用 mechanize 发送 POST,但是我的代码有时无法正常工作(我知道为什么)。我用过mechanize、twill 和requests。对于机械化和斜纹布,它正在工作,而对于要求,它不是。可能我做错了。

我的机械化代码。以下作品:

#!/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]

据我了解,机械化或斜纹首先获取页面,填写表格并发送表格。但这里的问题是,有时目标页面显示随机页面,没有任何形式。在那种情况下,我得到一个错误,显然是因为没有表格可以显示。我不想处理这个错误,因为我已经知道帖子 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。所以我用斜纹布去了同一页,做了showforms,发现令牌有一些价值:

这就是我想要的:

  1. 使用机械化和请求执行 POST(无需先下载页面)
  2. 如何处理 CSRF 令牌?
  3. 如何调试“urlopen 错误 [Errno 61] 连接被拒绝”

【问题讨论】:

    标签: python csrf python-requests mechanize-python twill


    【解决方案1】:

    我已经成功使用了下面的代码:

    params = {u'user_login': self.USER, u'password':self.PASSWORD}
    data = urllib.urlencode(params)
    request = mechanize.Request( loginURL )
    response = mechanize.urlopen(request, data=data)
    

    为了处理 CSRF 令牌问题,我在控制器中添加了以下行:

    skip_before_filter :verify_authenticity_token, :only => [:create]
    

    为了保持请求之间的会话,我使用了 cookiesJar。但是您可以从您的请求中检索 CSRF 令牌并将其保存在您的应用程序中,并将其添加到每个新请求中。

    【讨论】:

      【解决方案2】:

      必须检索表单页面才能获取会话 cookie 和 csrf 令牌。

      连接被拒绝错误可能是由于您通过自动方式发布到登录页面而被站点阻止。

      【讨论】:

      • @avi 听起来你的 IP 被屏蔽了。您应该尝试从其他主机或获取新 IP(即重置您的 adsl 路由器)。
      • 我试过了,但没有成功。而且我的其他斜纹代码也可以正常工作
      • 可能是用户代理。您是否尝试将用户代理更改为已知浏览器之一? requests.get(url, headers={'User-Agent': '...'}).
      • 是的,我也尝试过使用用户代理。这是代码:pastie.org/8368647
      • 这真的很奇怪。它是否可以使用 curl/wget 进行简单的 GET 操作?斜纹使用代理还是什么? python代码不是通过代理运行的吗?
      猜你喜欢
      • 2021-03-12
      • 2016-06-09
      • 2011-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-27
      • 2020-03-22
      相关资源
      最近更新 更多