29

我见过很多次这样的问题,但没有一个有用

我试图将数据提交到网络上的表单我尝试过请求,并且 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

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

非常感谢!

4

3 回答 3

38

如果您想q使用 URL 作为参数传递requests,请使用params参数,而不是data(请参阅在 URL 中传递参数):

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

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

你真的要POST一个表格。尝试这个:

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

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

于 2013-07-07T06:40:59.850 回答
11
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 来发送请求。

于 2015-01-21T19:30:18.910 回答
0

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

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
于 2017-07-15T11:34:43.500 回答