freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

網(wǎng)絡(luò)爬蟲(chóng)論word版(參考版)

2025-01-10 18:09本頁(yè)面
  

【正文】 符號(hào)可以忽略執(zhí)行時(shí)的錯(cuò)誤,從而繼續(xù)下一條命令。其中 rm 前加 39。 rm ./Pages/*.html 參數(shù)解釋如下: all: 常用于指明要執(zhí)行的對(duì)象; CPPFLAGS : 用來(lái)標(biāo)明編譯時(shí)的附加參數(shù); $(OBJ): 用來(lái)取 OBJ 的值; spider: 生成的應(yīng)用程序名; lpthread: 編譯多線程文件必須加上; $: 依賴目標(biāo)中的第一個(gè)目標(biāo)名字, $^表示所有依賴 ; .PHONY: 用來(lái)指明假想的工作目標(biāo); 廣東石油化工學(xué)院本科畢業(yè) (設(shè)計(jì) )論文 : Linux 平臺(tái)下 C/C++網(wǎng)絡(luò)爬蟲(chóng)的設(shè)計(jì)與實(shí)現(xiàn) 26 .cpp: cpp 文件; .o: .o 文件; .: 意為把 .cpp 文件轉(zhuǎn)換為 .o 文件 clean: 使用 make clean 命令可以刪除 .o 文件; cleanall: 除了刪除 .o 文件,還要清空 Pages 下的網(wǎng)頁(yè)。 在本例子中涉及如下文件: // 主文件 , main 函數(shù)入口 // 包含與 socket 通信有關(guān)的函數(shù) // 的頭文件 // 包含與 URLs, Pages 有關(guān)的函數(shù) // 的頭文件 // 配置文件 總共 6 個(gè)文件 , 不算多 , 因此 Makefile 文件也不算復(fù)雜 , 內(nèi)容如下 : all: spider CPPFLAGS = O Wall lpthread OBJ = spider: $(OBJ) g++ o spider $(OBJ) $(CPPFLAGS) .: g++ c $ .PHONY: clean cleanall clean: rm spider *.o cleanall: make clean amp。quelock)。 ()。quelock)。 int pthread_mutex_unlock(pthread_mutex_t *mptr)。鎖創(chuàng)建好了,那么如何使用呢? POSIX 使用了兩個(gè)函數(shù)用來(lái)上鎖和解鎖。 pthread_mutex_t connlock = PTHREAD_MUTEX_INITIALIZER。 // used to count pending events 通過(guò)定義 pthread_mutex_t 類型的變量 quelock, connlock 來(lái)創(chuàng)建鎖,在使用它們之前必須初始化。 在程序中,有一些被定義了全局的變量,它們都是不允許同時(shí)操作的: queueURLque。 在多線程條件下,某一變量(大多是全局變量),某個(gè)函數(shù)可能會(huì)同時(shí)被多個(gè)線程操作和訪問(wèn),但它們又不允許被同時(shí)操作,如何才能兩全呢?方法有多種,比如信號(hào)量,互斥鎖等。 多線程能提高程序的運(yùn)行效率,但它同時(shí)也會(huì)造成程序崩潰,所以必須合理使用多線程,搭配使用。pAttr)。pAttr, GetResponse, arg)。 int r = pthread_create(amp。 pthread_attr_setdetachstate(amp。 pthread_attr_setstacksize(amp。 pthread_attr_init(amp。 ): pthread_attr_t pAttr。 參數(shù): status 常設(shè)為 NULL。在本程序中,并沒(méi)有調(diào)用此函數(shù),而是在線程屬性的設(shè)置中把線程設(shè)定為可脫離的。 返回: 成功返回 0,出錯(cuò)返回一個(gè)正的錯(cuò)誤指示 。 include int pthread_detach(pthread_t tid)。 arg 是為 func 準(zhǔn)備的參數(shù),需要自己指定,若無(wú)參數(shù),則可以用 NULL 代替。 attr 為線程屬性。 include int pthread_create(pthread_t *tid, const pthread_attr_t *attr, void *(*func)(void *), void *arg)。 POSIX 多線程及其使用 ( 1) POSIX 介紹 POSIX 線程,也稱 Pthread。 } } } 上文 while 循環(huán)為 epoll 處理事件的核心,它通過(guò) epoll_wait 得到等待隊(duì)列中的事件,然后在循環(huán)內(nèi)處理事件(通過(guò)使用多 線程技術(shù),繼續(xù)注冊(cè)事件,實(shí)現(xiàn)并行處理,將在下一節(jié)做詳細(xì)介紹),最后注銷已處理的事件。 perror(epoll_ctl_del)。ev) == 1) { epoll_ctl(epfd, EPOLL_CTL_MOD, argsockfd, amp。 in。 int n = epoll_wait(epfd, events, 10, 2022)。 廣東石油化工學(xué)院本科畢業(yè) (設(shè)計(jì) )論文 : Linux 平臺(tái)下 C/C++網(wǎng)絡(luò)爬蟲(chóng)的設(shè)計(jì)與實(shí)現(xiàn) 22 if(epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, amp。 = arg。 argurl = url_t。 in。 程序框架如下(摘自 ,參考 blogs): epfd = epoll_create(50)。 ( 2) EPOLL 在程序中的使用 在文中,使用 EPOLL 模型 來(lái)實(shí)現(xiàn)非阻塞式的 I/O,在使用之前必須設(shè)置 sockfd 為非阻塞類型。 timeout:超時(shí)時(shí)間(毫秒)。 events 是用于回傳代處理事件的數(shù)組。 返回: 返回需要處理的事件數(shù)目,如返回 0 表示超時(shí)。 event 是指向 epoll_event 的指針,告訴內(nèi)核需要監(jiān)聽(tīng)什么事。 op 表 示 要 操 作 的 事 件 , 有 EPOLL_CTL_ADD , EPOLL_CTL_MOD ,POLL_CTL_DEL。 返回: 如果調(diào)用成功返回 0,不成功返回 1。 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)。 參數(shù) size:能夠最大監(jiān)聽(tīng)的 socket fd 數(shù)目。 在 epoll 中,首先需要了解的有三個(gè)函數(shù): int epoll_create(int size)。 EPOLL 模型及其使用 ( 1) EPOLL 模型介紹 在 Linux 網(wǎng)絡(luò)編程中,大家常用的是多路復(fù)用 IO 接口 select/poll 來(lái)觸發(fā)事件,在這里介紹它的增強(qiáng)版 epoll。 // set nonblocking if (ftl(sockfd, F_SETFL, opts) 0) return 1。 // get file_flag and access model if (opts 0) return 1。 // SetNoblocking 函數(shù)(摘自 ) int SetNoblocking(const intamp。 } 在文本使用的爬蟲(chóng)中, gethostbyname 函數(shù)只需調(diào)用一次,因?yàn)楸疚那疤崾窃谕挥蛎伦ト【W(wǎng)頁(yè)。 返回: 成功返回非空指針,反之則為 NULL。函數(shù)原型: include struct hostent *gethostbyname(const char *hostname)。 返回: 成功返回 0,反之返回 1。函數(shù)原型: include int close(int sockfd)。其中需要注意格式的要求,比如空格,回車(chē)換行等,最后四個(gè)字符(兩個(gè)回車(chē),兩個(gè)換行)表示命令的結(jié)束。這樣的矛盾一直存在, 只不過(guò)從道德層面上來(lái)講,還是加上用戶代理這個(gè)選項(xiàng)。其中的 Uagent 也可以不指定,雖然不推薦這樣做。 } send += d。 int d, total = (), send = 0。 在本文中, write 函數(shù)的使用是在爬蟲(chóng)向服務(wù)器發(fā)送請(qǐng)求這一環(huán)節(jié),這里順便了解一下請(qǐng)求的具體內(nèi)容,詳見(jiàn)以下代碼(摘自 ): string Uagent = UAGENT, Conn = CONN, Accept = ACCEPT。 返回: 返回實(shí)際寫(xiě)入的字節(jié)數(shù),出錯(cuò)返回 1,錯(cuò)誤信息存放在 errno 中。 參數(shù): fd 為文件描述符;第二個(gè)指定要讀入的 buf 指針指向的內(nèi)存,第三個(gè)參數(shù)表明要讀取的字節(jié)數(shù)。 include ssize_t read(int fd, void * buf , size_t count)。 return 1。 例( 摘自 ) if(connect(sockfd, (struct sockaddr *)(amp。 = *((struct in_addr *)Hosth_addr)。 = AF_INET。 bzero(amp。函數(shù)原型 [7]: include sys/ int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen)。兩者版本不同,但差別微小。 例(摘自 ): if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == 1) { return 1。 type 指明 套接字類型,有 SOCK_STREAM, SOCK_DGRAM 等。 返回: 若成功則返回非負(fù)描述符,否則返回 1。 ( 1) socket() 函數(shù) 要進(jìn)行網(wǎng)絡(luò) I/O 操作,第一件要做的事就是調(diào)用 socket()函數(shù)。要注意的是,如果不及時(shí)關(guān)閉 Socket 文件描述符,有時(shí)會(huì)出現(xiàn) ―open too many files‖的系統(tǒng)錯(cuò)誤,這是由于系統(tǒng)對(duì)用戶同時(shí)打開(kāi)多個(gè)文件的限制(這里的文件不僅僅指通常意義上的文件, Linux 會(huì)把任何東西都當(dāng)做文 件,包括目錄、各類描述符等)。在連接和斷開(kāi)連接之間,客戶端和服務(wù)器即可進(jìn)行雙向的信息通信。 Linux socket 通信 本文中的 socket 通信基于 TCP,因此有必要提一下 TCP 的連接和斷開(kāi)過(guò)程。 本文以上代碼雖然使用了不推薦的 goto 語(yǔ)句,因?yàn)槌绦蛐枰^(guò) write 函數(shù)。 廣東石油化工學(xué)院本科畢業(yè) (設(shè)計(jì) )論文 : Linux 平臺(tái)下 C/C++網(wǎng)絡(luò)爬蟲(chóng)的設(shè)計(jì)與實(shí)現(xiàn) 16 代碼中使用 stat 函數(shù)來(lái)讀取參數(shù)為文件名的文件信息,其中我們需要的就是 st_size這個(gè)成員的內(nèi)容,它以字節(jié)形式記錄了文件的大小。有時(shí)候在網(wǎng)絡(luò)狀況不理想的情況下,爬蟲(chóng)抓取有些網(wǎng)頁(yè)時(shí)會(huì)導(dǎo)致請(qǐng)求超時(shí),或抓取內(nèi)容不全,因此為了完善抓取內(nèi)容,可以進(jìn)行下一次重復(fù)抓取,其抓取條件為: 該文件不存在,則直接進(jìn)行抓??;該文件已經(jīng)存在且當(dāng)前抓取的內(nèi)容多與上次抓 取的,則覆蓋上次保存的文件;其它情況,放棄。 NEXT: close(fd)。 goto NEXT。 goto NEXT。 else { fd = open(().c_str(), O_RDWR|O_TRUNC, 00770)。 int len = 。 /* check whether needs refetch */ if(fd 0) { if(errno == EEXIST) { stat(().c_str(), amp。 chdir(Pages)。本文代碼如下: 定義: setunsigned intSet; 使用: (hashVal); 網(wǎng)頁(yè)存儲(chǔ) 第四章 網(wǎng)絡(luò)爬蟲(chóng)模 型的設(shè)計(jì)與實(shí)現(xiàn) 15 前面爬蟲(chóng)已經(jīng)抓取到了一張網(wǎng)頁(yè),并且進(jìn)行了重定向處理。 在 cplusplus 這樣介紹: set 是一種存放唯一性元素的關(guān)聯(lián)容器,它里面的每一個(gè)元素都稱為關(guān)鍵字,它由二叉搜索樹(shù)實(shí)現(xiàn)。這樣待抓取隊(duì)列里的 URL 越來(lái)越多,并且好多都是重復(fù)的。大家知道,一個(gè)網(wǎng)站中的鏈 接非常多,抽象出來(lái)就是一個(gè)巨大的蜘蛛網(wǎng),類似與圖論中的無(wú)向圖。調(diào)用后的效果如下: a herf=‖‖ ‖‖title/a 這樣處理不僅屏蔽了 ‖‖,也避免了刪除原有鏈接等不必要操作,一定程度上提高了代碼的效率。 對(duì)于原來(lái)的鏈接 a herf=‖‖title/a,假設(shè)現(xiàn)在重命名該網(wǎng)頁(yè)為 ,那么如何 處理怎么才能轉(zhuǎn)化成新的鏈接呢?方法有很多,比如可以通過(guò)覆蓋和移動(dòng),使得兩個(gè)引號(hào)直接的內(nèi)容為 。 之前,爬蟲(chóng)已經(jīng)抓取了一些網(wǎng)頁(yè)并存放在了一個(gè)名為 Pages 的文件夾中,而且其中的每個(gè)網(wǎng)頁(yè)都進(jìn)行了重命名處理(本文直接以 的字符串哈希值作文保存網(wǎng)頁(yè)的文件名)。在此使用了一個(gè)標(biāo)記變量( flag)來(lái)區(qū)分以上三種情況。 廣東石油化工學(xué)院本科畢業(yè) (設(shè)計(jì) )論文 : Linux 平臺(tái)下 C/C++網(wǎng)絡(luò)爬蟲(chóng)的設(shè)計(jì)與實(shí)現(xiàn) 14 網(wǎng)頁(yè)分析 ( 1) URL 提取 考慮到網(wǎng)頁(yè)中的鏈接格式主要是: a herf=‖xxx‖title/a,因此本文通過(guò) string 自身封裝的 find 函數(shù)來(lái)找到每一個(gè) ‖herf‖的位置,接下來(lái)的情況稍微有些復(fù)雜,分為三種情況。有人可能會(huì)問(wèn),為什么不直接存放到文件中,而要保存到臨時(shí)數(shù)組中呢?解釋是:因?yàn)橄乱徊椒治鼍W(wǎng)頁(yè)時(shí),有個(gè) URL 重定向的過(guò)程,程序還會(huì)繼續(xù)修改 tmp數(shù)組。當(dāng)讀到 ?‘字符時(shí)才開(kāi)始正式記錄網(wǎng)頁(yè)內(nèi)容。 爬取網(wǎng)頁(yè) 在分析網(wǎng)頁(yè)之前,首先網(wǎng)頁(yè)需要被抓取下來(lái),分析一下數(shù)據(jù)從服務(wù)器保存到本地的過(guò)程。 (
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1