C语言之socket获取网页源码
写爬虫也许你用的是python,类似urlopen(url).read()即可获得普通的网页的源码,或者用的java的网络库加上流操作,或者其他高级语言。但你有没有想过使用C语言来实现呢?我曾经以为用c来实现获取网页源码是很复杂的,要自己按照http等协议来构造包,再解析接受到的包,还要考虑三次握手。现在想来当时的想法真可怕啊!一个人最崇敬科技,最害怕科学的时候是期是何时呢?是当他懂了一些东西,但还有一大堆东西不懂的时候。也许脑筋转一个弯,他学的就快了。好了,下面进入正题:
通过socket与远程连接需要ip和端口号,通常我们写的socket程序都是一个server,一个client,两个配对,单一可以只写一方的程序来达到我们的目的:如端口扫描。我们把web服务器当成socket服务端(实际也的确如此,网络通信不都是socket的天下吗),端口设为80(开放网站大多都是这个啊)。步骤有三:
- 创建socket,建立connect
- 向对方发送请求
- 读取响应内容
int open_socket(char* host,char *port){
struct addrinfo *res;//<netdb.h>
struct addrinfo hints;
memset(&hints,,sizeof(hints));
hints.ai_family=PF_UNSPEC;// AF | PF
hits.ai_socktype=SOCK_STREAM;
if(getaddrinfo(host,port,&hints,&res)==-)//会在堆上创建一种叫名字资源的新数据结构
perror("error");
int d_sock=socket(res->ai_family,res->ai_socktype,res->ai_protocal);
if(d_sock==-) perror...
int c=connect(d_sock,res->ai_addr,res->ai_addrlen);
freeaddrinfo(res);//释放堆空间
if(c==-) ...
return d_sock;
}
下面是一个发送信息的辅助函数
int say(int sock,char *s){
int ret=send(sock,s,strlen(s),);
if(ret==-) perror...
return ret;
}
上面的perror函数是系统的,可以换成你自定义的,或者用strerror()加上<errno.h>中的errno
发送信息至少包含三部分:
GET请求,主机名,空行(\r\n)
下面是main函数:
int main(int a,char *b){
int sock;
soc=open_sock("www.sougou.com","");
char rec[];
say(sock,"GET /wiki/ http/1.1\r\n");
int bytesRcvd=recv(sock,rec,,);
while(bytesRcvd){
if(bytesRcvd==-) ...
rec[bytesRcvd]='\0';
printf("%s",rec);
bytesRcvd=recv(sock,rec,,);
}
close(sock);
return ;
}
C语言之socket获取网页源码的更多相关文章
- Python爬虫学习之获取网页源码
偶然的机会,在知乎上看到一个有关爬虫的话题<利用爬虫技术能做到哪些很酷很有趣很有用的事情?>,因为强烈的好奇心和觉得会写爬虫是一件高大上的事情,所以就对爬虫产生了兴趣. 关于网络爬虫的定义 ...
- QT:轻松获取网页源码
获取网页源码的小例子,代码很简单,就不多作解释了. 不过一定要注意网页的编码问题,否则会出现乱码的!!! #include <QtCore> #include <QtNetwork& ...
- vc++获取网页源码
1. 获取网页源码的步骤: com组件的初始化 创建WinHttpRequest对象 创建并实例化WinHttpRequest组件 调用Open方法打开连接 调用Send方法发送请求 使用Respon ...
- vc++获取网页源码之使用import+接口方式
1.使用IWinHttpRequest获取网页源码 首先要创建基于对话框的mfc应用程序 2.import+接口方式 首先导入winhttp.dll,使用IWinHttpRequest接口 #impo ...
- 高效获取网页源码COM
目前获取网页源码有几种方法: 1.WebClient下载页面2.HttpWebRequest发请求获取3.com组件xmlhttp获取 三者比较:WebClient代码最少,效率最慢:xmlhttp代 ...
- Python3 Selenium WebDriver网页的前进、后退、刷新、最大化、获取窗口位置、设置窗口大小、获取页面title、获取网页源码、获取Url等基本操作
Python3 Selenium WebDriver网页的前进.后退.刷新.最大化.获取窗口位置.设置窗口大小.获取页面title.获取网页源码.获取Url等基本操作 通过selenium webdr ...
- Python3.x获取网页源码
Python3.x获取网页源码 1,获取网页的头部信息以确定网页的编码方式: import urllib.request res = urllib.request.urlopen('http://ww ...
- c# HttpClient获取网页源码
#region 获取网页源码 public static string HttpClientGetHtmls(string url) { try { var client = new HttpClie ...
- Selenium WebDriver-网页的前进、后退、刷新、最大化、获取窗口位置、设置窗口大小、获取页面title、获取网页源码、获取Url等基本操作
通过selenium webdriver操作网页前进.后退.刷新.最大化.获取窗口位置.设置窗口大小.获取页面title.获取网页源码.获取Url等基本操作 from selenium import ...
随机推荐
- IE8下获取iframe document EVENT对象的问题
在一个页面中设置iframe的document Onclick 事件获取在iframe中的document被点击的对象,W3C如下: document.getElementById('iframe的I ...
- 用C++和shell获取本机CPU、网卡IO、内存、磁盘等的基本信息
用C++和shell获取本机CPU.网卡.内存.磁盘等的基本信息: 由于对C++相关的函数没多少了解,但是觉得用shell反而相对简单一些: 一.shell脚本,用来辅助C++获取主机的资源使用信息 ...
- Spring Security笔记:HTTP Basic 认证
在第一节 Spring Security笔记:Hello World 的基础上,只要把Spring-Security.xml里改一个位置 <http auto-config="true ...
- springmvc集成shiro登录失败处理
一般的登录流程会有:用户名不存在,密码错误,验证码错误等.. 在集成shiro后,应用程序的外部访问权限以及访问控制交给了shiro来管理. shiro提供了两个主要功能:认证(Authenticat ...
- [MetaHook] Quake FMOD player demo
CFMOD.h #ifndef CFMOD_H #define CFMOD_H #include "qfmod.h" struct Sound_t { char *pszName; ...
- 数据字典生成工具之旅(3):PowerDesign文件组成结构介绍及操作
从这篇开始将正式讲解整个重要部分的实现细节,本篇讲解Pdm文件的解析.其实PDM文件就是XML文件,可以用Editplus或者VS打开查看.了解到这一点之后大家就能猜到,可以用解析XML的方式读取PD ...
- 防止 JavaScript 自动插入分号
JavaScript语言有一个机制:在解析时,能够在一句话后面自动插入一个分号,用来修改语句末尾遗漏的分号分隔符. 然而,由于这个自动插入的分号与JavaScript语言的另一个机制发生了冲突,即所有 ...
- [译]用AngularJS构建大型ASP.NET单页应用(三)
原文地址:http://www.codeproject.com/Articles/808213/Developing-a-Large-Scale-Application-with-a-Single A ...
- 项目分布式部署那些事(1):ONS消息队列、基于Redis的Session共享,开源共享
因业务发展需要现在的系统不足以支撑现在的用户量,于是我们在一周之前着手项目的性能优化与分布式部署的相关动作. 概况 现在的系统是基于RabbitHub(一套开源的开发时框架)和Rabbit.WeiXi ...
- Android开发自学笔记—1.1(番外)AndroidStudio常用功能介绍
一.界面区介绍 1.项目组织结构区,用于浏览项目文件,默认Project以Android组织方式展示. 2.设计区,默认在打开布局文件时为设计模式,可直接拖动控件到界面上实现所见即所得,下方的Desi ...