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

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

在这里插入图片描述

以下是一个简单的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 10int main() {CURL *curl;CURLcode res;char *url, *proxy_host, *proxy_port;int i, n_links;char **links;pcre *re;pcre_extra *extra;// 初始化libcurl和libpcrecurl_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);// 设置URLurl = (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;// 打开URLfp = fopen(url, "r");if (fp == NULL) {fprintf(stderr, "fopen error: %s\n", strerror(errno));return -1;}// 逐行读取HTMLn_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.hqwc.cn/news/305529.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打开相机失败 出现错误的原因

如何解决&#xff1f; Debug中缺少DLL文件 以下参考周姐文档 相机调用步骤 学习相机第三方库的安装 https://blog.csdn.net/Qingshan_z/article/details/117257136书签&#xff1a;QT添加库&#xff08;静态库和动态库&#xff09;_Qingshan_z的博客-CSDN博客_qt添加库 添加文…

九九乘法表c 语言 用于打印九九乘法表

以下是一个简单的C语言程序&#xff0c;用于打印九九乘法表&#xff1a; #include <stdio.h>int main() {int i, j;for (i 1; i < 9; i) {for (j 1; j < i; j) {printf("%d*%d%-2d ", j, i, i*j);}printf("\n");}return 0; }解释&#xff1…

java设计模式学习之【迭代器模式】

文章目录 引言迭代器模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用迭代器示例代码地址 引言 想象一下&#xff0c;你在一个书店里浏览各种书籍。你可能会从头到尾查看每一本书&#xff0c;或者可能跳过一些不感兴趣的部分。在这个过程中&#xff0c;你实…

亚马逊多店铺怎么解决后台绑卡付店铺月租?

一、如何解决亚马逊后台绑卡付店铺月租费的问题呢&#xff1f; 在亚马逊开很多店的玩法&#xff0c;是如何有那么多的实体卡去绑定后台扣月租的呢&#xff1f; 做日亚、美亚店群模式的这种玩法是如何解决亚马逊后台交月租费的问题呢&#xff1f; 其实很简单&#xff0c;他们…

C++ DAY2作业

1.课堂struct练习&#xff0c;用class&#xff1b; #include <iostream>using namespace std;class Stu { private:int age;char sex;int high; public:double score;void set_values(int a,char b,int c,double d);int get_age();char get_sex();int get_high(); }; vo…

AI时代下,如何看待“算法利维坦”?

ChatGPT的浪潮从2022年袭来后&#xff0c;至今热度不减&#xff0c;呈现出蓬勃发展的趋势。AI家居、医疗、教育、金融、公益、农业、艺术…AI真的已经走进了生活的方方面面&#xff0c;我们仿佛已经进入了AI时代&#xff0c;势不可挡。人工智能水平如此之高&#xff0c;不禁感慨…

仪表盘、数据分析新增分享功能及应用服务下新增服务实例菜单

近期&#xff0c;博睿数据根据一体化智能可观测平台 Bonree ONE 产品本身&#xff0c;以及用户反馈进行持续的更新和优化。以下为 Bonree ONE 产品功能更新报告第03期内容&#xff0c;更多探索&#xff0c;未完待续。 本次迭代的更新集中在平台的仪表盘、数据分析新增分享功能&…

Ubuntu18.04安装GTSAM库并验证GTSAM是否安装成功(亲测可用)

在SLAM&#xff08;Simultaneous Localization and Mapping&#xff09;和SFM&#xff08;Structure from Motion&#xff09;这些复杂的估计问题中&#xff0c;因子图算法以其高效和灵活性而脱颖而出&#xff0c;成为图模型领域的核心技术。GTSAM&#xff08;Georgia Tech Smo…

【CSS】基础知识梳理和总结

1. 前言 CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式表&#xff09;&#xff0c;用来为HTML文档添加样式的计算机语言。HTML中加载样式的方法有三种&#xff1a; 通过<link>标签加载外部样式表&#xff08;External Style Sheet&#xff09;&#xff0c…

腾讯云服务器如何买(购买腾讯云服务器的详细步骤)

腾讯云服务器购买流程直接在官方秒杀活动上购买比较划算&#xff0c;在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵&#xff0c;但是自定义购买云服务器CPU内存带宽配置选择范围广&#xff0c;活动上购买只能选择固定的活动机&#xff0c;选择范围窄&#xff0c;但是…

1.3MySQL中的自连接

自己的表和自己连接&#xff0c;核心&#xff1a;一张表拆为两张一样的表。 语法&#xff1a;select 字段列表 from 表 [as] 表别名1,表 [as] 表别名2 where 条件...; 关于怎样把一个表拆分成一个表&#xff0c;只要给它们分别取别名就行 categoryidpidcategoryname21信息…

计算机操作系统(OS)——P1操作系统概述

1、操作系统的概念(定义) 1.1、什么是操作系统 __操作系统&#xff08;Operating System&#xff0c;OS&#xff09;&#xff1a;__是指控制和管理整个计算机系统的__硬件和软件__资源&#xff0c;并合理的组织调度计算机的工作和资源的分配&#xff1b;以__提供给用户和其它…