本人qq羣也有許多的技術文檔,但願能夠爲你提供一些幫助(非技術的勿加)。
QQ羣: 281442983 (點擊連接加入羣:http://jq.qq.com/?_wv=1027&k=29LoD19) QQ:1542385235php
最簡單的爬蟲模型應該是這樣的:給一個初始url,爬蟲把內容扒下拉,找頁面裏的url,在以這些url爲起點,開始爬。html
下面是一個最簡單的php實現的爬蟲模型。web
- <?php
- /**
- * 爬蟲程序 -- 原型
- *
- * BookMoth 2009-02-21
- */
- /**
- * 從給定的url獲取html內容
- *
- * @param string $url
- * @return string
- */
- function _getUrlContent($url){
- $handle = fopen($url, "r");
- if($handle){
- $content = stream_get_contents($handle,1024*1024);
- return $content;
- }else{
- return false;
- }
- }
- /**
- * 從html內容中篩選連接
- *
- * @param string $web_content
- * @return array
- */
- function _filterUrl($web_content){
- $reg_tag_a = '/<[a|A].*?href=[\'\"]{0,1}([^>\'\"\ ]*).*?>/';
- $result = preg_match_all($reg_tag_a,$web_content,$match_result);
- if($result){
- return $match_result[1];
- }
- }
- /**
- * 修正相對路徑
- *
- * @param string $base_url
- * @param array $url_list
- * @return array
- */
- function _reviseUrl($base_url,$url_list){
- $url_info = parse_url($base_url);
- $base_url = $url_info["scheme"].'://';
- if($url_info["user"]&&$url_info["pass"]){
- $base_url .= $url_info["user"].":".$url_info["pass"]."@";
- }
- $base_url .= $url_info["host"];
- if($url_info["port"]){
- $base_url .= ":".$url_info["port"];
- }
- $base_url .= $url_info["path"];
- print_r($base_url);
- if(is_array($url_list)){
- foreach ($url_list as $url_item) {
- if(preg_match('/^http/',$url_item)){
- //已是完整的url
- $result[] = $url_item;
- }else {
- //不完整的url
- $real_url = $base_url.'/'.$url_item;
- $result[] = $real_url;
- }
- }
- return $result;
- }else {
- return;
- }
- }
- /**
- * 爬蟲
- *
- * @param string $url
- * @return array
- */
- function crawler($url){
- $content = _getUrlContent($url);
- if($content){
- $url_list = _reviseUrl($url,_filterUrl($content));
- if($url_list){
- return $url_list;
- }else {
- return ;
- }
- }else{
- return ;
- }
- }
- /**
- * 測試用主程序
- *
- */
- function main(){
- $current_url = "http://hao123.com/";//初始url
- $fp_puts = fopen("url.txt","ab");//記錄url列表
- $fp_gets = fopen("url.txt","r");//保存url列表
- do{
- $result_url_arr = crawler($current_url);
- if($result_url_arr){
- foreach ($result_url_arr as $url) {
- fputs($fp_puts,$url."\r\n");
- }
- }
- }while ($current_url = fgets($fp_gets,1024));//不斷得到url
- }
- main();
- ?>
固然這隻爬蟲還須要進行下面的進化才能夠:shell
一、拼接更準確的url連接。如今的連接有多是格式錯誤的。多線程
二、可以去掉重複的url連接。如今的爬蟲會作很是多很是多的重複工做。測試
三、避免爬蟲怕成環路,一個永遠右轉的車,只能是300內環,它只會跑在三環路上,去不了別的地方。url
四、多線程或者多進程。由於php沒有線程的概念,因此可能須要shell這樣的東西來模擬了。線程
本人qq羣也有許多的技術文檔,但願能夠爲你提供一些幫助(非技術的勿加)。
QQ羣: 281442983 (點擊連接加入羣:http://jq.qq.com/?_wv=1027&k=29LoD19) QQ:1542385235htm
個人淘寶店,能夠進去逛逛噢:https://shop108912636.taobao.com/index.htm?spm=2013.1.w5001-7867000954.3.1d29318dPlLar7&scene=taobao_shop進程