Blogger Information
Blog 263
fans 3
comment 2
visits 113340
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP CURL模拟POST传递参数 网页采集
福哥的博客
Original
1518 people have browsed it

最近在做校园图书馆图书信息的采集程序,既然是图书馆图书的采集,肯定有提交搜索的页面,无非是post提交,让我想到了curl模拟提交,首先通过firebug进行抓包查询下post提交后的格式如下:

txtWxlx=CN&hidWxlx=spanCNLx&txtPY=HZ&txtTm=%D2%F4%C0%D6&txtLx=%25&txtSearchType=1&nMaxCount=100&nSetPageSize=10&cSortFld=%D5%FD%CC%E2%C3%FB&B1=%BC%EC+%CB%F7;搜索的关键字name=txtTm,随后代码如下:

<?php 
$keyword="音乐";$post="txtWxlx=CN&hidWxlx=spanCNLx&txtPY=HZ&txtTm={$keyword}&txtLx=%25&txtSearchType=1&nMaxCount=100&nSetPageSize=20&cSortFld=%D5%FD%CC%E2%C3%FB&B1=%BC%EC+%CB%F7";$url = "http://210.30.68.130/wxjs/tmjs.asp";//查询地址$ch = curl_init(); 
curl_setopt ($ch, CURLOPT_REFERER, "http://210.30.68.130/wxjs/tmjs_form.asp/ "); //模拟来源  curl_setopt($ch, CURLOPT_URL, $url);//URL  curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_POST, 1);  //模拟POST  curl_setopt($ch, CURLOPT_POSTFIELDS, $post);//POST内容  curl_exec($ch);  
$output = curl_close($ch); 
echo $output; ?>

但返回的页面总是显示没有相关内容,如果把关键字改成英语或者数字就可以正常显示了,于是想到这应该是编码问题,然后在post上面可以看到txtTm=%D2%F4%C0%D6经过查询得知这是url编码,汉字会进行转化,如果是英语则不会发生任何改变,于是就把头信息也加了部分内容进去如下:

$header = array();
$header[] = 'User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:30.0) Gecko/20100101 Firefox/30.0';
$header[] = 'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
$header[] = 'Connection: keep-alive';
$header[] = 'Content-Type:application/x-www-form-urlencoded';
curl_setopt ( $ch, CURLOPT_HTTPHEADER, $header );

其实主要是$header[] = 'Content-Type:application/x-www-form-urlencoded';再次加载页面后如果是汉字显示还是没有相关的内容,随后想到了一个很简单的问题所在,php程序是utf8的,然而图书馆的网站是gb2312,好吧,再加上一句,$keyword =  iconv('UTF-8', 'GB2312', $keyword);再次加载成功,这个应该才是问题关键所在,然后我把头信息删除后添加一句$keyword = urlencode($keyword);再次加载也就是下面的代码:

<?php $keyword="世界";
$keyword =  iconv('UTF-8', 'GB2312', $keyword);
$keyword = urlencode($keyword);
$post="txtWxlx=CN&hidWxlx=spanCNLx&txtPY=HZ&txtTm={$keyword}&txtLx=%25&txtSearchType=1&nMaxCount=100&nSetPageSize=20&cSortFld=%D5%FD%CC%E2%C3%FB&B1=%BC%EC+%CB%F7";
$url = "http://210.30.68.130/wxjs/tmjs.asp";
//查询地址
$ch = curl_init();
curl_setopt ($ch, CURLOPT_REFERER, "http://210.30.68.130/wxjs/tmjs_form.asp/ "); //模拟来源  
curl_setopt($ch, CURLOPT_URL, $url);//URL  
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_POST, 1);  //模拟POST  
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);//POST内容 
curl_exec($ch);  
$output = curl_close($ch); 
echo $output; 
?>

CURL模拟POST ,实例1:

<?php 
$uri = "http://tanteng.duapp.com/test.php"; 
// 
参数数组
 
$data = array ( 
        
'name' => 'tanteng'  
// 'pass
word
' => 'password' 
); 
  
$ch = curl_init (); 
// print_r($ch); 
curl_setopt
 ( $ch, CURLOPT_URL, $uri ); 
curl_setopt ( $ch, CURLOPT_POST, 1 ); 
curl_setopt ( $ch, CURLOPT_HEADER, 0 ); 
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 ); 
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data ); 
$return = curl_exec ( $ch ); 
curl_close ( $ch ); 
  
print_r($return); 

//接受php页面远程服务器:
 
<?php 
if(isset($_POST['name'])){ 
    
if(!empty($_POST['name'])){ 
        
echo '您好,',$_POST['name'].'!'; 
    
    } 
}

CURL模拟POST ,实例2

用CURL模拟POST请求抓取邮编与地址:

 <?php 
$runtime = new runtime (); 
$runtime->start (); 
 
