Linux C获取网页title
1. http 的知识,你需要使用 HTTP GET/POST 请网页2. 把网页请求下来,会得到一个 html,然后解析它3. 解析网页之后找到用户名与密码字段,最后打包出一个 HTTP POST 请求,完成用户名和密码提交4. 服务器会返回一个 HTTP 回应,你
1. http 的知识,你需要使用 HTTP GET/POST 请网页
2. 把网页请求下来,会得到一个 html,然后解析它
3. 解析网页之后找到用户名与密码字段,最后打包出一个 HTTP POST 请求,完成用户名和密码提交
4. 服务器会返回一个 HTTP 回应,你解析相应的 html 判断正确与否
实践证明上面的思路是对HTTP协议不了解的结果,这样做的话基本上是做不出来的。
客户端请求
GET / HTTP/1.1 Host:www.google.com
获得服务器的网页源码
根据源码信息处理字符串获得其中的title里面的内容。
windows下的实现:
发送的字符串处理
/*
* 分离url中的主机地址和相对路径
*/
strcpy(myurl, url);
for (pHost = myurl; *pHost != '/' && *pHost != '\0'; ++pHost);
if ( (int)(pHost - myurl) == strlen(myurl) )
strcpy(GET, "/");
else
strcpy(GET, pHost);
*pHost = '\0';
strcpy(host, myurl); //myurl copy to struct struct hostent just like www.baidu.com
printf("%s\n%s\n", host, GET);
网络端口socket的初始化
/*
* 设定socket参数,并未真正初始化
*/
sockfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
pURL = gethostbyname(host);
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = *((unsigned long*)pURL->h_addr);
addr.sin_port = htons(80);
发送http协议的规定
/*
* 组织发送到web服务器的信息
* 为何要发送下面的信息请参考HTTP协议的约定
*/
strcat(header, "GET ");
strcat(header, GET);
strcat(header, " HTTP/1.1\r\n");
strcat(header, "HOST: ");
strcat(header, host);
strcat(header, "\r\nConnection: Close\r\n\r\n");
连接到服务器并发送
/*
* 连接到服务器,发送请求header,并接受反馈(即网页源代码)
*/
connect(sockfd,(SOCKADDR *)&addr,sizeof(addr));
send(sockfd, header, strlen(header), 0);
处理字符串的主要实现:
while ( recv(sockfd, text, BUFSIZ, 0) > 0)
{
if (q=strstr(text,"<title>"))
{
q+=7;
if((p=strtok(q,"</title>")))
{
printf("%s\n",p);
}
}
//printf("%s",text);
//memset(text,0,sizeof(text));
}
linux下的实现类似,主要是在发送接收一些接口的修改,自己动手做提高会更高。
我本人就是根据上面的源码进行修改,查询,才完成的,对于Linux下socket的应用真的是太广泛了,以前没有发现这么强大的socket,只是停留在表面没有沉到湖底领略无线风光,真的是感觉自己浪费了太多的时间了,没有好好的深入研究,以前也太浮躁了,自以为这些都很简单,殊不知难以完成。
http://zh.wikipedia.org/zh-cn/%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE
http://hi.baidu.com/blackbear008/blog/item/06b42c31e3e183bd5fdf0e4d.html更多推荐
所有评论(0)