首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google-Forms响应与Python?

Google-Forms响应与Python?
EN

Stack Overflow用户
提问于 2013-07-31 15:41:47
回答 4查看 25.8K关注 0票数 12

我正在尝试编写一个Python脚本,它可以在谷歌表单中提交响应,如下所示:https://docs.google.com/forms/d/152CTd4VY9pRvLfeACOf6SmmtFAp1CL750Sx72Rh6HJ8/viewform

但是我怎么才能真正发送这篇文章,我怎么才能找到这篇文章应该包含的内容呢?

EN

回答 4

Stack Overflow用户

发布于 2013-07-31 16:39:44

第一个pip install requests

你必须张贴一些特定的表单数据到一个特定的url,你可以使用requests.The form_data dict params对应于选项,如果你不需要一些选项,只需从form_data中删除它。

代码语言:javascript
复制
import requests
url = 'https://docs.google.com/forms/d/152CTd4VY9pRvLfeACOf6SmmtFAp1CL750Sx72Rh6HJ8/formResponse'
form_data = {'entry.2020959411':'18+ sollte absolute Pflicht sein',
            'entry.2020959411':'Alter sollte garkeine Rolle spielen',
            'entry.2020959411':'17+ wäre für mich vertretbar',
            'entry.2020959411':'16+ wäre für mich vertretbar',
            'entry.2020959411':'15+ wäre für mich vertretbar',
            'entry.2020959411':'Ausnahmen von der Regel - Dafür?',
            'entry.2020959411':'Ausnahmen von der Regel - Dagegen?',
            'entry.2020959411':'__other_option__',
            'entry.2020959411.other_option_response':'test',
            'draftResponse':[],
            'pageHistory':0}
user_agent = {'Referer':'https://docs.google.com/forms/d/152CTd4VY9pRvLfeACOf6SmmtFAp1CL750Sx72Rh6HJ8/viewform','User-Agent': "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36"}
r = requests.post(url, data=form_data, headers=user_agent)
票数 24
EN

Stack Overflow用户

发布于 2018-08-03 23:03:04

根据@pigletfly的回答,我编写了一个小脚本来获取字段名称(仅用于文本字段表单)

代码语言:javascript
复制
import urllib.request
from bs4 import BeautifulSoup
import requests, warnings
def get_questions(in_url):
    res = urllib.request.urlopen(in_url)
    soup = BeautifulSoup(res.read(), 'html.parser')
    get_names = lambda f: [v for k,v in f.attrs.items() if 'label' in k]
    get_name = lambda f: get_names(f)[0] if len(get_names(f))>0 else 'unknown'
    all_questions = soup.form.findChildren(attrs={'name': lambda x: x and x.startswith('entry.')})
    return {get_name(q): q['name'] for q in all_questions}
def submit_response(form_url, cur_questions, verbose=False, **answers):
    submit_url = form_url.replace('/viewform', '/formResponse')
    form_data = {'draftResponse':[],
                'pageHistory':0}
    for v in cur_questions.values():
        form_data[v] = ''
    for k, v in answers.items():
        if k in cur_questions:
            form_data[cur_questions[k]] = v
        else:
            warnings.warn('Unknown Question: {}'.format(k), RuntimeWarning)
    if verbose:
        print(form_data)
    user_agent = {'Referer':form_url,
                  'User-Agent': "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36"}
    return requests.post(submit_url, data=form_data, headers=user_agent)

然后,您可以使用get_questions函数来获取可以填充的字段

代码语言:javascript
复制
TEST_FORM_URL = "https://docs.google.com/forms/d/e/1FAIpQLSfBmvqCVeDA7IZP2_mw_HZ0OTgDk2a0JN4VlY5KScECWC-_yw/viewform"

anno_questions = get_questions(TEST_FORM_URL)

获取问题(字段)作为字典

代码语言:javascript
复制
{'annotator': 'entry.756364489',
 'task': 'entry.1368373366',
 'item_id': 'entry.84713541',
 'label': 'entry.2072511216',
 'session': 'entry.2021127767',
 'time': 'entry.1122475936'}

然后使用带有关键字参数的submit_response提交

代码语言:javascript
复制
submit_response(TEST_FORM_URL, anno_questions, annotator="TestUser", item_id = 0)
票数 6
EN

Stack Overflow用户

发布于 2013-07-31 15:49:04

我会使用urllib2urllib来发送帖子。

这样做:

代码语言:javascript
复制
import urllib2, urllib
import cookielib

cookieJar = cookielib.LWPCookieJar()
opener = urllib2.build_opener(
    urllib2.HTTPCookieProcessor(self.cookieJar), # Create Opener
    urllib2.HTTPRedirectHandler(),
    urllib2.HTTPHandler(debuglevel=0))

# Add Headers                    
opener.addheaders = [('User-agent', "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36")]


forms = {
             "formname": value,  # The forms name and the selected value you want
             "formname2": value2,
        }

data = urllib.urlencode(forms) # Encode data
req = urllib2.Request('http://www.example.com',data) # Send Request
res = opener.open(req) # Open Request
html = res.read() # Read Response

你应该像这样构造它。

要获得表单名称,您需要查看站点的源代码,并找到要输入和提交的表单的名称。

希望这能有所帮助

祝你好运:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17964429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档