在當(dāng)今互聯(lián)網(wǎng)信息爆炸的時(shí)代,如何快速準(zhǔn)確、大規(guī)模地采集數(shù)據(jù)成為了各行各業(yè)必修的“技能”。在這個(gè)過(guò)程中,dht爬蟲以其高效、易用的特點(diǎn),受到越來(lái)越多開發(fā)者的喜愛(ài)。在php中,也有許多優(yōu)秀的dht庫(kù)可供選擇,那么我們就來(lái)一起探討一下php dht爬蟲吧。
作為一名php開發(fā)者,當(dāng)然首先要了解php dht庫(kù)的使用方法。這類庫(kù)主要分為兩種:一種是純php編寫的dht庫(kù),比如dht_php、phpdht-1;另一種是php與c++混編的dht庫(kù),比如dt7。其中,dht_php是最為常用的一種。接下來(lái),我們就以dht_php為例,看看如何進(jìn)行dht爬蟲。
$dht = new DHT_Network(); $dht->bind("0.0.0.0", 8080); $dht->setNodeId("abcdefghij0123456789"); $dht->setBootstrapNodes([ ["router.bittorrent.com", 6881], ["router.utorrent.com", 6881], ]); $dht->start();
首先,我們要?jiǎng)?chuàng)建一個(gè)dht網(wǎng)絡(luò),并綁定在本地端口上,以便其他節(jié)點(diǎn)與之通信。同時(shí),我們要設(shè)置一個(gè)節(jié)點(diǎn)id,并將其加入到已知的引導(dǎo)節(jié)點(diǎn)列表中。最后,我們調(diào)用start方法即可啟動(dòng)dht網(wǎng)絡(luò)。在進(jìn)行這些設(shè)置后,我們便可以使用dht網(wǎng)絡(luò)的lookup方法來(lái)獲取某個(gè)info_hash對(duì)應(yīng)的種子信息了。
$info_hash = "d4735e3a265e16eee03f59718b9b5d03019c07d8"; //Ubuntu 16.04 LTS (Xenial Xerus) $results = $dht->lookup(hex2bin($info_hash)); foreach ($results as $result) { echo "Found peer: {$result["ip"]}:{$result["port"]}\n"; }
上述代碼表示,我們要查找“Ubuntu 16.04 LTS (Xenial Xerus)”這個(gè)種子的信息,首先將其轉(zhuǎn)換為16進(jìn)制的字符串,然后調(diào)用lookup方法。lookup方法會(huì)返回一組節(jié)點(diǎn)列表,表示某些節(jié)點(diǎn)在分享這個(gè)種子,我們只需要遍歷這些節(jié)點(diǎn)即可獲取peer信息。
除了獲取種子信息外,我們還可以利用dht爬蟲獲取其他類型的信息。比如,我們可以通過(guò)hackbt這個(gè)dht爬蟲工具獲取一組ip地址,表示這些ip地址的主機(jī)正在下載某個(gè)特定的文件。具體來(lái)說(shuō),我們需要向dht網(wǎng)絡(luò)發(fā)送如下報(bào)文:
d1:ad2:id20:abcdefghij0123456789e1:q4:find1:t2:aa1:y1:qe
其中,id表示我們自己的節(jié)點(diǎn)id;find表示我們要查找的信息類型,可以填“get_peers”、“announce_peer”、“find_node”等;t表示transaction id,可以填"aa"、"ab"、"ac"等;而其他字段的含義,可參考bittorrent協(xié)議規(guī)范。
總之,在php中使用dht爬蟲,無(wú)疑會(huì)帶來(lái)很多方便。不過(guò),值得注意的是,對(duì)于dht算法的研究以及爬蟲代碼的改進(jìn),始終都是值得我們關(guān)注的話題。只有不斷探索、學(xué)習(xí)和應(yīng)用,才能使php dht爬蟲技術(shù)更上一層樓。