Goutte:如何提交带有通过Javascript填充的输入的表单

时间:2013-08-27 14:33:34

标签: php selenium web-scraping goutte

我有一个asp.net表单,我想自动提交以便刮取结果(BTW,我做的一切都是合法的)。

部分表单下拉输入字段通过ajax即时填充。一个字段是“区域”字段,一旦选择了一个区域,就会填充“城市”下拉列表。如果我在通过Goutte web-crawler输入区域后尝试输入城市,则会引发无效值错误。

这可以通过Goutte完成,还是应该使用其他东西?

目标表单本身是在带有viewstateeventvalidation字段的asp.net中编写的。

1 个答案:

答案 0 :(得分:0)

与使用客户端javascript代码大量实现的网站进行交互几乎是困难甚至是不可能的。像GoutteBrowserKit这样的无头浏览器模拟器不知道这样的客户端代码,也无法执行它。您需要使用像Selenium或Sahi这样的浏览器控制器。

看看Behat的Mink,它有无头模拟器的各种驱动程序以及成熟的浏览器控制器。使用其selenium2驱动程序,您只需与目标页面进行交互即可。这是一个例子:

<?php
// You need to run selenium-*.jar for this to work.

use Behat\Mink\{Mink, Session, Driver\Selenium2Driver};

$mink = new Mink([
    'selenium2' => new Session(
        new Selenium2Driver('firefox', null, 'http://example.com')
    ),
));

$page = $mink->getSession('selenium2')->getPage();

$page->findField('regoin-select-field-name')
     ->selectOption('target-region-value');

$page->wait(5000, 'JS code to check if the select is now populated...')
     ->select('city-select-field-name)
     ->selectOption('target-city-value');

这是未经测试的代码,但你明白了。另请参阅how wait() works

另外,您可能需要查看facebook/php-webdriver;用于selenium webdriver的PHP客户端,而不是使用Mink。