php抓取网页连接函数( HttpClient类实现了3个方法,一个用于普通的get请求)
优采云 发布时间: 2022-03-17 14:27php抓取网页连接函数(
HttpClient类实现了3个方法,一个用于普通的get请求)
我承认有很多很好的实现,但是自己还是使用Curl实现了一个简单的页面抓取类,主要用到了Curl 和 simple_html_dom, 直接上代码:
class HttpClient {
private $cookiePath = "d:/my.cookie";
/**
* HTTP GET
* @param unknown $url
* @return mixed
*/
public function request($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_COOKIEJAR, $this->cookiePath);
curl_setopt($ch, CURLOPT_COOKIEFILE, $this->cookiePath);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
/**
* download file
* @param unknown $url
* @param unknown $target
* @return boolean
*/
public function download($url, $target) {
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_CUSTOMREQUEST, 'GET' );
curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, false );
curl_setopt($ch, CURLOPT_COOKIEFILE, $this->cookiePath);
curl_setopt ( $ch, CURLOPT_URL, $url );
ob_start ();
curl_exec ( $ch );
$return_content = ob_get_contents ();
ob_end_clean ();
$return_code = curl_getinfo ( $ch, CURLINFO_HTTP_CODE );
$filename = $target;
unlink($filename);
$fp= @fopen($filename,"a"); //将文件绑定到流
fwrite($fp,$return_content); //写入文件
return true;
}
/**
* post data to remote url
* @param unknown $url
* @param unknown $params
* @return mixed
*/
public function post($url, $params) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_COOKIEJAR, $this->cookiePath);
curl_setopt($ch, CURLOPT_COOKIEFILE, $this->cookiePath);
$result=curl_exec($ch);
curl_close($ch);
return $result;
}
}
HttpClient类实现了三种方法,一种是普通的get请求,一种是下载文件,一种是POST数据,比如提交登录表单,因为保存了cookie信息,所以基本可以模拟浏览浏览器的一些操作设备。
simple_html_dom是一个解析HTML的简单实现,类似于jquery或者Css选择器获取HTML文件中的内容,很简单:
$client = new HttpClient();
$url ='http://www.sample.com/list.do';
$result = $client->request($url);
$dom = str_get_html($result);
$titles = array();
$records = array();
foreach($dom->find("table.ti_b th") as $th) {
//var_dump($th);
if($th) {
$titles[] = $th->innertext;
}
}
foreach($dom->find("table.ti_b td") as $td) {
if($td) {
$records[] = $td->innertext;
}
}
使用 str_get_html() 从 HTML 字符串创建 dom 对象。当然,你也可以使用 simple_html_dom 中的 file_get_html() 从 URL 或文件中获取 dom 对象。使用dom对象,可以像jquery一样读取标签数据。