29

このような質問を何度も見てきましたが、どれも役に立ちません

Web上のフォームにデータを送信しようとしていますが、リクエストを試みましたが、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引数ではなく引数を使用します ( URL でパラメーターを渡すdataを参照)。

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 要求が作成されます。URL をエンコードするには urllib が必要です。次に、リクエストを送信するには urllib2 が必要です。

于 2015-01-21T19:30:18.910 に答える
0

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