过去几天我一直试图抓一个网站,但到目前为止没有运气。
情况如下: 我试图抓取的网站需要先前提交的表格中的数据。我已经识别了Web应用程序所需的变量,并调查了原始Web应用程序发送的HTTP标头。
由于我在ASP.net中几乎没有任何知识,所以我想问我是否在这里遗漏了一些东西。
我尝试了不同的方法(CURL,获取内容和Snoopy类),这是我的卷曲方法代码:
<?php
$url = 'http://www.urltowebsite.com/Default.aspx';
$fields = array('__VIEWSTATE' => 'averylongvar',
'__EVENTVALIDATION' => 'anotherverylongvar',
'A few' => 'other variables');
$fields_string = http_build_query($fields);
$curl = curl_init($url);
curl_setopt_array
(
$curl,
array
(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => 0, // Not supported in PHP
CURLOPT_SSL_VERIFYHOST => 0, // at this time.
CURLOPT_HTTPHEADER =>
array
(
'Content-type: application/x-www-form-urlencoded; charset=utf-8',
'Set-Cookie: ASP.NET_SessionId='.uniqid().'; path: /; HttpOnly'
),
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $fields_string,
CURLOPT_FOLLOWLOCATION => 1
)
);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>
请求了以下标头:
请求标题
表格数据
响应标头
当我调查我编写的CURL脚本的标题时,不知何故不会生成表单数据请求。请求方法也不设置为POST。这就是我在哪里出错的地方,但不知道。
任何帮助表示赞赏!!!
编辑:我忘了提到抓取的结果是远程网站的自定义会话过期页面。
答案 0 :(得分:1)
由于__VIEWSTATE
和__EVENTVALIDATION
是基本的64个字符数组,我在这些字段中使用了urlencode()
:
$fields = array('__VIEWSTATE' => urlencode( $averylongvar ),
'__EVENTVALIDATION' => urlencode( $anotherverylongvar),
'A few' => 'other variables');
对我来说很好。
答案 1 :(得分:0)
由于VIEWSTATE包含特定情况下页面的状态(并且所有这些状态都被编码成一个很大的,显然是凌乱的字符串),你无法确定你正在抓取的参数对于你的“模拟”是一样的“请求(我很确定它不能相同;)。”。
如果你真的需要处理VIEWSTATE和EVENTVALIDATION参数,我的建议是采用另一种方法,即通过Selenium或HtmlUnit类似的库来抓取内容(但不幸的是我不知道PHP中是否有类似内容) 。
答案 2 :(得分:0)