C语言实现网络爬虫

我常使用C语言写网络爬虫,能够将网页爬出来,但是,图片却爬不出来,有没有大佬帮解决一下!!!

代码:

#include <stdio.h>
#include<string.h>
#include<WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
/*
网络部分:http  url
url 三部分
https://www.baidu.com/?tn=62095104_29_oem_dg&ch=6
1.协议	http 超文本传输协议
2.主机名  www.baidu.com  需要的ip地址  240e:ff:e020:966:0:ff:b042:f296
3.资源名 /?tn=62095104_29_oem_dg&ch=6*/void parseUrl(const char* url, char* host, char* resPath);
void getImgUrl(const char* html, char* imgUrl);typedef struct Spider
{char host[128];             //主机名char resPath[128];          //资源路径SOCKET fd;
}Spider;
//获取资源
void spider_init(Spider* spider, const char* url)
{memset(spider->host, 0, sizeof(spider->host));memset(spider->resPath, 0, sizeof(spider->host));parseUrl(url, spider->host, spider->resPath);
}
//连接到服务器:网络编程
void spider_connect(Spider* spider)
{//打开socket 2.2 确定买什么手机WSADATA wsadata;WSAStartup(MAKEWORD(2, 2), &wsadata);//创建socket 去买手机spider->fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (spider->fd == SOCKET_ERROR){printf("create socket falied %d\n", WSAGetLastError());return;}//通过域名获取ip地址HOSTENT* hent = gethostbyname(spider->host);if (!hent){printf("get host ip failed %d\n", WSAGetLastError());return;}//链接服务器SOCKADDR_IN addr;addr.sin_family = AF_INET;addr.sin_port = htons(80);			//端口号 http:80 端序memcpy(&addr.sin_addr, hent->h_addr, sizeof(IN_ADDR));if (SOCKET_ERROR == connect(spider->fd, &addr, sizeof(addr))){printf("connect falied %d\n", WSAGetLastError());return;}
}//解析域名
void parseUrl(const char* url, char* host, char* resPath)
{if (!url)return;//https://www.baidu.com/?tn=62095104_29_oem_dg&ch=6// www.baidu.com/?tn=62095104_29_oem_dg&ch=6const char* ph = strstr(url, "//");ph = ph ? ph + 2 : url;//简写puts(ph);const char* pp = strstr(ph, "/");if (!pp){strcpy(host, ph);strcpy(resPath, "/"); //index.html}else{//先获取hoststrncpy(host, ph, pp - ph);//再获取resapathstrcpy(resPath, pp);}
}
//获取网页
void getHtml(Spider* spider)
{//连接到服务器spider_connect(spider);//给服务器发送请求 char header[128] = { 0 };sprintf(header, "GET %s HTTP/1.1\r\n", spider->resPath);sprintf(header + strlen(header), "Host:%s\r\n", spider->host);strcat(header, "Connection:close\r\n");strcat(header, "\r\n");if (SOCKET_ERROR == send(spider->fd, header, strlen(header), 0)) {printf("send failed %d\n", WSAGetLastError());return;}char html[1024 * 5] = { 0 };//获取网页int len = recv(spider->fd, html, 1024 * 5, 0);if (len == SOCKET_ERROR) {printf("recv failed %d\n", WSAGetLastError());}else{//保存到文件FILE* fp = fopen("maye.html", "w");{if (!fp)return;}fwrite(html, sizeof(char), strlen(html), fp);fclose(fp);printf("%s\n", html);}char imgUrl[128] = { 0 };getImgUrl(html, imgUrl);  // 假设 getImgUrl 函数已经定义...Spider sp;spider_init(&sp, imgUrl);  // 初始化 Spider 对象spider_connect(&sp);sprintf(header, "GET %s HTTP/1.1\r\n", sp.resPath);sprintf(header + strlen(header), "Host:%s\r\n", sp.host);strcat(header, "Connection:close\r\n");strcat(header, "Content-Type: image/jpeg\r\n");strcat(header, "\r\n");puts(header);if (SOCKET_ERROR == send(spider->fd, header, strlen(header), 0)) {printf("send failed %d\n", WSAGetLastError());return;}//获取图片char recvBuf[1024] = { 0 };len = recv(sp.fd, recvBuf, 1023, 0);//查找有没有\r\n\r\nchar* psp = strstr(recvBuf, "\r\n\r\n");if (!psp)return;psp += sizeof("\r\n\r\n");//接收图片数据FILE* fp = fopen("hello.png", "wb");fwrite(psp, sizeof(char), len - (psp - recvBuf), fp);fclose(fp);//继续接受没有接受完毕的while (1){len = recv(sp.fd, recvBuf, 1023, 0);if (len < 0){break;}else{fwrite(recvBuf, sizeof(char), len, fp);}}fclose(fp);printf("%s\n", imgUrl);
}
//获取网页中的图片链接
void getImgUrl(const char* html, char* imgUrl)
{if (!html || !imgUrl)return;char* beg = strstr(html, "<img src=\"");if (!beg){return;}else{printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n");//puts(beg+10);beg += 10;}//找结尾的双引号char* end = strstr(beg, "\"");if (!end){printf("网页错误\n");}else{strncpy(imgUrl, beg, end - beg);}
}//下载图片int main()
{printf("请输入要爬取的网址>");char url[512] = "http://www.netbian.com";//gets_s(url, 128);puts(url);Spider sp;spider_init(&sp, url);printf("Host:%s resPath:%s\n", sp.host, sp.resPath);getHtml(&sp);getchar();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/666176.shtml

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

相关文章

【大厂AI课学习笔记】1.4 算法的进步(5)关于GPU

——关于GPU GPU&#xff0c;即图形处理器&#xff0c;最初是为了加速计算机图形处理而设计的。然而&#xff0c;随着时间的推移&#xff0c;研究人员发现GPU的并行处理能力非常适合执行深度学习中的大规模矩阵运算。这一点在吴恩达教授的论文中得到了充分体现&#xff0c;他利…

Vue中间件的讲解案例分析

Vue中间件的讲解案例分析 1. Axios中间件&#xff1a; Axios是一个常用的HTTP客户端&#xff0c;可以与Vue结合使用&#xff0c;处理网络请求和数据获取。您可以创建一个Axios实例&#xff0c;并将其作为Vue的原型属性或插件使用&#xff0c;以便在整个应用程序中共享和使用。…

国标GB/T 28181详解:设备视音频文件检索消息流程

目 录 一、设备视音频文件检索 二、设备视音频文件检索的基本要求 三、命令流程 1、流程图 2、流程描述 四、协议接口 五、产品说明 六、设备视音频文件检索的作用 七、参考 在国标GBT28181中&#xff0c;定义了设备视音频文件检索消息的流程&#xff0c;主…

Remote development in WSLWSL 中的远程开发

This tutorial walks you through enabling Windows Subsystem for Linux (WSL) and running Visual Studio Code in WSL using the WSL extension. 本教程将指导你启用适用于 Linux 的 Windows 子系统 &#xff08;WSL&#xff09; 并使用 WSL 扩展在 WSL 中运行 Visual Studi…

【C++】C++入门— 类与对象初步介绍

C入门 1 认识面向对象2 类的引入3 类的定义类的定义方式 4 类的访问限定符及封装访问限定符封装 Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;下一篇文章见&#xff01;&#xff01;&#xff01; 1 认识面向对象 C语言是面向过程的&#xff0c;关注…

【GameFramework框架】二、GameFramework框架介绍

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录&#xff1a; https://blog.csdn.net/q7…

前端html+css笔记

前端 Html: html标签 < strong >加粗 --文本格式化标签 < em >倾斜 < ins >下划线 < del >删除 < img src“图片的url” >src用于指定图像的位置名称(属性名属性值属性) alt 替换文本title 提示文本width 图片宽度 < a href“”>…

Python—数据可视化Seaborn大全:参数详解与实战案例全解析【第52篇—python:Seaborn大全】

文章目录 Seaborn库常用绘图详解与实战引言安装与导入一、散点图参数说明实战案例 二、直方图参数说明实战案例 三、线性关系图参数说明实战案例 四、热力图参数说明实战案例 五、分布图参数说明实战案例 六、箱线图参数说明实战案例 七、联合分布图参数说明实战案例 八、小提琴…

护眼灯几a级的好?最佳的AA级护眼台灯推荐

玩文字游戏&#xff0c;有些商家都是大师级的。我们在各电商平台挑选护眼灯时&#xff0c;都会看到这样一种宣传描述&#xff1a;AAA级全光谱或AAA级健康照明等3个A的字眼。不良品牌厂商在虚假宣传&#xff0c;将国际照明委员会对台灯光线的一个健康认证&#xff0c;也就是AAA级…

网络服务综合实验项目

目录 实验要求 运行环境 基础配置 业务需求 实验步骤 一、基础配置 1.1、配置静态IP 1.1.1、 在192.168.159.130中配置 1.1.2、 在192.168.159.131中配置 ​编辑 1.2、修改主机名及hosts映射 1.2.1、在192.168.159.130中配置 1.2.2、 编辑配置hosts文件 1.2.3、重启…

LangChain 80 LangGraph 从入门到精通二

LangChain系列文章 LangChain 60 深入理解LangChain 表达式语言23 multiple chains链透传参数 LangChain Expression Language (LCEL)LangChain 61 深入理解LangChain 表达式语言24 multiple chains链透传参数 LangChain Expression Language (LCEL)LangChain 62 深入理解Lang…

深度神经网络加载 Caffe 框架模型

介绍 在本教程中&#xff0c;您将学习如何使用来自 Caffe 模型库的 GoogLeNet 训练网络opencv_dnn模块进行图像分类。 我们将在下图中演示此示例的结果。 暴风雪号航天飞机 源代码 我们将使用示例应用程序中的片段&#xff0c;可以在此处下载。 ​ #include < fstream>…

双目模组 - IMSEE SDK的配置实践:含Opencv的详细编译配置

IMSEE 的环境要求: CMake(3.0以上)(需要支持vs2019) Visual Studio 2019 opencv3.3.1 IMSEE-SDK 官网参考: Windows 源码安装 — IMSEE SDK 1.4.2 文档 (imsee-sdk-docs.readthedocs.io) 【案】按照IMSEE的建议进行安装: 1 Windows 安装: 1.1 环境准备: 1.1.1 CMake:in…

编程笔记 html5cssjs 070 JavaScript Null数据类型

编程笔记 html5&css&js 070 JavaScript Null数据类型 一、Null数据类型二、 类型运算小结 在JavaScript中&#xff0c;Null 是一种基本数据类型&#xff0c;它是JavaScript七种原始数据类型&#xff08;包括&#xff1a;Boolean、Number、String、Null、Undefined、Sym…

(策略游戏)

[CSP-S 2022] 策略游戏 题目描述 小 L 和小 Q 在玩一个策略游戏。 有一个长度为 n n n 的数组 A A A 和一个长度为 m m m 的数组 B B B&#xff0c;在此基础上定义一个大小为 n m n \times m nm 的矩阵 C C C&#xff0c;满足 C i j A i B j C_{i j} A_i \times …

多维时序 | Matlab实现CNN-RVM卷积神经网络结合相关向量机多变量时间序列预测

多维时序 | Matlab实现CNN-RVM卷积神经网络结合相关向量机多变量时间序列预测 目录 多维时序 | Matlab实现CNN-RVM卷积神经网络结合相关向量机多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现CNN-RVM卷积神经网络结合相关向量机多变量时间序…

springboot整合Sa-Token实现登录认证和权限校验(万字长文)

目前在国内的后端开发中&#xff0c;常用的安全框架有spring security、shiro。现在&#xff0c;介绍一款由国人开发的安全框架Sa-Token。这个框架完全由国人开发&#xff0c;所提供的Api文档和一些设置都是比较符合国人的开发习惯的&#xff0c;本次就来介绍一下如何在spring …

Multisim14.0仿真(四十五)AC220V转DC12V稳压电源设计

一、仿真原理图&#xff1a; 二、运行效果&#xff1a;

【Vue】组件间通信的7种方法(全)

目录 组件之前的通信方法 1. props/$emit 2.parent/children 3.ref 4.v-model 5.sync 6.attrs,attrs,attrs,listeners 7.provide/inject 7.eventBus 组件之前的通信方法 1. props/$emit 父传子 props 这个只能够接收父组件传来的数据 不能进行修改 可以静态传递 也可…

机器学习系列——(九)决策树

简介 决策树作为机器学习的一种经典算法&#xff0c;在数据挖掘、分类和回归等任务中广泛应用。本文将详细介绍机器学习中的决策树算法&#xff0c;包括其原理、构建过程和应用场景。 原理 决策树是一种基于树状结构的监督学习算法&#xff0c;它通过构建一棵树来对数据进行分…