概述
現在爬蟲技術算是一個普遍的技術了,各個語言的爬蟲百家爭鳴,但是根據筆者自己的感覺還是python是主流。爬蟲涉及到太多的東西,筆者並不是專業的爬蟲工程師,只不過個人興趣分享一下。由於筆者是php工作,所以就使用php來進行簡單爬蟲。不過我的方法應該是很通用的,我相信java,C#等肯定有類似的函數,然后做法其實都一樣了。
技術准備
看懂這段代碼你需要對php的正則表達式函數以及正則表達式有一定的理解。
代碼 注意實際代碼就這么多
<?php
//這個是你網頁正則匹配出來的字符串
$str = '<div class="title">
<h3><span>[小組] </span> <a href="鏈接內容1" target="_blank">標簽內容1</a></h3>
<div class="info">
237059 成員
</div>
</div>
<div class="title">
<h3><span>[小組] </span> <a href="鏈接內容2" target="_blank">標簽內容2</a></h3>
<div class="info">
237059 成員
</div>
</div>';
//這個是正則的輸出結果
preg_match_all('/<div class="title">[\s\S]*?<h3>[\s\S]*?<a href="(.*?)"[\s\S]*?>(.*?)<\/a>/',$str,$match);
print_r($match);//根據打印的結果很明白了吧
//這個方法就是抓取網頁內容的方法了可以吧需要抓取的頁面傳進去,然后正則匹配內容哦
function getUrlContent($url){//通過url獲取html內容
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_USERAGENT,"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1 )");
curl_setopt($ch,CURLOPT_HEADER,1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
?>
到這里就可以匹配你想要的數據了,如果還是不懂,就繼續往下瞅瞅
流程圖
簡單的爬蟲,特殊字符處理就不進行了,保證插入數據庫不出錯就行了
思路
首先getUrlContent($url)函數,只需要穿一個url地址就行了,當然了因為各個網站都有反扒機制,不過筆者的這個函數並不是萬能的,但是在豆瓣測試過,其他網站大家自行測試了。
任何網站都可以理解為一個很長的字符串,如果對html有研究無非就是:
<html>
<head>XXX</head>
<body>XXX</body>
</html>
我們需要的只是將body標簽里的東西拿出來,筆者模擬了一段body里的代碼
<html>
<head>XXX</head>
<body>
<div class="title">
<h3><span>[小組] </span> <a href="鏈接內容1" target="_blank">標簽內容1</a></h3>
<div class="info">
237059 成員
</div>
</div>
<div class="title">
<h3><span>[小組] </span> <a href="鏈接內容2" target="_blank">標簽內容2</a></h3>
<div class="info">
237059 成員
</div>
</div>
</body>
</html>
對於這段代碼,可以理解為一個很長的字符串
$str = '<html>
<head>XXX</head>
<body>
<div class="title">
<h3><span>[小組] </span> <a href="鏈接內容1" target="_blank">標簽內容1</a></h3>
<div class="info">
237059 成員
</div>
</div>
<div class="title">
<h3><span>[小組] </span> <a href="鏈接內容2" target="_blank">標簽內容2</a></h3>
<div class="info">
237059 成員
</div>
</div>
</body>
</html>';
對這段字符串,只需要進行正則匹配拿出你想要的,假如需要a標簽里的href與內容
preg_match_all('/<div class="title">[\s\S]*?<h3>[\s\S]*?<a href="(.*?)"[\s\S]*?>(.*?)<\/a>/',
$str,$match);
然后如果你不認識這段正則表達式還有preg_match_all函數,這里筆者就簡單說下了,[\s\S]*?代表懶惰匹配任意字符,因為標簽之間會用空格符換行符,這里又出現新問題什么叫懶惰匹配,簡單來說就是匹配最少的內容。(.*?)代表非空字符,加括號的原因簡單來說就是括號里的內容是你想要的,前面的[\s\S]*?匹配到的是一堆特殊符號,並沒有什么作用,你不用把特殊符號記錄下來,所以不加括號。
最后打印結果,也就是$match數組。
Array
(
[0] => Array
(
[0] => <div class="title">
<h3><span>[小組] </span> <a href="鏈接內容1" target="_blank">標簽內容1</a>
[1] => <div class="title">
<h3><span>[小組] </span> <a href="鏈接內容2" target="_blank">標簽內容2</a>
)
[1] => Array
(
[0] => 鏈接內容1
[1] => 鏈接內容2
)
[2] => Array
(
[0] => 標簽內容1
[1] => 標簽內容2
)
)
根據這個數組,需要什么自己遍歷數組,然后拼裝sql語句,插入到自己的數據庫中即可。但是插入過程中可能會有一些單引號雙引號搗亂,所以你用str_replace()把他們替換掉,或者加轉義符號。
總結
只是針對php進行的簡單爬蟲,不過爬蟲的思路我相信很多種語言都用得到。不過很多網站的內容是通過js返回的,或者需要登陸才能獲取到數據,這些比較高級的部分,有興趣的推薦自學python爬蟲。
本文轉載自https://blog.csdn.net/qq_35370923/article/details/82901220