<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      linux c++爬蟲(一)

        1 int main(int argc, void *argv[]) 
        2 {
        3     struct epoll_event events[10];
        4     int daemonized = 0;
        5     char ch;
        6  
        7     
      8 while ((ch = getopt(argc, (char* const*)argv, "vhd")) != -1) { 9 switch(ch) { 10 case 'v': 11 version(); 12 break; 13 case 'd': 14 daemonized = 1; 15 break; 16 case 'h': 17 case '?': 18 default: 19 usage(); 20 } 21 } 22 23 24 g_conf = initconfig(); 25 loadconfig(g_conf); 26 27 28 set_nofile(1024); 29 30 31 vector<char *>::iterator it = g_conf->modules.begin(); 32 for(; it != g_conf->modules.end(); it++) { 33 dso_load(g_conf->module_path, *it); 34 } 35 36 37 if (g_conf->seeds == NULL) { 38 SPIDER_LOG(SPIDER_LEVEL_ERROR, "We have no seeds!"); 39 } else { 40 int c = 0; 41 char ** splits = strsplit(g_conf->seeds, ',', &c, 0); 42 while (c--) { 43 Surl * surl = (Surl *)malloc(sizeof(Surl)); 44 surl->url = url_normalized(strdup(splits[c])); 45 surl->level = 0; 46 surl->type = TYPE_HTML; 47 if (surl->url != NULL) 48 push_surlqueue(surl); 49 } 50 } 51 52 53 if (daemonized) 54 daemonize(); 55 56
      57 chdir("download"); 58 59 60 int err = -1; 61 if ((err = create_thread(urlparser, NULL, NULL, NULL)) < 0) { 62 SPIDER_LOG(SPIDER_LEVEL_ERROR, "Create urlparser thread fail: %s", strerror(err)); 63 } 64 65 /* waiting seed ourl ready */ 66 int try_num = 1; 67 while(try_num < 8 && is_ourlqueue_empty()) 68 usleep((10000 << try_num++)); 69 70 if (try_num >= 8) { 71 SPIDER_LOG(SPIDER_LEVEL_ERROR, "NO ourl! DNS parse error?"); 72 } 73 74 /* set ticker */ 75 if (g_conf->stat_interval > 0) { 76 signal(SIGALRM, stat); 77 set_ticker(g_conf->stat_interval); 78 } 79 80 /* begin create epoll to run */ 81 int ourl_num = 0; 82 g_epfd = epoll_create(g_conf->max_job_num); 83 84 while(ourl_num++ < g_conf->max_job_num) { 85 if (attach_epoll_task() < 0) 86 break; 87 } 88 89 /* epoll wait */ 90 int n, i; 91 while(1) { 92 n = epoll_wait(g_epfd, events, 10, 2000); 93 printf("epoll:%d\n",n); 94 if (n == -1) 95 printf("epoll errno:%s\n",strerror(errno)); 96 fflush(stdout); 97 98 if (n <= 0) { 99 if (g_cur_thread_num <= 0 && is_ourlqueue_empty() && is_surlqueue_empty()) { 100 sleep(1); 101 if (g_cur_thread_num <= 0 && is_ourlqueue_empty() && is_surlqueue_empty()) 102 break; 103 } 104 } 105 106 for (i = 0; i < n; i++) { 107 evso_arg * arg = (evso_arg *)(events[i].data.ptr); 108 if ((events[i].events & EPOLLERR) || 109 (events[i].events & EPOLLHUP) || 110 (!(events[i].events & EPOLLIN))) { 111 SPIDER_LOG(SPIDER_LEVEL_WARN, "epoll fail, close socket %d",arg->fd); 112 close(arg->fd); 113 continue; 114 } 115 116 epoll_ctl(g_epfd, EPOLL_CTL_DEL, arg->fd, &events[i]); /* del event */ 117 118 printf("hello epoll:event=%d\n",events[i].events); 119 fflush(stdout); 120 create_thread(recv_response, arg, NULL, NULL); 121 } 122 } 123 124 SPIDER_LOG(SPIDER_LEVEL_DEBUG, "Task done!"); 125 close(g_epfd); 126 return 0; 127 }

      本項(xiàng)目主要進(jìn)行網(wǎng)頁的抓取,上述為主控制模塊

       

       while ((ch = getopt(argc, (char* const*)argv, "vhd")) != -1) {

      主要作用為命令行參數(shù)的解析,根據(jù)命令行參數(shù)我們判斷是一些額外輸出信息和以什么方式進(jìn)行(ps:守護(hù)進(jìn)成)


       24     g_conf = initconfig();
       25     loadconfig(g_conf);


      進(jìn)行初始化配置,對log配置進(jìn)行加載,
      log配置包含了一些抓取深度,種子,動(dòng)態(tài)庫路徑等等之類的信息
      下面主要是一些需要抓取前加載的配置文件
      cur_thread_num.
      max_job_num=1
      seeds=http://www.imeiding.com
      logfile=spiderq.log
      
      # Set the level to log. The probable values list as follow:
      #   0 DEBUG
      #   1 INFO
      #   2 WARN
      #   3 ERROR
      #   4 CRIT
      log_level=0
      
      max_depth=0
      
      module_path=/etc/spider/modules/
      
      load_module=savehtml
      load_module=saveimage
      load_module=maxdepth
      load_module=domainlimit
      load_module=headerfilter
      
      
      # specify which type of resource we accept. Each one a line.
      # text/html is accepted default
      accept_types=image/jpeg

       

      我們將動(dòng)態(tài)庫都存在vector里面,以便后續(xù)使用
      但是在讀取配置文件的時(shí)候我們不要忘記字符串的處理,比如,空行,注釋行#,空格,=劃分等等問題

      接下來設(shè)置守護(hù)進(jìn)程,以便使任務(wù)脫離終端控制,

      創(chuàng)建線程,通過libevent進(jìn)行dns解析,,開啟epoll任務(wù),向epoll中注冊事件,模式為ET模式,不斷的等待內(nèi)核中epoll事件的觸發(fā)并進(jìn)行處理

      通過開啟線程進(jìn)行http請求,手寫http頭部,進(jìn)行發(fā)送給server端一個(gè)http請求報(bào)文

      http協(xié)議請求頁面時(shí)的流程:

      1、 輸入網(wǎng)址

      2、 DNS發(fā)送解析請求

      3、 DNS返回給我們一個(gè)對應(yīng)的IP地址

      4、 通過IP地址向資源所在的主機(jī)發(fā)送請求

      5、 如果資源存在,主機(jī)返回200狀態(tài),同時(shí)返回?cái)?shù)據(jù)部分

      6、 本地http客戶端(一般來說是瀏覽器)接收數(shù)據(jù)

      7、 得到資源

      得到http接受報(bào)文的時(shí)候,對http接收報(bào)文進(jìn)行解析,解析內(nèi)部的url并放入隊(duì)列中,并對http接收報(bào)文進(jìn)行持久化操作
      posted @ 2017-05-17 00:03  柳下_MBX  閱讀(1681)  評論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: jizz视频在线观看| 欧洲码亚洲码的区别入口| 在线a级毛片无码免费真人| 精品亚洲无人区一区二区| 亚洲男人天堂2021| 日本三级成本人网站| 骚虎视频在线观看| 亚洲精品一区二区三区不| 国产综合久久久久鬼色| 亚洲制服无码一区二区三区 | 岛国最新亚洲伦理成人| 日韩人妻少妇一区二区三区| 国内精品大秀视频日韩精品| 中日韩中文字幕一区二区| 精品无码一区在线观看| 国产精品九九九一区二区| 欧美孕妇乳喷奶水在线观看| 最新亚洲人成网站在线影院| 中日韩精品视频一区二区三区| 亚洲一区二区三区在线| 99久久成人亚洲精品观看| 久久精品国产久精国产| 91亚洲国产成人久久精品| 通辽市| 人妻系列无码专区无码中出| 久99久热只有精品国产99| 亚洲av无码精品色午夜| 国产suv精品一区二区| 精品久久精品午夜精品久久| 精品九九热在线免费视频| 亚洲欧美国产免费综合视频| 在线观看中文字幕国产码| 久久久这里只有精品10| 亚洲精品一区二区口爆| 成人亚洲一级午夜激情网| 噜噜综合亚洲av中文无码| 一卡2卡三卡4卡免费网站| 亚洲av鲁丝一区二区三区黄| 精品久久久久久无码人妻蜜桃| 又大又粗又硬又爽黄毛少妇| 亚洲精品久久无码av片软件|