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 ...
随机推荐
- BZOJ 4003 【JLOI2015】城池攻占
Description 小铭铭最近获得了一副新的桌游,游戏中需要用 m 个骑士攻占 n 个城池. 这 n 个城池用 1 到 n 的整数表示.除 1 号城池外,城池 i 会受到另一座城池 fi 的管辖, ...
- 阿里云Center OS 6.2 Nginx 配置 SSL/TLS HTTPS配置
1.通过https://www.startssl.com/ 免费SSL证书 STARTSSL 跟VeriSign一样,StartSSL(网址:http://www.startssl.com,公司名:S ...
- iOS开发 传感器(加速计、摇一摇、计步器)
一.传感器 1.什么是传感器传感器是一种感应\检测周围环境的一种装置, 目前已经广泛应用于智能手机上 传感器的作用用于感应\检测设备周边的信息不同类型的传感器, 检测的信息也不一样 iPhone中的下 ...
- C#.NET 大型通用信息化系统集成快速开发平台 4.0 版本 - 独立子系统管理员功能实现
1: 由于公司一次性要开发10多个子系统,每个子系统都需要有相关的业务部门进行对应.2: 若用集中式管理方式,每个业务部门人员变动,权限变动时,都需要早IT信息中心进行调整,影响工作效率.及时性.3: ...
- jboss eap 6.3 域(Domain)模式配置
jboss提供了二种运行模式:standalone(独立运行模式).domain(域模式),日常开发中,使用standalone模式足已:但生产部署时,一个app,往往是部署在jboss集群环境中的, ...
- 【自己给自己题目做】:如何在Canvas上实现魔方效果
最终demo -> 3d魔方 体验方法: 浮动鼠标找到合适的位置,按空格键暂停 选择要翻转的3*3模块,找到相邻两个正方体,鼠标点击第一个正方体,并且一直保持鼠标按下的状态直到移到第二个正方体后 ...
- 奇怪的Js时间计算方法,跨多个月后出现1天的误差
在项目中要求用计算两个时间相差的天数,通俗的说就是两个时间 相减, 我的方法 先把两个时间转成相应的毫秒,相减后,再除以(1000 * 60 * 60 * 24) 就可以得到对应天数,但天数会比实际少 ...
- ASP.NET MVC3入门教程之ajax交互
本文转载自:http://www.youarebug.com/forum.php?mod=viewthread&tid=100&extra=page%3D1 随着web技术的不断发展与 ...
- .NET 平台下的插件化开发内核(Rabbit Kernel)
每个程序猿都有一个框架梦,曾经在2013年8月15日写过一篇"Koala Framework是什么?我为什么要写这个框架?"的文章,在开放框架路上迈出了第一步,之后作者如愿找到了一 ...
- 解决问题:由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射。
WindowServer2012服务器,添加角色安装完.netframework和iis之后,运行aspx页面就报如下错误: HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法 ...