【问题标题】:Retrieving a form results with requests使用请求检索表单结果
【发布时间】:2018-01-09 00:13:12
【问题描述】:

我想提交一个 multipart/form-data 来设置TRILEGAL 上的模拟输入,并从重定向页面下载可用的文件。

我研究了请求、urllib、Grab、mechanize 等的文档,似乎在 mechanize 中我的代码是:

from mechanize import Browser
browser = Browser()
browser.open("http://stev.oapd.inaf.it/cgi-bin/trilegal")
browser.select_form(nr=0)
browser['gal_coord'] = ["2"]
browser['eq_alpha'] = ["277.981111"]
browser['eq_delta'] = ["-19.0833"]
response = browser.submit()
content = response.read()

但是,我无法测试它,因为它在 python 3 中不可用。

所以我尝试了请求:

import requests
url = 'http://stev.oapd.inaf.it/cgi-bin/trilegal'
values = {'gal_coord':"2",
        'eq_alpha':"277.981111",
        'eq_delta':"-19.0833",
        'field':" 0.047117",
          }
r = requests.post(url, files = values)

但我不知道如何进入结果页面 - 如果我这样做了

r.content

它显示我刚刚提交的表单的内容,而如果您打开实际的website,然后单击“提交”,您会看到一个新窗口(在 method="post" action="./ trilegal_1.6" )。

我怎样才能进入带有请求的新窗口(即,点击提交按钮时打开的页面),然后单击结果页面上的链接以检索结果文件(“结果将可用在此链接大约 2 分钟后。”)?

如果您能指出任何其他可以完成这项工作的工具,我将不胜感激 - 我花了几个小时在 SO 中寻找可以帮助解决这个问题的东西。

谢谢!

克里斯

【问题讨论】:

  • 您需要打开该链接才能从文件中获取数据
  • 嗨!但是什么链接?如果我打开 stev.oapd.inaf.it/cgi-bin/trilegal_1.6 它会打开输入,而不是结果页面......
  • 对,在那个页面你必须在 2 分钟后打开这个链接
  • 每次提交表单时都会生成一个新链接。我怎样才能知道链接是什么?
  • 链接存在于page source

标签: python python-requests mechanize forms robobrowser


【解决方案1】:

这是python 2.7的有效解决方案

from mechanize import Browser
from urllib import urlretrieve # for download purpose
from bs4 import BeautifulSoup

browser = Browser()
browser.open("http://stev.oapd.inaf.it/cgi-bin/trilegal")
browser.select_form(nr=0)
browser['gal_coord'] = ["2"]
browser['eq_alpha'] = ["277.981111"]
browser['eq_delta'] = ["-19.0833"]
response = browser.submit()
content = response.read()

soup = BeautifulSoup(content, 'html.parser')
base_url = 'http://stev.oapd.inaf.it'

# fetch the url from page source and it to base url
link = soup.findAll('a')[0]['href'].split('..')[1]
url = base_url + str(link)
filename = 'test.dat'

# now download the file
urlretrieve(url, filename)

您的文件将下载为test.dat。您可以使用相应的程序打开它。

【讨论】:

  • 所以实际上在运行时我得到一个关于 browser['eq_delta'] = ["-19.0833"] 的错误:TypeError: must assign a string。感谢您解决使用 mechanize 的建议,我在下面有另一个可行的答案
【解决方案2】:

我发布了一个单独的答案,因为它太混乱了。感谢@ksai,这适用于python 2.7:

import re
import time
from mechanize import Browser

browser = Browser()
browser.open("http://stev.oapd.inaf.it/cgi-bin/trilegal")
browser.select_form(nr=0) 

#set appropriate form contents 
browser['gal_coord'] = ["2"]
browser['eq_alpha'] = "277.981111"
browser['eq_delta'] = "-19.0833"
browser['field'] = " 0.047117" 
browser['photsys_file'] = ["tab_mag_odfnew/tab_mag_lsst.dat"]
browser["icm_lim"] = "3"
browser["mag_lim"] = "24.5"                                
response = browser.submit()

# wait 1 min while results are prepared
time.sleep(60)

# select the appropriate url
url = 'http://stev.oapd.inaf.it/' + str(browser.links()[0].url[3:])

# download the results file 
browser.retrieve(url, 'test1.dat')

非常感谢! 克里斯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 2021-02-01
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    相关资源
    最近更新 更多