文档章节

C语言下载网页源代码并保存到本地磁盘

努力喵
 努力喵
发布于 2015/11/24 02:20
字数 548
阅读 219
收藏 10
点赞 0
评论 0
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")


int geturl(char *url)
{
    /****************解析URL,解析资源名、主机名********************/ 
    const char *parseptr1;
    const char *parseptr2;
    char host[BUFSIZ];
    char resource[BUFSIZ];
    int len, i;
    
    parseptr2 = url;
    
    parseptr1 = strstr(parseptr2, "http://");
    if(NULL == parseptr1)           //解析用户输入URL形式如"www.baidu.com" 情况 
    {
        parseptr1 = strchr(parseptr2, '/');
        len = parseptr1 - parseptr2;
        if(NULL == parseptr1) //解析主机、资源名 
        {
            strcpy(host, parseptr2);
            strcpy(resource, "/");
        }
        else     //解析用户输入URL形式如"www.baidu.com/xxx"情况 
        {
            for(i = 0; i < len; i++)
            {
                host[i] = parseptr2[i];//解析主机名 
            }
            host[len] = '\0';
            for(i = 0; i < len; i++)
            {
                parseptr2++;
            }
            strcpy(resource, parseptr2);//解析资源名 
        }
        printf("host: %s\nresouce: %s\n", host, resource);
    }
    else
    {
        parseptr1 = strchr(parseptr2, ':');  //解析用户输入URL形式如"http://www.baidu.com"情况 
        len = parseptr1 - parseptr2;
        printf("protocol: ");   //解析协议 
        for(i = 0; i < len; i++)
        {
            printf("%c", parseptr2[i]);
        }
        for(i = 0; i < 3; i++)
        {
            parseptr1++;
        }
        parseptr2 = parseptr1;
        parseptr1 = strchr(parseptr2, '/');
        len = parseptr1 - parseptr2;
        if(NULL == parseptr1)
        {
            strcpy(host, parseptr2);     //解析主机名 
            strcpy(resource, "/");       //解析资源名 
        }
        else   //解析用户输入URL形式如"http://www.baidu.com/xxx.."情况 
        {
            for(i = 0; i < len; i++)
            {
                host[i] = parseptr2[i];
            }
            host[len] = '\0';
            parseptr2 = parseptr1;
            strcpy(resource, parseptr2);
        }
        
        printf("\nhost: %s\nresource: %s\n", host, resource);
    }
    
    /*****************创建socket************/ 
    //初始化套接字
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2,2), &wsaData);
    
    //创建套接字
    SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(sock == INVALID_SOCKET)
    {
        printf("Failed socket().\n");
        WSACleanup();
        return 0;
    }
    
    //设置socket参数
    struct sockaddr_in sockAddr;
    memset(&sockAddr, 0, sizeof(sockAddr));
    sockAddr.sin_family = AF_INET;
    sockAddr.sin_port = htons(80);
    
    //获取主机名和地址信息
    struct hostent *hp = gethostbyname(host);
    if(hp == NULL)
    {
        printf("Can not find host address.\n");
        return 0;
    }
    sockAddr.sin_addr.s_addr = *((unsigned long *)hp->h_addr);
    
    //连接到服务器
    if(connect(sock, (SOCKADDR *)&sockAddr, sizeof(sockAddr)) == -1)
    {
        printf("Failed connect().\n");
        WSACleanup();
        return 0;
    }
    
    
    /****************与服务器通信,收发数据***************/ 
    //准备发送数据
    char request[BUFSIZ] = "";
    //request = "GET " + resource + " HTTP/1.1\r\nHost:" + host + "\r\nConnection:Close\r\n\r\n";
    strcat(request, "GET ");
    strcat(request, resource);
    strcat(request, " HTTP/1.1\r\nHost:");
    strcat(request, host);
    strcat(request, "\r\nConnection:Close\r\n\r\n");
    
    //发送数据
    if(SOCKET_ERROR==send(sock, request, sizeof(request), 0))
    {
        printf("Send error.\n");
        closesocket(sock);
        return 0;
    }
    
    //接收数据
    FILE *fp;
    char ch;
    static char pageBuf[BUFSIZ];
    printf("Read: ");
    int ret;
    while(ret > 0)
    {
        ret = recv(sock, pageBuf, BUFSIZ, 0);
        printf("%s", pageBuf);
        if((fp = fopen("website.txt", "ab")) == NULL)//创建文件,并保存源码到本地磁盘
        {
            fprintf(stderr, "Error opening file.\n");
            exit(1);
        }
        fputs(pageBuf, fp);
        fclose(fp);
        //strnset(pageBuf, '\0', BUFSIZ);
    }
    
    closesocket(sock);
    WSACleanup();
    return 0; 
}

int main(int argc, char *argv[])
{
    char url[256];
    puts("Enter URL:");
    scanf("%s", url);
    geturl(url);
    return 0;
}


