並發網絡爬蟲(C++實現)


step1 使用socket編程技術,利用http協議,抽取網頁中的url,實現簡單的爬蟲。

socket
int socket (int domain, int type, int protocol)
功能描述:初始化創建socket對象。
socket返回值:成功返回非負數的socket描述符;失敗返回-1。socket描述符是一個指向內部數據結構的指針,它指向描述符表入口。

step2 使用bloomfilter,對爬到的url進行去重,避免重復爬取相同頁面。

step3 使用libevent的事件驅動設計模式,基於kqueue的io多路復用,加快爬蟲速度。

筆者使用Mac OS,采用kqueue(os free based)實現io多路復用。LInux下可使用epoll 。

文件描述符(file descriptor,fd)

每一個進程都在進程控制塊(PCB)中有一份文件描述符表,而文件描述符就是這個表的索引。這張表中有一項是指向file結構體,file結構體是內核中用來描述文件屬性的結構體。

Mac下安裝libevent包,以及Xcode編譯配置

1 在官網 http://libevent.org 下載最新穩定版壓縮安裝包
2 解壓並執行如下命令

sudo ./configure
sudo make  
sudo make install  

將安裝在 /user/local/ 下,include下是頭文件,lib下是動態鏈接庫之類的,bin下也有一些相關文件。

用Xcode編譯含libevent的程序,頭文件路徑和庫的查找路徑如下配置

此外,我將lib下的庫都加了進來。

編譯成功!

socket編程——bind()函數

因為step3想用listen()來偵聽一定端口的數據,故使用bind()將套接字和機器上的一定的端口關聯起來是必須的步驟。而之前的step1的實現並不需要使用bind()函數。

#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, struct sockaddr *my_addr, int addrlen);

sockfd 是調用 socket 返回的文件描述符。my_addr 是指向數據結構 struct sockaddr 的指針,它保存你的地址(即端口和 IP 地址) 信息。 addrlen 設置為 sizeof(struct sockaddr)。

參考

http://www.cnblogs.com/kefeiGame/p/7246942.html
https://www.cnblogs.com/yuqiao/p/5786427.html
https://blog.csdn.net/liufang1991/article/details/51096258


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM