写爬虫也许你用的是python,类似urlopen(url).read()即可获得普通的网页的源码,或者用的java的网络库加上流操作,或者其他高级语言。但你有没有想过使用C语言来实现呢?我曾经以为用c来实现获取网页源码是很复杂的,要自己按照http等协议来构造包,再解析接受到的包,还要考虑三次握手。现在想来当时的想法真可怕啊!一个人最崇敬科技,最害怕科学的时候是期是何时呢?是当他懂了一些东西,但还有一大堆东西不懂的时候。也许脑筋转一个弯,他学的就快了。好了,下面进入正题:

  通过socket与远程连接需要ip和端口号,通常我们写的socket程序都是一个server,一个client,两个配对,单一可以只写一方的程序来达到我们的目的:如端口扫描。我们把web服务器当成socket服务端(实际也的确如此,网络通信不都是socket的天下吗),端口设为80(开放网站大多都是这个啊)。步骤有三:

  1. 创建socket,建立connect
  2. 向对方发送请求
  3. 读取响应内容
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获取网页源码的更多相关文章

  1. Python爬虫学习之获取网页源码

    偶然的机会,在知乎上看到一个有关爬虫的话题<利用爬虫技术能做到哪些很酷很有趣很有用的事情?>,因为强烈的好奇心和觉得会写爬虫是一件高大上的事情,所以就对爬虫产生了兴趣. 关于网络爬虫的定义 ...

  2. QT:轻松获取网页源码

    获取网页源码的小例子,代码很简单,就不多作解释了. 不过一定要注意网页的编码问题,否则会出现乱码的!!! #include <QtCore> #include <QtNetwork& ...

  3. vc++获取网页源码

    1. 获取网页源码的步骤: com组件的初始化 创建WinHttpRequest对象 创建并实例化WinHttpRequest组件 调用Open方法打开连接 调用Send方法发送请求 使用Respon ...

  4. vc++获取网页源码之使用import+接口方式

    1.使用IWinHttpRequest获取网页源码 首先要创建基于对话框的mfc应用程序 2.import+接口方式 首先导入winhttp.dll,使用IWinHttpRequest接口 #impo ...

  5. 高效获取网页源码COM

    目前获取网页源码有几种方法: 1.WebClient下载页面2.HttpWebRequest发请求获取3.com组件xmlhttp获取 三者比较:WebClient代码最少,效率最慢:xmlhttp代 ...

  6. Python3 Selenium WebDriver网页的前进、后退、刷新、最大化、获取窗口位置、设置窗口大小、获取页面title、获取网页源码、获取Url等基本操作

    Python3 Selenium WebDriver网页的前进.后退.刷新.最大化.获取窗口位置.设置窗口大小.获取页面title.获取网页源码.获取Url等基本操作 通过selenium webdr ...

  7. Python3.x获取网页源码

    Python3.x获取网页源码 1,获取网页的头部信息以确定网页的编码方式: import urllib.request res = urllib.request.urlopen('http://ww ...

  8. c# HttpClient获取网页源码

    #region 获取网页源码 public static string HttpClientGetHtmls(string url) { try { var client = new HttpClie ...

  9. Selenium WebDriver-网页的前进、后退、刷新、最大化、获取窗口位置、设置窗口大小、获取页面title、获取网页源码、获取Url等基本操作

    通过selenium webdriver操作网页前进.后退.刷新.最大化.获取窗口位置.设置窗口大小.获取页面title.获取网页源码.获取Url等基本操作 from selenium import ...

随机推荐

  1. .NET MVC控制器分离到类库的方法

    在.ASP.NET MVC的开发中,我们创建完项目之后,ASP.NET MVC是已Model-Controller-View的形式存在的,在创建项目自动生成的内容上Model我们很容易分离成类库,所以 ...

  2. blogs for learning java

    曹海成的专栏 http://blog.csdn.net/caohaicheng/article/details/38071097 http://blog.csdn.net/a5489888/artic ...

  3. HP PCS 云监控大数据解决方案

    ——把数据从分散统一集中到数据中心 基于HP分布式并行计算/存储技术构建的云监控系统即是通过“云高清摄像机”及IaaS和PaaS监控系统平台,根据用户所需(SaaS)将多路监控数据流传送给“云端”,除 ...

  4. Utrack声卡和机架包的调试

    视频链接http://www.tudou.com/programs/view/giZZ7b2dhn4/ 关于怎么调试这个问题困扰了我几个月之久,也没人教我,我也不知道问谁,搜又搜不到,所幸现在解决了问 ...

  5. JAVA CDI 学习(5) - 如何向RESTFul Service中注入EJB实例

    RESTFul Service中如果要注入EJB实例,常规的@Inject将不起作用,在Jboss中,应用甚至都启动不起来(因为@Inject注入失败),解决方法很简单:将@Inject换成@EJB ...

  6. 移动端页面(css)调试之“weinre大法”

    移动端页面调试一般分两步.第一步我们需要把本地(pc端)写的页面效果展现在移动端,一个很方便的办法是用 fiddler 作为代理,具体可以参考 如何用 fiddler 代理调试本地手机页面,这样我们就 ...

  7. Win2008上.NET4.0部署出错HTTP 错误 500.21 - Internal Server Error的解决方法

    原因:在安装Framework v4.0之后,再启用IIS,导致Framework没有完全安装 解决:开始->所有程序->附件->鼠标右键点击“命令提示符”->以管理员身份运行 ...

  8. JavaScript学习笔记-循环输出菱形,并可菱形自定义大小

    var Cen = 6;//定义菱形中部为第几行(起始值为0) //for循环输出菱形 document.write("<button onclick='xh()'>点我for循 ...

  9. mybatis字符串模糊匹配

    1.  参数中直接加入%%,注意不需要加两个单引号,加了就会出错,因为系统会自动为字符串类型加上两个单引号 <select id="selectPersons" result ...

  10. 'hibernate.dialect' must be set when no Connection avalable’

    一个错误'hibernate.dialect' must be set when no Connection avalable ‘ 网上也有不少人遇到这种问题,看上去好像是跟Hibernate的方言有 ...