找回密码
 立即注册
搜索
热搜: 中医 针灸 咳嗽
查看: 199|回复: 0

C语言HTML爬虫

[复制链接]

3706

主题

1

回帖

1万

积分

管理员

积分
11870
发表于 2023-2-24 23:12:51 | 显示全部楼层 |阅读模式
该代码实现了一个基本的HTTP客户端,可以从命令行传入服务器IP地址、端口号和URL,然后向服务器发送GET请求并打印响应。如果出现错误,会打印错误信息并返回非零值。需要注意的是,这个实现没有进行错误处理或超时控制,仅适用于简单的HTTP请求。


  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/socket.h>
  5. #include <arpa/inet.h>
  6. #include <unistd.h>

  7. #define BUFFER_SIZE 4096

  8. int main(int argc, char* argv[]) {
  9.     if (argc != 4) {
  10.         printf("Usage: %s <server_ip> <server_port> <url>\n", argv[0]);
  11.         return 1;
  12.     }

  13.     // 解析命令行参数
  14.     char* server_ip = argv[1];
  15.     int server_port = atoi(argv[2]);
  16.     char* url = argv[3];

  17.     // 创建socket
  18.     int sock = socket(AF_INET, SOCK_STREAM, 0);
  19.     if (sock < 0) {
  20.         perror("socket creation failed");
  21.         return 1;
  22.     }

  23.     // 设置服务器地址信息
  24.     struct sockaddr_in server_addr;
  25.     memset(&server_addr, 0, sizeof(server_addr));
  26.     server_addr.sin_family = AF_INET;
  27.     server_addr.sin_addr.s_addr = inet_addr(server_ip);
  28.     server_addr.sin_port = htons(server_port);

  29.     // 连接服务器
  30.     if (connect(sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
  31.         perror("connect failed");
  32.         close(sock);
  33.         return 1;
  34.     }

  35.     // 构造HTTP请求
  36.     char request[BUFFER_SIZE];
  37.     snprintf(request, BUFFER_SIZE, "GET %s HTTP/1.1\r\nHost: %s:%d\r\n\r\n", url, server_ip, server_port);

  38.     // 发送HTTP请求
  39.     if (send(sock, request, strlen(request), 0) < 0) {
  40.         perror("send failed");
  41.         close(sock);
  42.         return 1;
  43.     }

  44.     // 接收HTTP响应
  45.     char response[BUFFER_SIZE];
  46.     int response_len = 0;
  47.     while ((response_len = recv(sock, response, BUFFER_SIZE - 1, 0)) > 0) {
  48.         response[response_len] = '\0';
  49.         printf("%s", response);
  50.     }
  51.     if (response_len < 0) {
  52.         perror("recv failed");
  53.         close(sock);
  54.         return 1;
  55.     }

  56.     // 关闭socket
  57.     close(sock);

  58.     return 0;
  59. }
复制代码


编译

gcc -o http_client http_client.c

运行:


./http_client <server_ip> <server_port> <url>


51单片机下运行
  1. #include <reg52.h>

  2. #define BUFFER_SIZE 512

  3. sbit led = P1^0;

  4. void delay(int ms) {
  5.     int i, j;
  6.     for (i = 0; i < ms; i++) {
  7.         for (j = 0; j < 120; j++);
  8.     }
  9. }

  10. void send_char(char c) {
  11.     SBUF = c;
  12.     while (TI == 0);
  13.     TI = 0;
  14. }

  15. void send_string(char* str) {
  16.     while (*str) {
  17.         send_char(*str++);
  18.     }
  19. }

  20. void main() {
  21.     char server_ip[] = "192.168.1.100";
  22.     int server_port = 80;
  23.     char url[] = "/index.html";
  24.     char request[BUFFER_SIZE];
  25.     char response[BUFFER_SIZE];
  26.     int response_len = 0;

  27.     TMOD = 0x20;
  28.     TH1 = 0xfd;
  29.     TL1 = TH1;
  30.     TR1 = 1;
  31.     SM0 = 0;
  32.     SM1 = 1;
  33.     REN = 1;
  34.     EA = 1;
  35.     ES = 1;

  36.     // 构造HTTP请求
  37.     sprintf(request, "GET %s HTTP/1.1\r\nHost: %s:%d\r\n\r\n", url, server_ip, server_port);

  38.     // 发送HTTP请求
  39.     send_string(request);

  40.     // 接收HTTP响应
  41.     while (1) {
  42.         while (RI == 0);
  43.         response[response_len++] = SBUF;
  44.         RI = 0;
  45.         if (response_len >= BUFFER_SIZE) {
  46.             break;
  47.         }
  48.         if (response[response_len-1] == '\n' && response[response_len-2] == '\r') {
  49.             break;
  50.         }
  51.     }

  52.     // 输出HTTP响应
  53.     response[response_len] = '\0';
  54.     send_string(response);

  55.     while (1) {
  56.         led = ~led;
  57.         delay(500);
  58.     }
  59. }
复制代码



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|私人站点 ( 冀ICP备2023028127号-2 )

GMT+8, 2025-4-19 12:09 , Processed in 0.086984 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表