curl no puede publicar datos en la página php
asp.net web-scraping (3)
¿Tal vez te están redirigiendo después del POST inicial?
Pruebe lo siguiente:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
Esto debería ignorar cualquier redirección.
Opciones adicionales de CURL que pueden ayudarte a depurar:
CURLOPT_MAXREDIRS
CURLOPT_POSTREDIR
Referencia:
Estoy intentando publicar un valor en un formulario para obtener datos de una página aspx, pero no puedo obtener datos
Primera URL que se abrirá:
$url="https://www.clarkcountycourts.us/Anonymous/default.aspx"
(las cookies se establecen aquí)Segunda URL de la que tenemos que buscar datos
$url3 ="https://www.clarkcountycourts.us/Anonymous/Search.aspx"
Cuando publico datos obtengo html de la página 3 en lugar de datos de la página 2
A continuación está mi código, ¿qué me estoy perdiendo? por favor guíame.
<?php
$url="https://www.clarkcountycourts.us/Anonymous/default.aspx";
$cookie="cookie.txt";
$url3 ="https://www.clarkcountycourts.us/Anonymous/Search.aspx";
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie);
curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookie); // <-- add this line
curl_setopt ($ch, CURLOPT_REFERER, $url);
$result = curl_exec ($ch);
$SearchBy = "2";
$AttorneySearchMode="Name";
$LastName= "Smith";
$FirstName= "William";
$MiddleName ="";
$CaseStatusType= "0";
$SortBy= "fileddate";
$DateFiledOnAfter = "";
$DateFiledOnBefore = "";
$SearchSubmit ="Search";
$fields = array(
''SearchBy'' => urlencode($SearchBy),
''AttorneySearchMode'' => urlencode($AttorneySearchMode),
''LastName'' => urlencode($LastName),
''FirstName'' => urlencode($FirstName),
''MiddleName'' => urlencode($MiddleName),
''CaseStatusType'' => urlencode($CaseStatusType),
''SortBy'' => urlencode($SortBy),
''DateFiledOnAfter'' => urlencode($DateFiledOnAfter),
''DateFiledOnBefore'' => urlencode($DateFiledOnBefore),
''SearchSubmit'' => urlencode($SearchSubmit)
);
$fields_string = "";
foreach ($fields as $key=>$value) {
$fields_string .= $key.''=''.$value.''&'';
}
$fields_string = rtrim($fields_string, ''&'');
curl_setopt($ch, CURLOPT_URL, $url3);
curl_setopt($ch, CURLOPT_HEADER, true );
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);
$result2 = curl_exec ($ch);
print_r($result2);
Tienes dos cosas pasando aquí.
No está utilizando el contenedor de cookies correctamente.
CURLOPT_COOKIEJAR
se usa cuando desea almacenar cookies establecidas desde un servidor. cURL no funciona como un navegador programable de esta manera. Si desea establecer la sesión (cookie), la primera solicitud utilizaCURLOPT_COOKIEJAR
y las solicitudes posteriores usaríanCURLOPT_COOKIEFILE
CURLOPT_COOKIEJAR
cookies deCURLOPT_COOKIEJAR
se ponen en el contenedor desde el servidor.
CURLOPT_COOKIEFILE
cookies deCURLOPT_COOKIEFILE
se envían desde el archivo de cookies al servidor.Usar
CURLOPT_COOKIEJAR
más allá de la primera conexión al servidor simplemente sobrescribirá el bote de galletas cada vez.
Las cookies y cURL han sido una fuente constante de frustración para mí, así que puedo estar haciendo un gran trato con respecto a este primer punto.
Cuando realizo búsquedas manuales en este servidor, los formularios se publican en urls como este:
Además, cuando PUBLICO el formulario en mi navegador, también hay muchos otros campos que se envían.
Algunos de estos parecen importantes: __VIEWSTATE
, __EVENTVALIDATION
, __VIEWSTATEGENERATOR
.
__EVENTTARGET:
__EVENTARGUMENT:
__VIEWSTATE:/wEPDwULLTE3NDQ0MTE0OTgPZBYCZg9kFgICAQ8WAh4HVmlzaWJsZWgWAgIDDw9kFgIeB29ua2V5dXAFJnRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnRvTG93ZXJDYXNlKCk7ZGSj5Ki6eeFgaBABR8RCqLZPLI/WZw==
__VIEWSTATEGENERATOR:B40748C4
__EVENTVALIDATION:/wEWAgKmuqaTBQKYxoa5CF+xFBuOB81vr2zAb/xD7VZ3+CQV
SearchBy:2
CaseSearchMode:CaseNumber
CaseSearchValue:
CitationSearchValue:
CourtCaseSearchValue:
PartySearchMode:Name
AttorneySearchMode:Name
LastName:Smith
FirstName:William
cboState:AA
MiddleName:
DateOfBirth:
DriverLicNum:
CaseStatusType:0
DateFiledOnAfter:
DateFiledOnBefore:
chkCriminal:on
chkFamily:on
chkCivil:on
chkProbate:on
chkDtRangeCriminal:on
chkDtRangeFamily:on
chkDtRangeCivil:on
chkDtRangeProbate:on
chkCriminalMagist:on
chkFamilyMagist:on
chkCivilMagist:on
chkProbateMagist:on
DateSettingOnAfter:
DateSettingOnBefore:
SortBy:fileddate
SearchSubmit:Search
SearchType:PARTY
SearchMode:NAME
NameTypeKy:ALIAS
BaseConnKy:AT
StatusType:true
ShowInactive:
AllStatusTypes:true
CaseCategories:
RequireFirstName:False
CaseTypeIDs:
HearingTypeIDs:
SearchParams:SearchBy~~Search By:~~Attorney~~Attorney||AttorneyNameOption~~Party Search Mode:~~Name~~Name||LastName~~Last Name:~~Smith~~Smith||FirstName~~First Name:~~William~~William||AllOption~~Case Status:~~0~~All||selectSortBy~~Sort By:~~Filed Date~~Filed Date
Conclusión
Creo que tendrá que cargar la página de búsqueda para obtener los valores para colocar en algunos de estos campos ocultos (analizar la página) y luego volver a enviar la página de búsqueda como un POST con los campos ocultos completados.
Tardó un tiempo en descifrar esto, pero el siguiente código debe repetir los resultados después de la búsqueda en base a su consulta original de William Smith como abogado. Espero que esto tenga sentido ...
define(''ROOT'',''c:/wwwroot'');
$url_base=''https://www.clarkcountycourts.us'';
$url_login=$url_base.''/Anonymous/Login.aspx?ReturnUrl=/Anonymous/default.aspx'';
$url_start=$url_base.''/Anonymous/default.aspx'';
$url_search=$url_base.''/Anonymous/Search.aspx?ID=200&NodeID=101,103,104,105,500,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,797,798&NodeDesc=All%20Courts'';
$cookiejar=tempnam( sys_get_temp_dir(), ''cookiejar_'' );
$lastname=''smith'';
$firstname=''william'';
$formparams=array(
''__VIEWSTATEGENERATOR'',
''__EVENTVALIDATION'',
''__EVENTTARGET'',
''__EVENTARGUMENT'',
''__VIEWSTATE''
);
$stdparams=array(
''SearchBy'' => ''2'',
''AttorneySearchMode'' => ''Name'',
''LastName'' => $lastname,
''FirstName'' => $firstname,
''MiddleName'' => '''',
''CaseStatusType'' => ''0'',
''SortBy'' => ''fileddate'',
''DateFiledOnAfter'' => '''',
''DateFiledOnBefore'' => '''',
''SearchSubmit'' => ''Search'',
''CaseSearchMode'' => ''CaseNumber'',
''CaseSearchValue'' => '''',
''CitationSearchValue'' => '''',
''CourtCaseSearchValue'' => '''',
''PartySearchMode'' => ''Name'',
''cboState'' => ''AA'',
''DateOfBirth'' => '''',
''DriverLicNum'' => '''',
''chkCriminal'' => ''on'',
''chkFamily'' => ''on'',
''chkCivil'' => ''on'',
''chkProbate'' => ''on'',
''chkDtRangeCriminal'' => ''on'',
''chkDtRangeFamily'' => ''on'',
''chkDtRangeCivil'' => ''on'',
''chkDtRangeProbate'' => ''on'',
''chkCriminalMagist'' => ''on'',
''chkFamilyMagist'' => ''on'',
''chkCivilMagist'' => ''on'',
''chkProbateMagist'' => ''on'',
''DateSettingOnAfter'' => '''',
''DateSettingOnBefore'' => '''',
''SearchType'' => ''PARTY'',
''SearchMode'' => ''NAME'',
''NameTypeKy'' => ''ALIAS'',
''BaseConnKy'' => ''AT'',
''StatusType'' => ''true'',
''ShowInactive'' => '''',
''AllStatusTypes'' => ''true'',
''CaseCategories'' => '''',
''RequireFirstName'' => ''False'',
''CaseTypeIDs'' => '''',
''HearingTypeIDs'' => ''''
);
/* A fudge I know, manually build this param - I think it might be constructed using javascript on submission */
$stdparams[''SearchParams'']=''SearchBy~~Search+By:~~Attorney~~Attorney||AttorneyNameOption~~Party+Search+Mode:~~Name~~Name||LastName~~Last+Name:~~''.$lastname.''~~''.$lastname.''||FirstName~~First+Name:~~''.$firstname.''~~''.$firstname.''||AllOption~~Case+Status:~~0~~All||selectSortBy~~Sort+By:~~Filed+Date~~Filed+Date '';
/* Initialise curl and set basic options */
$curl=curl_init();
if( parse_url( $url_base,PHP_URL_SCHEME )==''https'' ){
curl_setopt( $curl, CURLOPT_SSL_VERIFYHOST, 2 );
curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt( $curl, CURLOPT_CAINFO, realpath( ROOT . ''/cacert.pem'' ) );
}
curl_setopt( $curl, CURLINFO_HEADER_OUT, true );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $curl, CURLOPT_FOLLOWLOCATION, true );
curl_setopt( $curl, CURLOPT_AUTOREFERER, true );
curl_setopt( $curl, CURLOPT_USERAGENT, ''Mozilla/5.0 (Windows NT 6.1; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0'' );
curl_setopt( $curl, CURLOPT_HTTPHEADER, array(''Host: ''.parse_url( $url_login,PHP_URL_HOST ),''Connection: keep-alive'') );
/* Stage 1 - Get initial page to obtain session cookies etc and store in cookiejar...mmmmm, cookies! */
curl_setopt( $curl, CURLOPT_URL, $url_login );
curl_setopt( $curl, CURLOPT_COOKIEJAR, $cookiejar );
curl_setopt( $curl, CURLOPT_COOKIESESSION, true );
$res=curl_exec( $curl );
/* Step 2 - GET form page and analyse input elements */
curl_setopt( $curl, CURLOPT_URL, $url_search );
curl_setopt( $curl, CURLOPT_AUTOREFERER, true );
curl_setopt( $curl, CURLOPT_COOKIEFILE, $cookiejar );
curl_setopt( $curl, CURLOPT_COOKIESESSION, false );
$res=curl_exec( $curl );
/* utility class that simplifies getting DOMDocument with error checking etc */
$dom=new htmldom( $res );
$html=$dom->gethtml();
$col=$html->getElementsByTagName(''input'');
/* we need to know values for specific fields - add to array of params to be submitted */
foreach( $col as $index => $node ){
if( in_array( $node->getAttribute(''name''), $formparams ) ) {
$stdparams[ $node->getAttribute(''name'') ]=$node->getAttribute(''value'');
}
}
/* Not sure how the ''SearchParams'' field value is calculated so calculated manually above..... */
/* Stage 3 - POST */
/* Prepare search query */
$info=$res='''';
$querystring=http_build_query( $stdparams, '''', ''&'' );
curl_setopt( $curl, CURLOPT_URL, $url_search );
curl_setopt( $curl, CURLOPT_REFERER, $url_search );
curl_setopt( $curl, CURLOPT_COOKIEFILE, $cookiejar );
curl_setopt( $curl, CURLOPT_COOKIESESSION, false );
curl_setopt( $curl, CURLOPT_POST, true );
curl_setopt( $curl, CURLOPT_POSTFIELDS, $querystring );
$res=curl_exec( $curl );
$info=curl_getinfo( $curl );
/* The final search results - you could manipulate the dom to get specific items if you wished */
echo ''<pre>'';
print_r( $res );
echo ''</pre>'';
/* Close curl */
curl_close( $curl );
Para completar, la clase de utilidad mencionada anteriormente.
class htmldom{
private $html;
public function __construct( $data=false, $convert=true ){
try{
if( !$data ) return false;
libxml_use_internal_errors( true );
$this->html = new DOMDocument(''1.0'',''utf-8'');
$this->html->validateOnParse=false;
$this->html->standalone=true;
$this->html->preserveWhiteSpace=true;
$this->html->strictErrorChecking=false;
$this->html->substituteEntities=false;
$this->html->recover=true;
$this->html->formatOutput=false;
$this->html->loadHTML( $convert ? mb_convert_encoding( $data, ''utf-8'' ) : $data );
$parse_errs=serialize( libxml_get_last_error() );
libxml_clear_errors();
}catch( Exception $e ){
die( $e->getMessage() );
}
}
public function gethtml(){
return $this->html;
}
}