我們先說一下一個完整的爬蟲步驟。
爬蟲步驟分為2個階段:
1:根據初始頁面,獲取更多的待爬取頁面
2:根據頁面,獲取到自己想要的東西
當我們填入一個初始頁面時,我們需要通過某一個特定的邏輯,進行獲取更多的頁面
例如:
爬取百度頁面,我們可以通過頁碼按鈕,獲取更多頁面的html源碼:
爬取知乎用戶,我們可以通過該用戶的關注者,和粉絲爬取更多用戶界面:
獲取到了頁面html代碼之后,我們就可以根據相應的規則,獲取到自己想要的東西了。
這里我推薦http://www.querylist.cc/? 可使用jq的語法選擇html頁面的元素,非常好用
我們現在已經知道了整個爬蟲的步驟了,下一步是如何運行這個代碼。
在上一步我們可以看出,一個頁面,可能有多個待爬取頁面,如果我們每次都是取一個頁面,然后分析結果,然后再取一個頁面,分析結果
這樣會造成代碼邏輯的難以掌控。
例如:
1:分析頁面1,假設頁面1有5個待爬取頁面鏈接
2:分析頁面1結果,存儲
3:分析頁面1的第一個結果待爬取頁面2,頁面2有5個待爬取頁面鏈接
4:分析頁面2的結果,存儲
5:分析頁面1的第二個待爬取頁面3,頁面3有5個待爬取頁面鏈接。。。。。。
。。。。
這樣會造成代碼的難以控制,不好維護待爬取頁面,我們可以使用隊列的形式進行處理
1:初始頁面存入分析隊列
2:分析初始頁面1,獲取5個待爬取頁面鏈接,存入分析隊列
3:分析頁面1的結果,存入結果隊列
4:分析隊列出列頁面2,獲取5個待爬取頁面鏈接,存入分析隊列
5:分析頁面2的結果,存入結果隊列
使用隊列的情況下,邏輯將會非常的清晰,只需要每次將分析的頁面出入隊列,然后取出繼續分析即可
同樣,結果隊列只需要新增一個結果消費進程,進行處理結果數據即可
本人已經寫好了基礎的爬蟲框架,基于easyswoole,使用redis隊列進行消費。
github地址:https://github.com/tioncico/ESSpider
首先進行composer安裝
composer?up
復制produce.php命名為dev.php,增加redis配置:
<?php/**?*?Created?by?PhpStorm.?*?User:?yf?*?Date:?2019-01-01?*?Time:?20:06?*/return?[????'SERVER_NAME'?=>?"EasySwoole",????'MAIN_SERVER'?=>?[????????'LISTEN_ADDRESS'?=>?'0.0.0.0',????????'PORT'???????????=>?9501,????????'SERVER_TYPE'????=>?EASYSWOOLE_WEB_SERVER,?//可選為?EASYSWOOLE_SERVER??EASYSWOOLE_WEB_SERVER?EASYSWOOLE_WEB_SOCKET_SERVER,EASYSWOOLE_REDIS_SERVER????????'SOCK_TYPE'??????=>?SWOOLE_TCP,????????'RUN_MODEL'??????=>?SWOOLE_PROCESS,????????'SETTING'????????=>?[????????????'worker_num'????????????=>?8,????????????'task_worker_num'???????=>?8,????????????'reload_async'??????????=>?true,????????????'task_enable_coroutine'?=>?true,????????????'max_wait_time'?????????=>?3????????],????],????'TEMP_DIR'????=>?null,????'LOG_DIR'?????=>?null,????/*################?REDIS?CONFIG?##################*/????'REDIS'???????=>?[????????'host'?=>?'127.0.0.1',????????'port'?=>?'6379',????????'auth'?=>?'',????????'serialize'=>true????],];
本身自帶了某網站的爬取邏輯,直接運行即可看到:
php?easyswoole?start
現在我們說下如何爬取其他網站的步驟
<?phpnamespace?AppSpider;use?EasySwooleUtilityFile;use?QLQueryList;/**?*?Created?by?PhpStorm.?*?User:?tioncico?*?Date:?19-6-16?*?Time:?上午9:53?*/class?Event{????static?function?consume($data,?$html)????{????}????static?function?produce($data,?$html)????{????}}
首先,我們要確定,我們的初始頁面是http://moe.005.tv/moeimg/,然后我們可以根據下一頁按鈕獲取更多的頁面
static?function?produce($data,?$html){????//獲得一個queryList對象,并且防止報錯????libxml_use_internal_errors(true);????@$ql?=?QueryList::html($html);????//查詢下一頁鏈接,用于繼續爬取數據????$nextLink?=?$ql->find('.pagelist?.n')->attr('href');????RedisLogic::addProduce($nextLink);????//查詢所有需要爬取的數據,用于爬取里面的圖片????$imgConsumeList?=?$ql->find('.zhuti_w_list?li?a')->attrs('href')->all();????foreach?($imgConsumeList?as?$value)?{????????RedisLogic::addConsume([????????????'type'?=>?1,//消費標識????????????'url'??=>?$value,????????]);????}????return?true;}
現在我們需要點擊一個圖片進入,可以發現很多圖片,例如:http://moe.005.tv/78243.html
現在,我們編寫消費代碼:
?static?function?consume($data,?$html)????{????????//獲得一個queryList對象,并且防止報錯????????libxml_use_internal_errors(true);????????if?($data['type']?==?1)?{????????????//消費類型為1,則代表還不是下載圖片,需要進行二次消費????????????//查詢下一頁鏈接,用于繼續爬取數據????????????@$ql?=?QueryList::html($html);????????????$nextLink?=?$ql->find('.pagelist?.n')->attr('href');????????????$nextLink?=?HttpClientLogic::getTrueUrl($data['url'],$nextLink);????????????if?($nextLink)?{????????????????RedisLogic::addConsume([????????????????????'type'?=>?1,//消費標識????????????????????'url'??=>?$nextLink,????????????????]);????????????}????????????$imgList?=?$ql->find('.content_nr?img')->attrs('src')->all();//????????????var_dump($img);????????????foreach?($imgList?as?$img)?{????????????????RedisLogic::addConsume([????????????????????'type'?=>?2,//消費標識????????????????????'url'??=>?$img,????????????????]);????????????}????????}?elseif?($data['type']?==?2)?{????????????$urlInfo?=?parse_url($data['url']);????????????$filePath?=?EASYSWOOLE_ROOT?.?'/Temp/'?.?$urlInfo['host']?.?$urlInfo['path'];//????????????var_dump($filePath);????????????File::createFile($filePath,?$html);//????????????var_dump($data['url']);????????}????}
初始頁面鏈接可通過協程調用進行增加:
<?php/**?*?Created?by?PhpStorm.?*?User:?tioncico?*?Date:?19-6-16?*?Time:?下午5:35?*/include?"./vendor/autoload.php";EasySwooleEasySwooleCore::getInstance()->initialize();go(function?(){????AppSpiderRedisLogic::clearConsumeMap();//清除消費map????AppSpiderRedisLogic::clearProduceMap();//清除生產map????AppSpiderRedisLogic::clearConsumeList();//清除消費隊列????AppSpiderRedisLogic::clearProduceList();//清除生產隊列????//新增默認隊列????AppSpiderRedisLogic::addProduce('http://moe.005.tv/moeimg/');});
直接運行
php?easyswoole?start
即可實現爬蟲爬取頁面
github地址:https://github.com/tioncico/ESSpider
1:可通過EasySwooleEvent.php? 文件,進行配置爬取的協程數,不建議太大
2:本爬蟲沒有做ip池,需要的可自行實現
3:本爬蟲框架只適用于學習,請不要用于違法用途
本文為仙士可原創文章,轉載無需和我聯系,但請注明來自仙士可博客www.php20.cn
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
OPPOa115與a115k的區別?A115K是A115的升級版,功能和java運行能力都強很多。比如火星文的輸入和顯示,手機內置的QQ2010*/QQ瀏覽器,圖片編輯器,后臺運行Java時支持播放音樂,軟件在線升級,最新固件和搜狗輸入法的集成等等都是A115沒有的。如何區分A115和A115K:手機型號一般會在電池倉或者后蓋上注明。去看看吧。此外,還可以在待機狀態下輸入*#6776#查看手機的所...
從北京做火車到鄭州,最快幾個小時呀?目前北京至鄭州間的高速動車組列車最小時25分(G802 G588),最慢運行時間3小時56分(G1576)。北京和鄭州之間的大部分動車組列車運行時間在3小時10分鐘左右,視??空緮岛屯?繒r間而定。北京西至鄭州東高鐵列車時刻表途經路線?北京到鄭州東的高鐵因為??空静煌?,用時也不一樣。最快的列車是G71高鐵,中途??渴仪f站,1.25小時到達鄭州東。比較慢的是G33...
石家莊萬達一樓有什么品牌的化妝品?優衣庫ca hm zara。。等了很多。全國批發市場十大排名?一、義烏商貿城義烏國際商貿城地址:浙江金華義烏稠州路商貿城分為五個區域和湟源服裝市場。每個地區成立于不同時期,有自己不同的經營特點。二、山東臨沂小商品城臨沂小商品城地址:山東省臨沂市蘭山區葉公大道15-18號整個市場分為四個區域:款式、紙張、化妝品和小商品。三。河北省石家莊市南三條小商品批發市場地址...