用C语言写爬虫程序采集美图录图片

news/2024/7/19 12:32:21 标签: c语言, 爬虫, 开发语言, swift, r语言, 代码

最近有个公司找我,说他们在某图库充值会员,想要使用里面的图片,而是是海量,问我有没有办法做个筛选并下载保存,成了给我包个大红包。这事有啥难得,以我现在的专业知识储备,这种事情分分钟就解决。

在这里插入图片描述

以下是一个简单的C爬虫程序。在这个例子中,我们使用了libcurl库来发送HTTP请求和处理响应。我们还使用了pcre库来解析HTML并提取图片链接。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
#include <pcre.h>

#define URL "meitu"
#define PROXY_HOST "duoip"
#define PROXY_PORT "8000"
#define MAX_LINKS 10

int main() {
    CURL *curl;
    CURLcode res;
    char *url, *proxy_host, *proxy_port;
    int i, n_links;
    char **links;
    pcre *re;
    pcre_extra *extra;

    // 初始化libcurl和libpcre
    curl_global_init(CURL_GLOBAL_DEFAULT);
    re = pcre_compile("http://www\\.meitu\\.com/.*\\.jpg", PCRE_CASELESS | PCRE_EXTENDED, &extra, 0, NULL);
    if (re == NULL) {
        fprintf(stderr, "pcre_compile error: %s\n", extra->error_message);
        pcre_free_study(extra);
        curl_global_cleanup();
        return 1;
    }
    pcre_free_study(extra);

    // 创建一个CURL会话
    curl = curl_easy_init();
    if (curl) {
        // 设置代理服务器
        // 提取ip  "jshk.com.cn/mb/reg.asp?kefu=xjy&csdn"
        proxy_host = (char *)malloc(strlen(PROXY_HOST) + 1);
        proxy_port = (char *)malloc(strlen(PROXY_PORT) + 1);
        strcpy(proxy_host, PROXY_HOST);
        strcpy(proxy_port, PROXY_PORT);
        curl_easy_setopt(curl, CURLOPT_PROXY, proxy_host);
        curl_easy_setopt(curl, CURLOPT_PROXY_PORT, proxy_port);

        // 设置URL
        url = (char *)malloc(strlen(URL) + 1);
        strcpy(url, URL);

        // 发送HTTP请求
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, NULL);

        // 执行请求
        res = curl_easy_perform(curl);

        // 检查错误
        if (res != CURLE_OK) {
            fprintf(stderr, "curl_easy_perform error: %s\n", curl_easy_strerror(res));
            curl_easy_cleanup(curl);
            return 1;
        }

        // 释放资源
        curl_easy_cleanup(curl);

        // 解析HTML并提取图片链接
        n_links = parse_html(url, re, MAX_LINKS, &links);
        if (n_links < 0) {
            fprintf(stderr, "pcre_exec error: %s\n", re->error_message);
            pcre_free(re);
            return 1;
        }
        pcre_free(re);

        // 打印图片链接
        for (i = 0; i < n_links; i++) {
            printf("%s\n", links[i]);
        }
        free(links);
    }

    // 释放资源
    curl_global_cleanup();

    return 0;
}

// 用于处理HTTP响应的回调函数
size_t write_callback(char *buffer, size_t size, size_t nmemb, void *userp) {
    size_t total = size * nmemb;
    FILE *fp = (FILE *)userp;
    if (fp) {
        fwrite(buffer, total, 1, fp);
    }
    return total;
}

// 用于解析HTML并提取图片链接的函数
int parse_html(char *url, pcre *re, int max_links, char **links) {
    FILE *fp;
    char buffer[4096];
    int i, n_links;
    pcre_exec_t *match;

    // 打开URL
    fp = fopen(url, "r");
    if (fp == NULL) {
        fprintf(stderr, "fopen error: %s\n", strerror(errno));
        return -1;
    }

    // 逐行读取HTML
    n_links = 0;
    while (fgets(buffer, sizeof(buffer), fp)) {
        // 使用正则表达式匹配图片链接
        match = pcre_exec(re, NULL, buffer, strlen(buffer), 0, 0, NULL, 0);
        if (match) {
            if (n_links >= max_links) {
                break;
            }
            links[n_links++] = malloc(strlen(buffer) + 1);
            strcpy(links[n_links - 1], buffer + match[1].offset);
        }
    }

    // 关闭文件
    fclose(fp);

    // 清理资源
    pcre_free_study(re);
    for (i = 0; i < n_links; i++) {
        free(links[i]);
    }

    return n_links;
}

