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)
上一小节,我们实现了下载一个网页.接下来的一步就是使用提取有用的信息.如何提取呢?一个比较好用和常见的方法就是使用正则表达式来提取的.想一想我们要做个什么样的网络爬虫好呢?我记得以前好像博客园里面有人 ...
随机推荐
- 《Gradle权威指南》--Gradle构建脚本基础
No1: 设置文件默认名是setting.gradle,放在根目录下,大多数作用都是为了配置子工程 No2: 一个Project包含很多个Task.Task就是一个操作,一个原子性的操作.其实它是Pr ...
- hdu1698 Just a Hook 【区间修改】(模板题)
题目链接:https://vjudge.net/contest/182746#problem/E 题目大意: 一段线段由n条小线段组成,每次操作把一个区间的小线段变成金银铜之一(金的价值为3,银为2, ...
- 实现分布式服务注册及简易的netty聊天
现在很多地方都会用到zookeeper, 用到它的地方就是为了实现分布式.用到的场景就是服务注册,比如一个集群服务器,需要知道哪些服务器在线,哪些服务器不在线. ZK有一个功能,就是创建临时节点,当机 ...
- HDU3915 Game 高斯消元
题目链接 HDU3915 Game 高斯消元 题解 求异或方程组自由元的子集个数 高斯消元求秩,内存溢出好神 代码 #include<bitset> #include<cstdio& ...
- java.sql.SQLException: Error setting driver on UnpooledDataSource.Caused by: java.lang.IllegalArgumentException: Result Maps collection does not contain value for IStudentDaoMapper.Mapperdao.selectcou
是因为 Caused by: java.lang.IllegalArgumentException: Result Maps collection does not contain value for ...
- php传入对象时获得类型提示
类的类型提示 - 将类名放在需要约束的方法参数之前 语法格式: public function write(ShopProduct $shopProduct){} 数组提示: public funct ...
- C++ new
//#include "stdafx.h" #include <iostream> using namespace std; int main() { , n = , ...
- android stuido 的几个点
- 喵哈哈村的魔法考试 Round #14 (Div.2) 题解
喵哈哈村的四月半活动(一) 题解: 唯一的case,就是两边长度一样的时候,第三边只有一种情况. #include <iostream> #include <cstdio> # ...
- C#高级编程9 第18章 部署
C#高级编程9 第18章 部署 使用 XCopy 进行部署 本主题演示如何通过将应用程序文件从一台计算机复制到另一台计算机来部署应用程序. 1.将项目中生成的程序集复制到目标计算机,生成的程序集位于项 ...