【问题标题】:Submitting to a web form using python使用 python 提交到 web 表单
【发布时间】:2013-07-07 05:41:23
【问题描述】:

我已经看到类似的问题问了很多次,但没有一个有用

我正在尝试将数据提交到网络上的表单,我尝试过请求,但 urllib 并没有成功

例如,这里是应该在 SO 上搜索 [python] 标记的代码:

import urllib
import urllib2

url = 'http://stackoverflow.com/'

# Prepare the data
values = {'q' : '[python]'}
data = urllib.urlencode(values)

# Send HTTP POST request
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)

html = response.read()

# Print the result
print html

但是当我运行它时,我得到了主页的 html 源代码

这里是一个使用请求的例子:

import requests

data= {
    'q': '[python]'
    }
r = requests.get('http://stackoverflow.com', data=data)

print r.text

同样的结果!我不明白为什么这些方法不起作用我已经在各种网站上尝试过但没有成功,所以如果有人成功做到了,请告诉我如何!

非常感谢!

【问题讨论】:

  • 听起来像是mechanize-python 的工作!
  • 是的,我会检查一下,但我仍然想知道为什么这些不起作用!?
  • PHP 看起来更简单更直观

标签: python post request urllib2 urllib


【解决方案1】:

如果您想使用requestsq 作为URL 中的参数传递,请使用params 参数,而不是data(请参阅Passing Parameters In URLs):

r = requests.get('http://stackoverflow.com', params=data)

这将请求 https://stackoverflow.com/?q=%5Bpython%5D ,这不是您要查找的内容。

你真的想POST 到一个form。试试这个:

r = requests.post('https://stackoverflow.com/search', data=data)

这与 GET-ting https://stackoverflow.com/questions/tagged/python 基本相同,但我想你会从中得到想法。

【讨论】:

  • 哇,我试过很多,但我不知道为什么我不能得到它谢谢!
  • 为我工作。谢谢
【解决方案2】:
import urllib
import urllib2

url = 'http://www.someserver.com/cgi-bin/register.cgi'
values = {'name' : 'Michael Foord',
      'location' : 'Northampton',
      'language' : 'Python' }

data = urllib.urlencode(values)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req) 
the_page = response.read()

这会使用值中指定的数据发出 POST 请求。我们需要 urllib 对 url 进行编码,然后 urllib2 来发送请求。

【讨论】:

    【解决方案3】:

    来自 python 的 Mechanize 库也很棒,您甚至可以提交表单。您可以使用以下代码创建浏览器对象并创建请求。

    import mechanize,re
    br = mechanize.Browser()
    br.set_handle_robots(False)   # ignore robots
    br.set_handle_refresh(False)  # can sometimes hang without this
    br.addheaders = [('User-agent', 'Firefox')]             
    br.open( "http://google.com" )
    br.select_form( 'f' )
    br.form[ 'q' ] = 'foo'
    br.submit()
    resp = None
    
    for link in br.links():
        siteMatch = re.compile( 'www.foofighters.com' ).search( link.url )
    
        if siteMatch:
            resp = br.follow_link( link )
            break
    
    content = resp.get_data()
    print content
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      • 1970-01-01
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      • 2016-09-25
      相关资源
      最近更新 更多