• C语言调用curl库抓取网页图片(转)


    思路是先用curl抓取网页源码,然后以关键字寻找出图片网址。

     范例:
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <string.h>
     4 #include <curl/curl.h>
     5  
     6 void get_key_from_str(char *origin, char *str1, char *str2, char *key);
     7  
     8 int main(int argc, char **argv)
     9 {
    10     CURL *curl;
    11     FILE *fp = NULL, *fp_read = NULL;
    12     int file_size = 0;
    13     char *tmp = NULL;
    14     int flag = 0;
    15     char key[1024] = {0};
    16     char str1[128] = {0};
    17     char str2[128] = {0};
    18 
    19     if ((fp = fopen("test.txt", "w")) == NULL)
    20     {
    21         return 1;
    22     }
    23     curl = curl_easy_init();
    24     if (curl)
    25     {
    26         flag = 1;
    27         curl_easy_setopt(curl, CURLOPT_URL, argv[1]);     //curl设置网址
    28         curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);     //将网页源码存在文件中,好像只能存文件,不能存字符串
    29         curl_easy_perform(curl);//开始抓取
    30         curl_easy_cleanup(curl);
    31         fclose(fp);
    32         fp_read = fopen("test.txt", "rb");
    33         fseek(fp_read, 0, SEEK_END);      //把指针移到文本最后
    34         file_size = ftell(fp_read)     ;//算出文本大小
    35         fseek(fp_read, 0, SEEK_SET);     //再把指针移到最前面
    36         tmp = (char *)malloc(file_size * sizeof(char));     //malloc一段内存
    37         printf("file_size:%d
    ", file_size);
    38         fread(tmp, file_size, sizeof(char), fp_read);     //读取文件
    39         fclose(fp_read);
    40         snprintf(str1, sizeof(str1), "img src="");
    41         snprintf(str2, sizeof(str2), """);
    42         get_key_from_str(tmp, str1, str2, key);     //取得网址
    43  
    44         printf("key:%s
    ", key);
    45         free(tmp);
    46     }
    47  
    48     if (!flag)
    49     {
    50         fclose(fp);
    51     }
    52  
    53     return 0;
    54 }
    55 //抓取str1和str2之间的关键字
    56 void get_key_from_str(char *origin, char *str1, char *str2, char *key)
    57 {
    58     char *p = strstr(origin, str1);
    59     char *q = strstr(p + strlen(str1), str2);
    60     int len = q - p - strlen(str1);
    61     snprintf(key, len + 1, "%s", p + strlen(str1));
    62     key[len + 1] = '';
    63 }


    gcc -g -Wall main.c -o test -lcurl

    ./test url

  • 相关阅读:
    JUC原子类 1
    线程优先级和守护线程
    多线程中断
    关于html5不支持frameset的解决方法
    shell中$0,$?,$!等的特殊用法
    Linux GCC常用命令
    C/C++中extern关键字详解
    js实现iframe自适应高度
    java线程安全总结
    Linux平台Java调用so库-JNI使用例子
  • 原文地址:https://www.cnblogs.com/jikexianfeng/p/6155773.html
Copyright © 2020-2023  润新知