© 著作权归作者所有

共有 人打赏支持
努力喵
粉丝 5
博文 105
码字总数 34117
作品 0
广州
Apache-Commons IO

工具类一共6个: org.apache.commons.io.filefilter.FileFilterUtils org.apache.commons.io. EndianUtils FilenameUtils FileSystemUtils FileUtils IOUtils 普通地读取一个网页的源代码的代......

Zhao-Qian ⋅ 2014/11/04 ⋅ 0

Python 爬虫 上篇

Python安装 python学习 一 python语法,及变量类型 python学习 二 爬一个图片网站上 python学习 二 02 爬一个图片网站,获得主链接网址,并保存 python学习 二 03 爬一个图片网站-获得所有分...

gudianxiaoshuo ⋅ 01/14 ⋅ 0

如何获得本地文件的源代码html

我下载了一篇网页,保存到本地文件夹里,可怎么用java获得其源代码html呀?请高人指教。

hebeijpp ⋅ 2011/09/08 ⋅ 3

Java通过HttpServletResponse下载文件并避免文件名乱码

使用Java下载文件方式很常用,废话不多说,先说明一下情况。 场景:通过程序(或者定时任务)生成文件到服务器本地磁盘,数据库中保存文件生成信息(非重点),通过网页一链接下载服务器本地...

郁极风 ⋅ 2016/08/10 ⋅ 0

[C++] C++程序执行过程

要理解一个程序的执行过程,首先要理解什么是编译器。我们用C语言写的程序,计算机只能识别机器语言(二进制指令),计算机并不能理解。因此,必须 将C语言转换为机器语言。编译器就是用来实...

枫兮兮 ⋅ 2014/03/12 ⋅ 0

Python3 字符编码

原文出处:http://www.cnblogs.com/284628487a/p/5584714.html 编码 字符串是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。 因为计算机只能处理数字,如果要处理文本,就必须先...

kuSorZ ⋅ 2017/10/22 ⋅ 0

Python爬虫--抓取百度贴吧图片

在我们日常上网浏览网页的时候,经常会看到一些好看的图片,我们就希望把这些图片保存下载,或者用户用来做桌面壁纸,或者用来做设计的素材。   我们最常规的做法就是通过鼠标右键,选择另...

周东尧 ⋅ 2016/08/20 ⋅ 0

WebRTC 入门到放弃(一)WebRTC

前言   WebRTC,名称源自网页实时通信(Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的技术,是谷歌2010年以6820万美元收购Global IP Solutions...

tinywan1227 ⋅ 2017/12/07 ⋅ 0

下载 tumblr 标记为喜欢的内容

源代码发布在github : gettumblrlikes 一、介绍 本项目使用 python 编写,分析 tumblr 账户中喜欢的内容,给出资源链接,并下载。 其中 是一份 tumblr 返回的喜欢数据的 json 示例,提取里面...

u011303443 ⋅ 03/03 ⋅ 0

IntelliJ IDEA系列编辑器安装GO插件

插件GITHUB主页:https://github.com/go-lang-plugin-org/go-lang-idea-plugin 插件plugins主页:https://plugins.jetbrains.com/plugin/5047 1、查看编辑器版本: 查看关于窗口(PHPStorm>......

dingdayu ⋅ 2016/12/18 ⋅ 4

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Day 17 vim简介与一般模式介绍

vim简介 vi和Vim的最大区别就是编辑一个文件时vi不会显示颜色,而Vim会显示颜色。显示颜色更便于用户编辑,凄然功能没有太大的区别 使用 yum install -y vim-enhanced 安装 vim的三种常用模式...

杉下 ⋅ 45分钟前 ⋅ 0

【每天一个JQuery特效】根据可见状态确定是否显示或隐藏元素(3)

效果图示: 主要代码: <!DOCTYPE html><html><head><meta charset="UTF-8"><title>根据可见状态确定 是否显示或隐藏元素</title><script src="js/jquery-3.3.1.min.js" ty......

Rhymo-Wu ⋅ 54分钟前 ⋅ 0

OSChina 周四乱弹 —— 初中我身体就已经垮了,不知道为什么

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @加油东溪少年 :下完这场雨 后弦 《下完这场雨》- 后弦 手机党少年们想听歌,请使劲儿戳(这里) @马丁的代码 :买了日本 日本果然赢了 翻了...

小小编辑 ⋅ 今天 ⋅ 12

浅谈springboot Web模式下的线程安全问题

我们在@RestController下,一般都是@AutoWired一些Service,由于这些Service都是单例,所以并不存在线程安全问题。 由于Controller本身是单例模式 (非线程安全的), 这意味着每个request过来,...

算法之名 ⋅ 今天 ⋅ 0

知乎Java数据结构

作者:匿名用户 链接:https://www.zhihu.com/question/35947829/answer/66113038 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 感觉知乎上嘲讽题主简...

颖伙虫 ⋅ 今天 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部