web-dev-qa-db-ja.com

pythonを使用してWebフォームに送信する

私はこのような質問を何度も尋ねましたが、どれも役に立ちません

Web上のフォームにデータを送信しようとしています。

たとえば、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

同じ結果!これらの方法が機能しない理由を理解していないので、さまざまなサイトで試してみましたが成功しませんでしたので、誰かがこれを成功させた場合はどのように教えてください!

本当にありがとう!

25
Serial

q を使用してrequestsをURLのパラメーターとして渡したい場合は、paramsではなくdata引数を使用します。 ( URLのパラメーターの受け渡し を参照):

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

これは https://stackoverflow.com/?q=%5Bpython%5D を要求しますが、これは探しているものではありません。

POSTformにしたい。これを試して:

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

これは基本的にGET-ting https://stackoverflow.com/questions/tagged/python と同じですが、これからアイデアを得ます。

32
Johnsyweb
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が要求を送信する必要があります。

11
Rashid Feroz

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
0
Harsh Gupta