2

我的问题如下: 我正在尝试编写一个通过航空公司票务网站订购流程的刮板。所以我想抓几页,这取决于页面的结果之前(我希望你明白我的意思)。我至今现在:Python&机械化:如何在连续的页面上刮取页面?

import mechanize, urllib, urllib2 

    url = 'any url' 
    br = mechanize.Browser() 
    br.set_handle_robots(False) 
    br.addheaders = [('User-agent', 'Mozilla/5.0 (Windows NT 5.2; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11')] 
    br.open(url) 
    response = br.response().read() 

    br.select_form(nr=1) 
    br.form.set_all_readonly(False) 

    ## now I am reading out the variables of form(nr=1) 

    for control in br.form.controls: 
      if not control.name: 
       print " - (type) =", (control.type) 
       continue 
      print " - (name, type, value) =", (control.name, control.type, br[control.name]) 

    ## now I am modifying the variables 
    br['fromdate'] = '2012/11/03' 
    br['todate'] = '2012/11/07' 

    ## now I am submitting the form and saving the output in the variable bookingsite 
    response = br.submit() 
    bookingsite = response.read() 

这里是我的问题:我如何使用变量bookingsite,这又包含了我要修改并提交形式,就像一个正常的网址是什么?只需设定

br.open(bookingsite) 

???还是有另一种修改和提交输出的方法(然后再次提交输出并接收新的输出页面)?

+0

从'bookingsite'提取数据不应该是一个问题,但我不明白你为什么说'bookingsite'会包含一个“表单”。它应该只包含对你提交的表单的HTML响应(即'br.submit()')你能澄清一下吗? – David

+0

嘿大卫,谢谢你的回复!这里是解释:第一个网站包含一个表格,在这里你可以输入诸如出发和到达日期,机场等详细信息,然后点击提交,你会看到第二页(预订),你可以看到所有飞机在特定日期飞往您选择的机场。在第二页上,您需要选择一个特定的航班(现在该选择以另一种形式出现,在这种情况下,每个航班/飞机都有单选按钮)。现在我需要选择一个,然后再次提交第二个页面以进入第三个页面。 – julianschnell

+0

好的 - 那么你应该可以调用'response.select_form()'并设置单选按钮,接着是'response.submit()'。 – David

回答

0

后您的初始响应response = br.submit()选择从响应对象的形式:

response.select_form() 

后你改变表单中的字段的值提交表单:

response.submit() 

附:如果您将预订网站自动化,他们很可能会使用沉重的Javascript。机械化不处理Javascript。我建议使用请求。你会很高兴你做到了。