网络爬虫二十二-爬虫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;
}
网络爬虫二十二-爬虫socket处理相关推荐
- python爬虫进阶案例,Python进阶(二十)-Python爬虫实例讲解
#Python进阶(二十)-Python爬虫实例讲解 本篇博文主要讲解Python爬虫实例,重点包括爬虫技术架构,组成爬虫的关键模块:URL管理器.HTML下载器和HTML解析器. ##爬虫简单架构 ...
- 网络存储技术Windows server 2012 (项目二十二 远程异地灾备中心的部署)
网络云存储技术Windows server 2012 (项目二十二 远程异地灾备中心的部署) 前言 网络存储技术,是以互联网为载体实现数据的传输与存储,它采用面向网络的存储体系结构,使数据处理和数据存 ...
- Unity C# 网络学习(十二)——Protobuf生成协议
Unity C# 网络学习(十二)--Protobuf生成协议 一.安装 去Protobuf官网下载对应操作系统的protoc,用于将.proto文件生成对应语言的协议语言文件 由于我使用的是C#所以 ...
- JAVA基础知识总结:一到二十二全部总结
>一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...
- GUI的演化和python编程——Python学习笔记之二十二
GUI的演化和python编程--Python学习笔记之二十二 写完了有关长寿的两篇博文,本该去完成哥德尔那个命题六的.对计算机图形界面的好奇,让我把注意力暂时离开那个高度抽象难读的哥德尔,给转到计算 ...
- Atitit 知识与学科的分类 杜威十进分类法 图书分类法已经采用二十二个大类 目录 1.1. 类知识的积累是一个从少到多的过程 1 1.2. 杜威十进分类法(Dewey Decimal Class
Atitit 知识与学科的分类 杜威十进分类法 图书分类法已经采用二十二个大类 目录 1.1. 类知识的积累是一个从少到多的过程 1 1.2. 杜威十进分类法(Dewey Decimal Classi ...
- LINUX学习基础篇(二十二)硬盘结构
LINUX学习基础篇(二十二)文件系统管理 硬盘 磁盘结构 硬盘接口 硬盘 磁盘结构 扇区是磁盘的最小存储单位,每个扇区的大小是固定的,为512Byte.硬盘里有多个磁盘,每个磁盘中,有多个同心圆,这 ...
- OpenCV C++案例实战二十二《手势识别》
OpenCV C++案例实战二十二<手势识别> 前言 一.手部关键点检测 1.1 功能源码 1.2 功能效果 二.手势识别 2.1算法原理 2.2功能源码 三.结果显示 3.1功能源码 3 ...
- 2021年大数据Hadoop(二十二):MapReduce的自定义分组
全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 MapReduce的自定义分组 需求 分析 实现 第一步: ...
- 一位中科院自动化所博士毕业论文的致谢:二十二载风雨求学路,他把自己活成了光.........
4月18日,中国科学院官方微博发布消息,披露了这篇论文为<人机交互式机器翻译方法研究与实现>,作者是2017年毕业于中国科学院大学的工学博士黄国平. 这篇论文中情感真挚的<致谢> ...
最新文章
- Visual C++ 2011-6-6
- 2018刑侦推理 java_2018年刑侦科目推理试题
- 120余家自动驾驶公司的行业汇总
- 查看eclipse使用的jre版本
- 一些有价值的数值公式(游戏)
- Java网络编程之通过代码实现Socket通信
- 美国国际集团(AIG-American International Group)
- IDEA 之because it is included into a circular dependency循环依赖的解决办法
- Little VGL + code::blocks + 模拟器
- 关于Euler-Poisson积分的几种解法
- 标准差 php,标准偏差怎么算
- Web前端大作业 HTML+CSS+JS 防天天生鲜官网 9页
- Centos7安装SCL源
- 智慧社区安防核心硬件:无障碍人脸识别终端
- 农村土地确权之调查公示 —— 地块分布图制作说明
- visionpro的无脚本和高级脚本(你要偷偷的卷,然后惊艳所有人)
- android 常用机型尺寸_Android中获取手机屏幕大小的方法
- kuangbin专题八 HDU4009 Transfer water (无定根最小树形图)
- 程序化广告欺诈流量过滤方法
- 权益证明问题 —— Proof of Stake FAQ
热门文章
- 苹果注定要输给欧盟,USB-C成为标准接口已是大势所趋
- 【Java高级程序设计学习笔记】深入理解jdk动态代理
- VVC代码阅读(2)compressGOP函数(2)
- 最详细的Cydia使用教程------完全版。新补充Cydia1.1.1离线安装(升级)方法。
- python烟花教程_干货教程:Python欠你一场浪漫烟花邂逅
- linux tar:谨慎地拒绝创建空归档文件
- MyEclipse中maven的下载、配置及安装
- win7 无显示器 服务器,win7显示器无信号怎么办?电脑显示器无信号修复方法
- 中国互联网公司都要国际化,美图如何成为出海的另类?
- 暑假?不进厂?那就卷s同学吧