Linux企業級專案實踐之網路爬蟲(28)——爬蟲socket處理
Socket是程式之間交換資料的機制。這些程式即可以是同一臺機器上的,也可以是通過網路連線起來的不同機器。一旦一個Socket連線建立,那麼資料就能夠雙向傳輸,直到其中一端關閉連線。
通常,請求資料的應用程式叫做客戶端Client,而為請求服務叫做伺服器Server。基本上說,首先,伺服器監聽一個埠,並且等待來自客戶端的連線。之後客戶端建立一個,並且嘗試連線伺服器。接著,伺服器接受了來自客戶端的連線,並且開始交換資料。一旦所有的資料都已經通過socket連線傳輸完畢,那麼任意一方都可以關閉連線了。
我們的爬蟲程式只需要client端就夠了。
int build_connect(int *fd, char *ip, intport)
{
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
if (!inet_aton(ip, &(server_addr.sin_addr))) {
return -1;
}
if ((*fd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
return -1;
}
if (connect(*fd, (struct sockaddr *)&server_addr, sizeof(structsockaddr_in)) < 0) {
close(*fd);
return -1;
}
return 0;
}
void * recv_response(void * arg)
{
begin_thread();
int i, n, trunc_head = 0, len = 0;
char * body_ptr = NULL;
evso_arg * narg = (evso_arg *)arg;
Response *resp = (Response *)malloc(sizeof(Response));
resp->header = NULL;
resp->body = (char *)malloc(HTML_MAXLEN);
resp->body_len = 0;
resp->url = narg->url;
regex_t re;
if (regcomp(&re, HREF_PATTERN, 0) != 0) {/* compile error */
SPIDER_LOG(SPIDER_LEVEL_ERROR, "compile regex error");
}
SPIDER_LOG(SPIDER_LEVEL_INFO, "Crawling url: %s/%s",narg->url->domain, narg->url->path);
while(1) {
/* what if content-length exceeds HTML_MAXLEN? */
n = read(narg->fd, resp->body + len, 1024);
if (n < 0) {
if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR) {
/**
* TODO: Why always recvEAGAIN?
* should we deal EINTR
*/
//SPIDER_LOG(SPIDER_LEVEL_WARN,"thread %lu meet EAGAIN or EWOULDBLOCK, sleep", pthread_self());
usleep(100000);
continue;
}
SPIDER_LOG(SPIDER_LEVEL_WARN, "Read socket fail: %s",strerror(errno));
break;
} else if (n == 0) {
/* finish reading */
resp->body_len = len;
if (resp->body_len > 0) {
extract_url(&re,resp->body, narg->url);
}
/* deal resp->body */
for (i = 0; i < (int)modules_post_html.size(); i++) {
modules_post_html[i]->handle(resp);
}
break;
} else {
//SPIDER_LOG(SPIDER_LEVEL_WARN, "read socket ok! len=%d", n);
len += n;
resp->body[len] = '\0';
if (!trunc_head) {
if ((body_ptr =strstr(resp->body, "\r\n\r\n")) != NULL) {
*(body_ptr+2) = '\0';
resp->header =parse_header(resp->body);
if(!header_postcheck(resp->header)) {
goto leave; /* moduluesfilter fail */
}
trunc_head = 1;
/* cover header */
body_ptr += 4;
for (i = 0; *body_ptr; i++){
resp->body[i] =*body_ptr;
body_ptr++;
}
resp->body[i] = '\0';
len = i;
}
continue;
}
}
}
leave:
close(narg->fd); /* close socket */
free_url(narg->url); /* free Url object */
regfree(&re);/* free regex object */
/* free resp */
free(resp->header->content_type);
free(resp->header);
free(resp->body);
free(resp);
end_thread();
return NULL;
}
相關文章
- Linux企業級專案實踐之網路爬蟲(18)——佇列處理Linux爬蟲佇列
- Linux企業級專案實踐之網路爬蟲(5)——處理配置檔案Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(13)——處理user-agentLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(10)——處理HTTP狀態碼Linux爬蟲HTTP
- Linux企業級專案實踐之網路爬蟲(11)——處理http請求頭Linux爬蟲HTTP
- Linux企業級專案實踐之網路爬蟲(12)——處理HTTP應答頭Linux爬蟲HTTP
- Linux企業級專案實踐之網路爬蟲(21)——擴充套件為多工爬蟲Linux爬蟲套件
- Linux企業級專案實踐之網路爬蟲(7)——DNS解析Linux爬蟲DNS
- Linux企業級專案實踐之網路爬蟲(19)——epoll介面Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(4)——主程式流程Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(8)——認識URLLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(24)——定製規則擴充套件為垂直爬蟲Linux爬蟲套件
- Linux企業級專案實踐之網路爬蟲(17)——儲存頁面Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(26)——執行緒池Linux爬蟲執行緒
- Linux企業級專案實踐之網路爬蟲(27)——多路IO複用Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(29)——遵守robots.txtLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(25)——管理原始碼之SVNLinux爬蟲原始碼
- Linux企業級專案實踐之網路爬蟲(22)——編寫爬蟲系統服務控制指令碼Linux爬蟲指令碼
- Linux企業級專案實踐之網路爬蟲(9)——通過URL抓取網頁內容Linux爬蟲網頁
- Linux企業級專案實踐之網路爬蟲(6)——將程式設計成為守護程式Linux爬蟲程式設計
- 網路爬蟲專案爬蟲
- Linux企業級專案實踐之網路爬蟲(14)——使用正規表示式抽取HTML正文和URLLinux爬蟲HTML
- Linux企業級專案實踐之網路爬蟲(20)——擴充套件成為規則外掛模式Linux爬蟲套件模式
- Linux企業級專案實踐之網路爬蟲(23)——系統測試:找出系統中的bugLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(15)——區分文字檔案和二進位制檔案Linux爬蟲
- Java 爬蟲專案實戰之爬蟲簡介Java爬蟲
- 網路爬蟲——爬蟲實戰(一)爬蟲
- 網路爬蟲專案蒐集爬蟲
- 企業資料爬蟲專案爬蟲
- Linux企業級專案實踐之網路爬蟲(16)——使用base64傳輸二進位制資料Linux爬蟲
- 精通Scrapy網路爬蟲【一】第一個爬蟲專案爬蟲
- Python網路爬蟲實戰專案大全 32個Python爬蟲專案demoPython爬蟲
- 專案--python網路爬蟲Python爬蟲
- 網路爬蟲(python專案)爬蟲Python
- Linux企業級專案實踐之網路爬蟲(30)——通過查閱RFC文件擴充更加複雜的功能Linux爬蟲
- 企業資料爬蟲專案(二)爬蟲
- 【爬蟲】爬蟲專案推薦 / 思路爬蟲
- Python網路爬蟲實戰小專案Python爬蟲