上一篇文章我是用C++写的一个爬取亚马逊的爬虫程序,相信大家已经看过了,这次呢,我依然使用C语言来写一个爬虫,大体上思路是和之前一样,只是支持的库以及语法有些区别,具体的呢我会一一解释出来,方便大家查阅。
#include
#include
#include
#include
int main() {
CURL *curl;
CURLcode res;
char *url = "https://www.amazon.com";
// 提取爬虫ip jshk.com.cn/mb/reg.asp?kefu=xjy&csdn
char *proxy_host = "duoip";
int proxy_port = 8000;
char *ch = NULL;
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ch);
curl_easy_setopt(curl, CURLOPT_PROXY, proxy_host);
curl_easy_setopt(curl, CURLOPT_PROXYPORT, proxy_port);
res = curl_easy_perform(curl);
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
curl_easy_cleanup(curl);
}
curl_global_cleanup();
if(ch) free(ch);
return 0;
}
1、#include
:这个头文件包含了标准输入输出文件流的定义和函数声明。
2、#include
:这个头文件包含了各种系统函数的定义和声明,如malloc、free等。
3、#include
:这个头文件包含了各种字符串函数的定义和声明,如strcpy、strlen等。
4、#include
:这个头文件包含了libcurl库函数的定义和声明。
5、int main() { ..、}
:这是一个标准的C程序的主函数入口。
6、CURL *curl;
:这是一个全局变量,用于存放libcurl库的句柄。
7、CURLcode res;
:这是一个全局变量,用于存放libcurl库的错误代码。
8、char *url = "https://www.amazon.com";
:这是一个字符串指针,用于存放要访问的URL。
9、char *proxy_host = "duoip";
:这是一个字符串指针,用于存放代理服务器的主机名。
10、int proxy_port = 8000;
:这是一个整数变量,用于存放代理服务器的端口号。
11、char *ch = NULL;
:这是一个字符串指针,用于存放libcurl库的返回数据。
12、curl_global_init(CURL_GLOBAL_DEFAULT);
:这是一个libcurl库的函数,用于初始化libcurl库。
13、curl = curl_easy_init();
:这是一个libcurl库的函数,用于创建一个libcurl库的句柄。
14、if(curl) { ..、}
:这是一个if语句,用于判断libcurl库的句柄是否成功创建。
15、curl_easy_setopt(curl, CURLOPT_URL, url);
:这是一个libcurl库的函数,用于设置要访问的URL。
16、curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL);
:这是一个libcurl库的函数,用于设置数据写入函数。
17、curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ch);
:这是一个libcurl库的函数,用于设置数据写入的数据指针。
18、curl_easy_setopt(curl, CURLOPT_PROXY, proxy_host);
:这是一个libcurl库的函数,用于设置代理服务器的主机名。
19、curl_easy_setopt(curl, CURLOPT_PROXYPORT, proxy_port);
:这是一个libcurl库的函数,用于设置代理服务器的端口号。
20、res = curl_easy_perform(curl);
:这是一个libcurl库的函数,用于发送请求并获取响应。
21、if(res != CURLE_OK) { ..、}
:这是一个if语句,用于判断libcurl库的错误代码是否为CURLE_OK,即请求是否成功。
22、fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
:这是一个标准库函数,用于输出错误信息。
23、curl_easy_cleanup(curl);
:这是一个libcurl库的函数,用于清除libcurl库的句柄。
24、curl_global_cleanup();
:这是一个libcurl库的函数,用于清除libcurl库的全局数据。
25、if(ch) free(ch);
:这是一个if语句,用于判断ch是否为空指针,如果是则调用free函数释放ch所指向的内存。
26、return 0;
:这是一个标准的C程序的返回值,表示程序成功运行。
以上就是今天我编程的全部内容,其实总体思路还是和上一篇差不多。只是这次使用的库不同,但是都一样能达到自己想要的效果,两者选其一就行。如果有更多有趣好玩的爬虫代码,记得评论区留言给我。