这段代码首先初始化了libcurl和libpcre,然后创建了一个CURL会话并设置了代理服务器。然后,它发送了一个HTTP请求到指定的URL,并将响应写入到一个文件中。然后,它解析了HTML并提取了其中的所有图片链接。最后,它打印了这些链接并释放了资源。

注意,这个程序并没有处理任何错误,例如网络错误或文件I/O错误。在实际使用中,你可能需要添加错误处理代码

虽然说我思路很清晰,但是写作过程中还是会出现一些小错误,这就要求我们在写作过程中一定要细心,否则出现一个小bug可能要花你大半时间来找问题。如果有相关问题可以评论区留言讨论。


http://www.niftyadmin.cn/n/5281260.html

相关文章

NPM介绍与使用

什么是NPM&#xff1f; NPM&#xff08;Node Package Manager&#xff09;是一个强大的包管理工具&#xff0c;专门用于Node.js应用程序的依赖管理。它允许开发者轻松地分享、安装、更新和管理项目中使用的库、工具和框架。 NPM的安装 在使用NPM之前&#xff0c;请确保你的机…

基于单片机设计的指纹锁(读取、录入、验证指纹)

一、前言 指纹识别技术是一种常见的生物识别技术&#xff0c;利用每个人指纹的唯一性进行身份认证。相比于传统的密码锁或者钥匙锁&#xff0c;指纹锁具有更高的安全性和便利性&#xff0c;以及防止钥匙丢失或密码泄露的优势。 基于单片机设计的指纹锁项目是利用STC89C52作为…

STM32 IIC温湿度传感器(STH45)实验

SHT45 简介 .精度 ΔRH 1.0 %RH&#xff0c; ΔT 0.1 C • VDD 1.08 V …3.6 V • 平均电流&#xff1a;0.4 μA&#xff0c;空闲电流&#xff1a;80 nA • I2C FM、CRC 校验和、乘法。I2C 地址。 • 专利保护选项 [1]、PTFE 膜和可拆卸保护盖 • 工作范围&#xff1a;0 ……

如何将阿里通义千问大模型AI接入自己的项目里

如何将阿里通义千问大模型AI接入自己的项目里 一、阿里通义千问大模型API二、使用步骤1、接口2、请求参数3、请求参数示例4、接口 返回示例 三、 如何获取appKey和uid1、申请appKey:2、获取appKey和uid 四、重要说明 一、阿里通义千问大模型API 基于阿里通义千问大模型AI的智能…

Python的内存管理与垃圾回收机制

内存管理 Python的内存管理主要由Python的内存管理器负责。Python的内存管理器会负责为对象分配内存&#xff0c;并在不再需要时将其回收。这种管理方式通常称为“自动内存管理”。 在Python中&#xff0c;当你创建一个对象&#xff08;例如&#xff0c;一个列表或字典&#…

深度学习计算数据集里所有图像像素点的均值方差

代码怕忘记&#xff0c;现在贴上来&#xff0c;以防丢失 from torch.utils.data import DataLoader from torchvision.datasets import ImageFolder import torch from torchvision import transformsdef get_mean_and_std(data_path, in_chans3):dataset ImageFolder(rootda…

spring基于Xml管理bean---Ioc依赖注入:对象类型属性赋值(1)----外部bean的引入(bean和bean之间的引入)

文章目录 注入普通属性的方式1、set方法注入2、构造器&#xff08;构造方法&#xff09;注入 总结&#xff1a;注入对象类型属性 注入普通属性的方式 1、set方法注入 2、构造器&#xff08;构造方法&#xff09;注入 总结&#xff1a; set方法注入和构造器方法的注入&#…

NLP中的嵌入层

在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;嵌入层&#xff08;Embedding Layer&#xff09;是一个特殊的层&#xff0c;通常用于深度学习模型的第一层&#xff0c;它的作用是将离散的文本数据&#xff08;如单词或短语&#xff09;转换为连续的向量表示。每个单…