Socket网络编程--网络爬虫(1)

  我们这个系列准备讲一下--网络爬虫。网络爬虫是搜索引擎系统中十分重要的组成部分,它负责从互联网中搜集网页,采集信息,这些网页信息用于建立索引从而为搜索引擎提供支持,它决定着整个引擎系统的内容是否丰富,信息是否即时,因此其性能的优劣直接影响着搜索引擎的效果。网络爬虫的基本工作原理:

  (1)从一个初始URL集合中挑选一个URL,下载该URL对应的页面;
  (2)解析该页面,从该页面中抽取出其包含的URL集合,接下来将抽取的URL集合再添加到初始URL集合中;
  (3)重复前两个过程,直到爬虫达到某种停止标准为止。

  当然作为才学网络编程不久的我肯定不能讲那么复杂的东西了。在这一小节我们将实现用C语言来下载一个网页。

  实现下载一个网页

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #include <sys/types.h>
 5 #include <sys/socket.h>
 6 #include <unistd.h>
 7 #include <netdb.h>
 8 #include <netinet/in.h>
 9 #include <arpa/inet.h>
10
11 #define BUF_SIZE 4096
12
13 int main(int argc,char *argv[])
14 {
15     struct sockaddr_in servAddr;
16     struct hostent * host;
17     int sockfd;
18     char sendBuf[BUF_SIZE],recvBuf[BUF_SIZE];
19     int sendSize,recvSize;
20
21     host=gethostbyname(argv[1]);
22     if(host==NULL)
23     {
24         perror("dns 解析失败");
25     }
26     servAddr.sin_family=AF_INET;
27     servAddr.sin_addr=*((struct in_addr *)host->h_addr);
28     servAddr.sin_port=htons(atoi(argv[2]));
29     bzero(&(servAddr.sin_zero),8);
30
31     sockfd=socket(AF_INET,SOCK_STREAM,0);
32     if(sockfd==-1)
33     {
34         perror("socket 创建失败");
35     }
36
37     if(connect(sockfd,(struct sockaddr *)&servAddr,sizeof(struct sockaddr_in))==-1)
38     {
39         perror("connect 失败");
40     }
41
42     //构建一个http请求
43     sprintf(sendBuf,"GET / HTTP/1.1 \r\nHost: %s \r\nConnection: keep-alive \r\n\r\n",argv[1]);
44     if((sendSize=send(sockfd,sendBuf,BUF_SIZE,0))==-1)
45     {
46         perror("send 失败");
47     }
48     //获取http应答信息
49     memset(recvBuf,0,sizeof(recvBuf));
50     while(recvSize=recv(sockfd,recvBuf,BUF_SIZE,0))
51     {
52         printf("%s",recvBuf);
53         memset(recvBuf,0,sizeof(recvBuf));
54     }
55
56     return 0;
57 }

  关于上面的构建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),布布扣,bubuko.com

时间: 2024-08-03 03:14:43

Socket网络编程--网络爬虫(1)的相关文章

Linux网络编程------网络编程基础

Socket(套接字),类似文件描述符,三种 1.流式套接字(SOCK_STREAM):可以提供可靠的.面向连接的通讯流,它使用TCP协议.TCP保证了数据传输的正确性和顺序性. 2.数据报套接字(SOCK_DGRAM):定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠,无差错,它使用数据报协议(UDP). 3.原始套接字(SOCK_RAW):直接基于IP协议. 网络地址 struct sockaddr用于记录网络地址: struct sockaddr { u_s

[转] - Linux网络编程 -- 网络知识介绍

(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端        在网络程序中,如果一个程序主动和外面的程序通信,那么我们把这个程序称为客户端程序. 比如我们使用ftp程序从另外一        个地方获取文件的时候,是我们的ftp程序主动同外面进行通信(获取文件), 所以这个地方我们的ftp程序就是客户端程序. 服务端        和客户端相

网络编程—网络基础概览、socket,TCP/UDP协议

网络基础概览 socket概览 socket模块-TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网协议,arp协议.对这些信号进行分组,同时规范了分组形式--以太网协议,头部是mac地址中间是信息, # 网络层:ip协议,arp协议帮忙找到mac地址,ip,子网掩码,网关(下面有一些简单概括) # 传输层:tcp协议,udp协议 # (socket)就是一组接口,将复杂的tcp协议和udp协议隐

linux网络编程--网络编程的基本函数介绍与使用【转】

本文转载自:http://blog.csdn.net/yusiguyuan/article/details/17538499 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的.本文的主要内容如下: 1.网络中进程之间如何通信? 2.Socke

UNIX网络编程——网络I/O模型

在学习UNIX网络编程的时候.一開始分不清 同步 和 异步,所以还是总结一下,理清下他们的差别比較好. IO分类 IO依据对IO的调度方式可分为堵塞IO.非堵塞IO.IO复用.信号驱动IO.异步IO. IO操作整个流程分为 可操作推断 和 实际IO操作 两个区间,我们能够称之为两个半程,前半程推断是否可操作,后半程进行实际操作. 当中堵塞IO.非堵塞IO.IO复用.信号驱动IO由于其[实际的IO操作是同步堵塞]的,所以一般把他们归为同步IO,异步IO的实际IO操作是在独立的线程中完毕的,所以称为

JAVA基础知识之网络编程——-网络基础(多线程下载,get,post)

本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web资源,URLDecode和URLEncode用来转换字符串. 本文会写两个例子来演示java网络编程的一些基本用法. 第一个例子,写一个程序用来模拟多线程下载. 本例中用到的技术有,多线程--多个线程同时读文件写文件,可以加快下载速度, 线程池--在本例中线程池不是必须,甚至是多余,只不过是为了演示

网络编程(爬虫,接口及好用的模块)及网络测接口

1.网络 from urllib import request,parse# url = 'http://www.nnzhp.cn'# req = request.urlopen(url) #打开一个url,发get请求 用来发请求# content = req.read().decode() #获取返回结果 获取网站的内容 返回的是byte类型需要decode一下 # fw = open('baidu.html','w',encoding='utf-8') #写入到本地文件中# fw.writ

Linux网络编程——网络协议入门

我们每天使用互联网,你是否想过,它是如何实现的? 全世界几十亿台电脑,连接在一起,两两通信.北京的某一块网卡送出信号,深圳的另一块网卡居然就收到了,两者实际上根本不知道对方的物理位置,你不觉得这是很神奇的事情吗? 为了使各种不同的计算机之间可以互联,ARPANet指定了一套计算机通信协议,即TCP/IP协议( 族 ),它们对电脑如何连接和组网,做出了详尽的规定.理解了这些协议,就理解了网络的原理. 因为这些协议实在太复杂.太庞大,这里只是整理一个简洁的框架,帮助大家从总体上把握它们. 一.概述

Linux 网络编程——网络字节序、地址转换

网络字节序 故事的起源 "endian"这个词出自<格列佛游记>.小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位. 我们一般将"endian"翻译成"字节序",将 Big-Endian 和 Little-Endian 称作"大端格式"和"小端格式". 字节序 字节序是指多字节