2013-07-07 53 views
17

Tôi đã thấy những câu hỏi như thế này hỏi rất nhiều lần nhưng không ai là hữu íchNộp mẫu web bằng python

Im cố gắng để gửi dữ liệu mẫu trên ive web cố gắng yêu cầu, và urllib và không đã làm việc

ví dụ ở đây là mã mà nên tìm kiếm cho [python] thẻ trên SO:

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 

nhưng khi tôi chạy nó tôi nhận được soure html của trang chủ

đây là ví dụ về việc sử dụng các yêu cầu:

import requests 

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

print r.text 

cùng một kết quả! tôi không hiểu tại sao những phương pháp này không làm việc tôi đã thử chúng trên các trang web khác nhau với không thành công vì vậy nếu có ai đã làm điều này thành công xin vui lòng chỉ cho tôi như thế nào!

Cảm ơn bạn rất nhiều!

+0

Nghe như một công việc cho [tag: mechanize-python]! – Johnsyweb

+0

vâng kiểm tra bệnh mà ra nhưng tôi vẫn tự hỏi tại sao những wont làm việc !? – Serial

Trả lời

19

Nếu bạn muốn vượt qua q như một tham số trong URL sử dụng requests, dùng tham số params, không data (xem Passing Parameters In URLs):

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

này sẽ yêu cầu https://stackoverflow.com/?q=%5Bpython%5D, mà không phải là những gì bạn đang tìm kiếm.

Bạn thực sự muốn POST thành biểu mẫu. Hãy thử điều này:

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

Đây thực chất là giống như GET -ting https://stackoverflow.com/questions/tagged/python, nhưng tôi nghĩ bạn sẽ nhận được các ý tưởng từ này.

+2

wow mà thực sự làm việc tôi đã cố gắng rất nhiều bu i didnt biết tại sao tôi couldnt nhận được nó nhờ! – Serial

+1

Làm việc cho tôi. Cảm ơn – MegaBytes

9
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() 

Điều này làm cho yêu cầu POST có dữ liệu được chỉ định trong giá trị. chúng tôi cần urllib để mã hóa url và sau đó urllib2 gửi yêu cầu.

+0

Điều này chính xác giống như những gì op có ... – KindaTechy

0

Cơ chế thư viện từ python cũng rất tuyệt vời cho phép bạn gửi biểu mẫu. Bạn có thể sử dụng mã sau để tạo đối tượng trình duyệt và tạo yêu cầu.

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