Socket网络编程--网络爬虫(1)
我们这个系列准备讲一下--网络爬虫。网络爬虫是搜索引擎系统中十分重要的组成部分,它负责从互联网中搜集网页,采集信息,这些网页信息用于建立索引从而为搜索引擎提供支持,它决定着整个引擎系统的内容是否丰富,信息是否即时,因此其性能的优劣直接影响着搜索引擎的效果。网络爬虫的基本工作原理:
(1)从一个初始URL集合中挑选一个URL,下载该URL对应的页面;
(2)解析该页面,从该页面中抽取出其包含的URL集合,接下来将抽取的URL集合再添加到初始URL集合中;
(3)重复前两个过程,直到爬虫达到某种停止标准为止。
当然作为才学网络编程不久的我肯定不能讲那么复杂的东西了。在这一小节我们将实现用C语言来下载一个网页。
实现下载一个网页
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h> #define BUF_SIZE 4096 int main(int argc,char *argv[])
{
struct sockaddr_in servAddr;
struct hostent * host;
int sockfd;
char sendBuf[BUF_SIZE],recvBuf[BUF_SIZE];
int sendSize,recvSize; host=gethostbyname(argv[]);
if(host==NULL)
{
perror("dns 解析失败");
}
servAddr.sin_family=AF_INET;
servAddr.sin_addr=*((struct in_addr *)host->h_addr);
servAddr.sin_port=htons(atoi(argv[]));
bzero(&(servAddr.sin_zero),); sockfd=socket(AF_INET,SOCK_STREAM,);
if(sockfd==-)
{
perror("socket 创建失败");
} if(connect(sockfd,(struct sockaddr *)&servAddr,sizeof(struct sockaddr_in))==-)
{
perror("connect 失败");
} //构建一个http请求
sprintf(sendBuf,"GET / HTTP/1.1 \r\nHost: %s \r\nConnection: keep-alive \r\n\r\n",argv[]);
if((sendSize=send(sockfd,sendBuf,BUF_SIZE,))==-)
{
perror("send 失败");
}
//获取http应答信息
memset(recvBuf,,sizeof(recvBuf));
while(recvSize=recv(sockfd,recvBuf,BUF_SIZE,))
{
printf("%s",recvBuf);
memset(recvBuf,,sizeof(recvBuf));
} return ;
}
关于上面的构建HTTP请求的部分,可以参考网上资料或者我的博客上也有简单讲解一些(了解HTTP协议 http://www.cnblogs.com/wunaozai/p/3733432.html)
HTTP请求由三部分组成,分别是请求行,消息报头,请求正文。我就简单说一下上面用到的请求吧。首先GET / HTTP/1.1 表示使用GET请求方式获取/(根目录),使用的是http1.1版本(这个1.1好像用了很久,2.0已经开始推行了。)下一个是Host: 是发送请求资源的Internet主机和端口号。默认的端口号是80.好了一个看起来很复杂的http请求就这两个是必须的,其他的可以不用写的。你看是不是很容易啊。其他的参数等用到的时候在讲好了。还有一个注意点,就是一个http请求的附加信息是一行一个的。每一行我们要用\r\n表示回车换行。而请求报头的结束标记是一个空行。所以你看上面的请求报头是以\r\n\r\n来结束的。
接下来就来试一下我们这个程序到底能不能用。我们先在本地搭建一个http服务器。放进去一个Hello World来看一下。

上面那一大堆是响应(Respond)报头。第一行是,使用http1.1版本协议,此次的您的连接(客户端)是200 OK 正常的。下一行是时间,服务器用的是apache。第8行Content-Length: 86表示下面的html总共有86个字节(不信,你数数看?)。下面再给一张博客园的主页的返回信息。

上面的程序我运行是有时会出现一个问题就是获取的网页不完整。不知道为什么,然后我把BUF_SIZE改小一点为512就不会,也不知道为什么。然后还有一个问题就是我拉取www.baidu.com 就不知道为什么是活拉不了,不知道是不是因为我的请求报头太少的原因?
参考资料:
http://www.cnblogs.com/coser/archive/2012/06/29/2570535.html
http://blog.csdn.net/gueter/article/details/1524447
本文地址:
http://www.cnblogs.com/wunaozai/p/3900134.html
Socket网络编程--网络爬虫(1)的更多相关文章
- [转] - Linux网络编程 -- 网络知识介绍
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)
本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...
- UNIX网络编程——网络IPC:套接字
UNIX网络编程——网络IPC:套接字 Contents 套接字接口 套接字描述符 寻址 字节序 地址格式 地址查询 绑定地址 建立连接 数据传输 套接字选项 带外数据 UNIX域套接字 使用套接字的 ...
- 网络编程—网络基础概览、socket,TCP/UDP协议
网络基础概览 socket概览 socket模块—TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网 ...
- linux网络编程--网络编程的基本函数介绍与使用【转】
本文转载自:http://blog.csdn.net/yusiguyuan/article/details/17538499 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览 ...
- python网络编程——网络IO模型
1 网络IO模型介绍 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-bl ...
- JAVA基础知识之网络编程——-网络通信模型(IO模型)
<Unix网络编程:卷1>中介绍了5中I/O模型,JAVA作为运行在宿主机上的程序,底层也遵循这5中I/O模型规则.这5中I/O模型分别是: 阻塞式IO 非阻塞式IO I/O复用 信号驱动 ...
- UNIX网络编程——网络I/O模型
在学习UNIX网络编程的时候.一開始分不清 同步 和 异步,所以还是总结一下,理清下他们的差别比較好. IO分类 IO依据对IO的调度方式可分为堵塞IO.非堵塞IO.IO复用.信号驱动IO.异步IO. ...
- Socket网络编程--网络爬虫(2)
上一小节,我们实现了下载一个网页.接下来的一步就是使用提取有用的信息.如何提取呢?一个比较好用和常见的方法就是使用正则表达式来提取的.想一想我们要做个什么样的网络爬虫好呢?我记得以前好像博客园里面有人 ...
随机推荐
- java中与和或的注意点
1.&&和&的区别 &:无论左边是true是false.右边都运算. &&:当左边为false时,右边不运算. 2.|与||的区别 |:两边都参与运算. ...
- shell find
find -name april* 在当前目录下查找以april开始的文件 find / -amin -10 # 查找在系统中最后1 ...
- C#全能数据库操作类及调用示例
C#全能数据库操作类及调用示例 using System; using System.Data; using System.Data.Common; using System.Configuratio ...
- AGC027 C - ABland Yard 拓扑排序
目录 题目链接 题解 代码 题目链接 AGC027 C - ABland Yard 题解 发现有解的充要条件是有一个形为AABBAABBAABB的环 此时每一个点至少与两个不同颜色的点相连 对于初始不 ...
- [BZOJ2879][NOI2012]美食节(费用流)
设sm为所有p之和,套路地对每道菜建一个点,将每个厨师拆成sm个点,做的倒数第i道菜的代价为time*i. S向每道菜连边<0,p[i]>(前者为代价后者为流量),i菜到j厨师的第k个点连 ...
- POJ.1769.Minimizing maximizer(线段树 DP)
题目链接 /* 题意:有m个区间,问最少要多少个区间能覆盖[1,n] 注:区间要按原区间的顺序,不能用排序贪心做 设dp[i]表示最右端端点为i时的最小值 dp[e[i]]=min{dp[s[i]]~ ...
- 28BYJ-48步进电机
28BYJ-48步进电机:1.步进电机是一种将电脉冲转化为角位移的执行机构. 2.通俗一点讲:当步进驱动器接收到 一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角). 3.通过控 ...
- Putty的用法
大致内容罗列如下: · 最简单的使用,登录 SSH主机 · 中文乱码的处理 · PuTTY常用配置的说明 · 复制.粘贴 · 保存 ...
- 2016年3月12日Android学习笔记
1. //此句不能忘,否则onFling左右滑动不起作用 mLlExamView.setLongClickable(true); mLlExamView.setOnTouchListener(new ...
- js常用事件
为了便于使读者更好地运用js事件,就把常用事件大致分为以下几种: a. 表单元素事件,在表单元素中生效 onfocus ------获取焦点 onblur -------失去焦点 onsubmit ...