这三个组件有各自独特的功能:
- CURL能够抓取下载HTML,能模拟登陆,伪装客户端等
- DOMDocument将下载的HTML加载成DOM
- DOMXPath使用XPath语法进行数据的定位和采集
下面是一个具体的例子代码,抓取了本博客www.crazyant.net首页所有的超链接:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <?php $target_url = "http://www.crazyant.net"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,$target_url); curl_setopt($ch, CURLOPT_FAILONERROR, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_AUTOREFERER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER,true); curl_setopt($ch, CURLOPT_TIMEOUT, 10); $html = curl_exec($ch); if (!$html) { echo "<br />cURL error number:" .curl_errno($ch); echo "<br />cURL error:" . curl_error($ch); exit; } //创建一个DomDocument对象,用于处理一个HTML $dom = new DOMDocument(); //从一个字符串加载HTML @$dom->loadHTML($html); //使该HTML规范化 $dom->normalize(); //用DOMXpath加载DOM,用于查询 $xpath = new DOMXPath($dom); #获取所有的a标签的地址 $hrefs = $xpath->evaluate("/html/body//a//@href"); for ($i = 0; $i < $hrefs->length; $i++) { $href = $hrefs->item($i); $linktext = $href->nodeValue; echo $linktext; echo "<BR>"; } ?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
<
meta
http
-
equiv
=
"Content-Type"
content
=
"text/html; charset=utf-8"
/
>
<?php
$target_url
=
"http://www.crazyant.net"
;
$ch
=
curl_init
(
)
;
curl_setopt
(
$ch
,
CURLOPT_URL
,
$target_url
)
;
curl_setopt
(
$ch
,
CURLOPT_FAILONERROR
,
true
)
;
curl_setopt
(
$ch
,
CURLOPT_FOLLOWLOCATION
,
true
)
;
curl_setopt
(
$ch
,
CURLOPT_AUTOREFERER
,
true
)
;
curl_setopt
(
$ch
,
CURLOPT_RETURNTRANSFER
,
true
)
;
curl_setopt
(
$ch
,
CURLOPT_TIMEOUT
,
10
)
;
$html
=
curl_exec
(
$ch
)
;
if
(
!
$html
)
{
echo
"<br />cURL error number:"
.
curl_errno
(
$ch
)
;
echo
"<br />cURL error:"
.
curl_error
(
$ch
)
;
exit
;
}
//创建一个DomDocument对象,用于处理一个HTML
$dom
=
new
DOMDocument
(
)
;
//从一个字符串加载HTML
@
$dom
->
loadHTML
(
$html
)
;
//使该HTML规范化
$dom
->
normalize
(
)
;
//用DOMXpath加载DOM,用于查询
$xpath
=
new
DOMXPath
(
$dom
)
;
#获取所有的a标签的地址
$hrefs
=
$xpath
->
evaluate
(
"/html/body//a//@href"
)
;
for
(
$i
=
0
;
$i
<
$hrefs
->
length
;
$i
++
)
{
$href
=
$hrefs
->
item
(
$i
)
;
$linktext
=
$href
->
nodeValue
;
echo
$linktext
;
echo
"<BR>"
;
}
?>
|
要注意点,DOMNode 类并没有getAttribute方法,所以无法根据a得到直接的属性值,这时可以用正则匹配解决,网上看到很多人直接在DOMNode 上使用了getAttribute方法竟然通过,实在是匪夷所思,如果有更好的解释,请您给我说一说,我很渴望知道怎样直接从Xpath的返回直接得到属性值。