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