$cookie_jar = tempnam('/tmp','cookie'); 
  
 
$filename = $argv[1];    
$start_num= $argv[2]; 
$end_num  = $argv[3]; 
  
 
for($i=$start_num; $i<$end_num; $i++){ 
    
$zip = sprintf('6s',$i);  
    
$fields_post = array( 
            
'postcode' => $zip,  
            
'queryKind' => 2,  
            
'reqCode' => 'gotoSearch',  
            
'search_button.x'=>37, 
            
'search_button.y'=>12 
            
); 
 
    
$fields_string = http_build_query ( $fields_post, '&' );
$ch = curl_init(); 
    
curl_setopt($ch, CURLOPT_URL, "URL?reqCode=gotoSearch&queryKind=2&postcode=".$zip); 
    
curl_setopt($ch, CURLOPT_HEADER, true); 
    
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    
curl_setopt($ch, CURLOPT_POST, true); 
    
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120 ); 
    
curl_setopt($ch, CURLOPT_REFERER, $refer ); 
    
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers_login );

curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_jar ); 
    
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar ); 
    
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);  
    
curl_setopt($ch, CURLOPT_POST, 1); // 发送一个常规的Post请求
      
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string ); 
    
$data = curl_exec($ch); 
    
preg_match_all('/id="table1">[s]*?<tr>[s]*?<td class="maintext">[sS]*?</td>[s]*?</tr>/', $data, 
$matches); 
    
if (!$handle = fopen($filename, 'a+')) { 
        echo "不能打开文件$filename"; 
        echo "n"; 
        exit; 
    } 
     
if (fwrite($handle, $matches[0][1]) === FALSE) { 
        echo "不能写入到文件$filename"; 
        echo "n"; 
        exit;    
} 
 
    echo "成功地将$somecontent 写入到文件$filename"; 
    echo "n"; 
    fclose($handle); 
    curl_close($ch); 
} 
  
 
class runtime 
{ 
    
var $StartTime = 0; 
    
var $StopTime = 0; 
    
function get_microtime() 
    
{ 
        
list($usec,$sec)=explode(' ',microtime());return((float)$usec+(float)$sec); 
    
} 
    
function start() 
    
{ 
        
$this->StartTime=$this->get_microtime(); 
    
} 
    
function stop(){ 
        
$this->StopTime=$this->get_microtime(); 
    
} 
    
function spent() 
    
{ 
        
return ($this->StopTime-$this->StartTime); 
    
} 
} 
  
 
$runtime->stop (); 
 
$con = 'Processed in'.$runtime->spent().'seconds'; 
echo 'Processed in'. $runtime->spent().'seconds';

CURL模拟POST ,实例3

模拟POST请求提交数据或上传文件

http://www.a.com/a.php 
发送POST请求
 
function execUpload(){ 
 
$file = '/doucment/Readme.txt'; 
$ch = curl_init(); 
$post_data = array( 
    
'loginfield' => 'username', 
    
'username' => 'ybb', 
    
'password' => '123456', 
'file' => '@d:usrwwww.shanxiwang.netwwtranslatedocumentReadme.txt' 
); 
curl_setopt($ch, CURLOPT_HEADER, false); 

//启用时会发送一个常规的POST请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样。
 
curl_setopt($ch, CURLOPT_POST, true);   
curl_setopt($ch,CURLOPT_BINARYTRANSFER,true); 
curl_setopt($ch, CURLOPT_POSTFIELDS,$post_data); 
curl_setopt($ch, CURLOPT_URL, 'handleUpload.php'); 
$info= curl_exec($ch); 

curl_close($ch); 
    
print_r($info); 
} 

2.http://www.b.com/handleUpload.php 
function handleUpload(){ 
print_r($_POST); 
echo '===file upload info:'; 
print_r($_FILES);

■cURL 函数

 ■curl_close —关闭一个cURL会话

 ■curl_copy_handle —复制一个cURL句柄和它的所有选项

 ■curl_errno —返回最后一次的错误号

 ■curl_error —返回一个保护当前会话最近一次错误的字符串

 ■curl_exec —执行一个cURL会话

 ■curl_getinfo —获取一个cURL连接资源句柄的信息

 ■curl_init —初始化一个cURL会话

■curl_multi_add_handle —向curl批处理会话中添加单独的curl句柄

■curl_multi_close —关闭一组cURL句柄

■curl_multi_exec —运行当前cURL 句柄的子连接

 ■curl_multi_getcontent—如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流

■curl_multi_info_read —获取当前解析的cURL的相关传输信息

■curl_multi_init —返回一个新cURL批处理句柄

■curl_multi_remove_handle — 移除curl批处理句柄资源中的某个句柄资源

■curl_multi_select—等待所有cURL批处理中的活动连接

■curl_setopt_array —为cURL传输会话批量设置选项

■curl_setopt —设置一个cURL传输选项

■curl_version —获取cURL版本信息

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post