【问题标题】:PHP Goutte / CURL - Complete ASPX FormPHP Goutte / CURL - 完整的 ASPX 表单
【发布时间】:2017-03-21 06:32:23
【问题描述】:

我正在尝试从这里获取数据:https://wyobiz.wy.gov/Business/FilingSearch.aspx

我正在尝试检查商家名称是否免费。 但是这个网站是asp.net web forms,整个网站就是一个大表格。 而且我不知道如何从这个表单中获取数据。

我认为问题在于:

        '__VIEWSTATE' => '',
        '__VIEWSTATEGENERATOR' => '9E6EC73D',
        '__EVENTVALIDATION' => '',

是否可以在 PHP 中发送请求并获取返回的数据? 因为,这段代码正在返回

当前节点列表为空。

谢谢。

我的代码:

    $crawler = $client->request('GET', 'https://wyobiz.wy.gov/Business/FilingSearch.aspx');
    $form = $crawler->selectButton('Search')->form();
    $formValues = $form->getValues();
    $crawler = $client->submit($form, array(
        '__VIEWSTATE' => $formValues['__VIEWSTATE'],
        '__VIEWSTATEGENERATOR' => $formValues['__VIEWSTATEGENERATOR'],
        '__EVENTVALIDATION' => $formValues['__EVENTVALIDATION'],
        'ctl00$MainContent$myScriptManager' => 'MainContent_myScriptManager',
        'ctl00$MainContent$txtFilingName' => 'Google',
        'ctl00$MainContent$searchOpt' => 'chkSearchStartWith',
        'ctl00$MainContent$txtFilingID' => null,
    ));
    $crawler->filter('body')->each(function ($node) {
        print $node->text() . "\n";
    });

结论:Goutte SUCKS Goutte 的支持SUCKS

【问题讨论】:

  • 我开始想,这不可能……
  • $formValues['__VIEWSTATE'] 这个变量的输出是什么?它是空的吗?
  • @hassan 不,它不是空的。它返回的字符串很长。
  • 我不明白为什么它不起作用。 __VIEWSTATE , __VIEWSTATEGENERATOR, __EVENTVALIDATION 设置正确....
  • 我认为您发送的参数存在问题;您没有发送完整的必需参数

标签: php asp.net curl web-scraping goutte


【解决方案1】:

好吧,我不熟悉 goutte,但是使用这个包 w3zone/crawler 我做了一个简单的例子来废弃那个链接的内容:

安装它使用:

composer require w3zone/Crawler

然后将其用于您的情况,如下所示:

require_once __DIR__ . '/vendor/autoload.php';

use w3zone\Crawler\{Crawler, Services\phpCurl};

$crawler = new Crawler(new phpCurl);

$link = 'https://wyobiz.wy.gov/Business/FilingSearch.aspx';

$homePage = $crawler->get($link)->run();

preg_match('#<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="(.*?)"\s*/>#', $homePage['body'], $viewState);
preg_match('#<input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="(.*?)"\s*/>#', $homePage['body'], $viewGen);
preg_match('#<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="(.*?)"\s*/>#', $homePage['body' ], $eventVal);

$postData = array(
    '__VIEWSTATE' => $viewState[1],
    '__LASTFOCUS' => '',
    '__EVENTTARGET' => '',
    '__EVENTARGUMENT' => '',
    '__VIEWSTATEGENERATOR' => $viewGen[1],
    '__EVENTVALIDATION' => $eventVal[1],
    'ctl00$MainContent$myScriptManager' => 'MainContent_myScriptManager',
    'ctl00$MainContent$txtFilingName' => 'test',
    'ctl00$MainContent$searchOpt' => 'chkSearchStartWith',
    'ctl00$MainContent$txtFilingID' => '',
    'ctl00$MainContent$cmdSearch' => 'Search',
    '__ASYNCPOST' => 'true',
    'ctl00$MainContent$myScriptManager' => 'ctl00$MainContent$UpdatePanel1|ctl00$MainContent$cmdSearch',
);

$response = $crawler->post(['url' => $link, 'data' => $postData])->dumpHeaders()->run();

echo "<textarea style='width: 90%; height: 200px;'>".$response['body']."</textarea>";

【讨论】:

  • 谢谢,你试过吗?如果删除 __LASTFOCUS、__EVENTTARGET、__EVENTARGUMENT 会发生什么?
  • 不,您可以尝试,但由于它们包含空值,因此如果包含它们就可以了;
  • 这是否解决了您的问题?
  • 嘿,不,有人告诉我,这个网站有一些防止机器人搜索或其他东西的保护。我正在尝试获取更多信息。
  • 顺便说一句。你能试试这个吗?可能是我的项目有问题。
【解决方案2】:

对我来说问题是 ASP 异步响应不是 HTML - 它是包含 HTML 的文本:

<html>
1|#||4|6079|updatePanel|ctl00_MainContentPlaceHolder_ucLicenseLookup_UpdtPanelGridLookup|
                <div class="modal-window-lookup-results fade bs-example-modal-lg in">
                    <div class="modal-header">
    [...]

</html>  

因此,当 goutte 将其提供给 browser-kit 时,它会中断。痛风不烂 - 你不能喂它非 HTML 垃圾。

为了尽快解决这个问题,我刚刚做了:

$crawler = $client->request('POST', $url, $params);
// this is a broken crawler because response is not html!

$html = $client->getResponse()->getContent();
$html = substr($html, strpos($html, "<div"));
$html = substr($html, 0, strpos($html, "|hiddenField|")-3);
$html = "<!DOCTYPE html><html>$html</html>";
$crawler = new \Symfony\Component\DomCrawler\Crawler($html);
print $crawler->html();

【讨论】:

  • 请学习如何使用markdown语言来正确格式化您的输入。那个 preview 窗口的存在是有原因的 - 我很确定你不是要像这样格式化你的代码?!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
相关资源
最近更新 更多