张贴表格,然后下载其他网页

2024-04-24 17:23:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我想开发一个工具,它可以做两件事:

  1. 设置以下web窗体上的语言和日期:http://ibreviary.com/m2/opzioni.php,然后

  2. 在同一网站上下载不同页面的文本,但保留这些设置。例如,http://ibreviary.com/m2/breviario.php?s=lodi

该工具应该模仿用户正常浏览这些页面时所做的操作:设置所需的语言和日期,然后查看动态创建的结果页面。你知道吗

我以为节点.js对这项工作来说是个好工具。虽然我能够让它发布表单数据(我想),然后下载所需的页面,但我无法让服务器“记住”设置(就像在真正的web浏览器会话中发生的那样)。下载的文本始终是默认文本(今天的日期)。你知道吗

以下是我目前掌握的Javascript代码:

var FormData = require('form-data');
var request = require('request');
var http = require('http');
var fs = require('fs');

var formData = {
  lang: 'en',
  giorno: 15,
  mese: 11,
  anno: 2014
};

request.post({url:'http://www.ibreviary.com/m/opzioni.php',
              formData: formData},
             function optionalCallback(err, httpResponse, body) {
    if (err) {
      return console.error('upload failed:', err);
    }
  console.log('Upload successful!  Server responded with:', body);
  download(url, destination, function(){
    console.log("Done saving file '" + destination +
                "' downloaded from '" + url + "'");
  });
});

var url = "http://www.ibreviary.com/m/breviario.php?s=lodi";
var destination = "file.html";

var download = function(url, destination, callback) {
  var file = fs.createWriteStream(destination);
  var request = http.get(url, function(response) {
    response.pipe(file);
    file.on('finish', function() {
      file.close(callback);  // close() is async, call callback
                             // after close completes.
    });
  }).on('error', function(err) { // Handle errors
    fs.unlink(destination); // Delete the file async.
    if (callback) callback(err.message);
  });
};

如果您尝试一下,您将看到第一个request.post的输出是未更改的网页:就好像表单的发布不起作用一样。你知道吗

有什么想法吗?你知道吗


Tags: comhttpurlrequestvarcallbackfunction页面
1条回答
网友
1楼 · 发布于 2024-04-24 17:23:00

最后,我使用了Python的^{} package来做我想做的事情。你知道吗

以下是对我有效的最起码的工作示例:

#!/usr/bin/python

import re
import mechanize

optionsURI = "http://www.ibreviary.com/m2/opzioni.php"
hourURI = "http://www.ibreviary.com/m2/breviario.php?s=lodi"

br = mechanize.Browser()

# Open the options form and submit the desired data.
br.open(optionsURI)
br.select_form(nr=0)        # Select the first (and only) form on the page.
br.form["anno"] = "2014"    # year
br.form["mese"] = ["11"]    # month
br.form["giorno"] = "15"    # day
br.form["lang"] = ["en"]    # language or rite:
                            #   it, en, es, fr, pt, ro, ar, ra, la, vt
br.submit()

# Open the desired page and print to standard output.
mypage = br.open(hourURI)
print mypage.read()

相关问题 更多 >