想要爬取第一条网页的数据但是失败了?如何解决??

news2024/11/15 8:25:42

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

问题描述

  想要爬取第一条网页的数据但是失败了

CURL *curl = curl_easy_init();
    if (curl) {
        std::string lurl;
        lurl = "https://www.nasdaq.com/market-activity/stocks/amzn/historical";
        curl_easy_setopt(curl, CURLOPT_URL, lurl.c_str());
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
        std::string html_data;
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &html_data);
        CURLcode res = curl_easy_perform(curl);
        if (res == CURLE_OK) {        
            std::cout << html_data.substr(0, 50) << std::endl;
        }
        else {
            std::cerr << "Failed to download HTML: " << curl_easy_strerror(res) << std::endl;
        }
        std::cout << std::endl << std::endl;
        lurl = "https://finance.sina.com.cn/";
        curl_easy_setopt(curl, CURLOPT_URL, lurl.c_str());
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);    
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &html_data);
        res = curl_easy_perform(curl);
        if (res == CURLE_OK) {
 
            std::cout << html_data.substr(0, 50) << std::endl;
        }
        else {
            std::cerr << "Failed to download HTML: " << curl_easy_strerror(res) << std::endl;
        }
 
        curl_easy_cleanup(curl);
 
    }

如上问题有来自我自身项目开发,有的收集网站,有的来自读者,如有侵权,立马删除。

解决方案

  如下是上述问题的解决方案,仅供参考:

  在您提供的 C++ 代码中,使用 libcurl 库进行网页数据的爬取。如果爬取失败,可能有几个原因:

  1. 网络问题:网络连接问题或 DNS 解析失败可能导致请求失败。

  2. URL 错误:确保 URL 正确无误,没有拼写错误。

  3. CURLOPT_WRITEFUNCTION 未定义:代码中使用了 CURLOPT_WRITEFUNCTION 但是没有提供对应的回调函数 write_callback 的定义。

  4. CURLOPT_WRITEDATA 问题:将 std::string 的地址传递给 CURLOPT_WRITEDATA 可能不会工作,因为 std::string 的内存管理方式与 C 风格的字符串不同。您应该使用字符数组或 std::vector<char>

  5. HTTP 头部信息:有些网站可能需要特定的 HTTP 头部信息,比如 User-Agent,才能正确响应请求。

  6. 网站反爬虫机制:目标网站可能有反爬虫机制,导致请求被拒绝。

  7. CURL 配置问题:可能还有其他的 CURL 配置问题,比如超时设置(CURLOPT_TIMEOUT)。

  8. libcurl 版本或编译问题:确保您使用的 libcurl 库是最新的,并且正确编译到您的项目中。

针对上述可能的问题,您可以尝试以下调整:

  • 确保 write_callback 函数被正确定义,并且能够处理数据写入。
  • 使用 std::vector<char> 代替 std::string 作为 CURLOPT_WRITEDATA 的参数。
  • 添加错误处理,检查 CURL 错误码并适当处理。
  • 设置合理的超时时间。
  • 添加必要的 HTTP 头部信息,如 User-Agent。
  • 如果可能,添加代理设置以绕过反爬虫机制。

下面是一个修正后的示例代码:

#include <iostream>
#include <string>
#include <vector>
#include <curl/curl.h>

size_t write_callback(void *contents, size_t size, size_t nmemb, void *userp) {
    ((std::vector<char>*)userp)->insert(((std::vector<char>*)userp)->end(), (char*)contents, (char*)contents + size * nmemb);
    return size * nmemb;
}

int main() {
    CURL *curl = curl_easy_init();
    if (curl) {
        std::vector<char> html_data;
        curl_easy_setopt(curl, CURLOPT_URL, "https://www.nasdaq.com/market-activity/stocks/amzn/historical");
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &html_data);
        
        CURLcode res = curl_easy_perform(curl);
        if (res != CURLE_OK) {
            std::cerr << "Failed to download HTML: " << curl_easy_strerror(res) << std::endl;
        }
        else {
            std::cout << &html_data[0] << std::endl; // 注意:这里只是示例,实际使用时需要处理内存
        }

        curl_easy_cleanup(curl);
    }
    return 0;
}

  请注意,这个示例代码仅用于演示目的,实际使用时需要添加更多的错误处理和内存管理。

  希望如上措施及解决方案能够帮到有需要的你。

  PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。

  若有对当前Bug有与如下提供的方法不一致,有个不情之请,希望你能把你的新思路或新方法分享到评论区,一起学习,目的就是帮助更多所需要的同学,正所谓「赠人玫瑰,手留余香」。

☀️写在最后

  ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏《CSDN问答解惑-专业版》,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。

码字不易,如果这篇文章对你有所帮助,帮忙给 bug菌 来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。

同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!

📣关于我

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。


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

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

相关文章

使用Python的Turtle模块绘制玫瑰

在本文中&#xff0c;我们将通过使用Python中的turtle模块来绘制一个精美的花朵图案&#xff0c;包括花蕊、花瓣和叶子。turtle模块是Python标准库的一部分&#xff0c;用于创建图形和动画&#xff0c;非常适合初学者学习编程基础和图形绘制。 初始设置 import turtle# 设置初…

简介Docker以及K8s

什么是Docker Docker 属于 Linux 容器的一种封装&#xff0c;提供简单易用的容器使用接口以及操作系统级别的虚拟化。 更为直白的叙述就是&#xff0c;Docker可以将程序和环境&#xff08;依赖库配置操作系统&#xff09;打包并运行的工具软件。 基础镜像 总所周知&#xf…

搜维尔科技:《Patchwork 3D 2024》现已推出,改善用户体验的同时添加了最受欢迎的功能

《Patchwork 3D 2024》现已推出!发现我们在改善用户体验的同时添加的最受欢迎的功能。 令人兴奋的消息值得分享&#xff01;Patchwork 3D 已经升级&#xff0c;并带来一些令人惊叹的新功能。 材料 镜面材质现在支持漫反射、镜面反射和凹凸特性&#xff0c;可实现精细调整的光…

防火墙安全策略练习

目录 实验拓扑 实验要求 实验思路 实验步骤 1.配置交换机&#xff0c;划分接口的vlan&#xff0c;配置ISP 2.配置防火墙 3.接下来在WEB界面进行所有安全策略操作 配置接口 创建安全区域&#xff1a; 创建地址&#xff1a; 时间段&#xff1a; 安全策略部分&#xff…

Java 常用的参数校验,简化参数校验,赶紧学起来!!

Java 常用的参数校验&#xff0c;简化参数校验&#xff0c;赶紧学起来&#xff01;&#xff01;Java中的参数校验注解主要用于简化数据验证的过程&#xff0c;它们允许开发者以声明式的方式指定参数的验证规则&#xff0c;而无需在业https://mp.weixin.qq.com/s?__bizMzkzMTY0…

LLM-向量数据库中的索引算法总结

文章目录 前言向量数据库介绍索引方法倒排索引KNN 搜索近似 KNN 搜索Product Quantization(PQ)NSW 算法搜索HNSW 前言 向量数据库是当今大模型知识库检索落地实践的核心组件&#xff0c;下图是构建知识库检索的架构图&#xff1a; 首先会将相关文档数据向量化嵌入到向量化数据…

视图库对接系列(GA-T 1400)十六、视图库对接系列(本级)通知(订阅回调)

说明 之前我们实现了订阅接口,其中有一个receiveAddr参数, 这个就是对应的回调的地址。一般情况下对应的是同一个服务。 我们推荐使用http://xxx:xxx/VIID/SubscribeNotifications接口文档 SubscribeNotificationList对象对象如下: 文档中是xml,但实际上目前使用的都是jso…

在 PostgreSQL 里如何处理数据的归档和清理策略的优化?

文章目录 在 PostgreSQL 中处理数据归档和清理策略的优化一、理解数据归档和清理的重要性二、确定归档和清理的标准三、PostgreSQL 中的数据归档方法&#xff08;一&#xff09;使用分区表&#xff08;二&#xff09;导出数据 四、PostgreSQL 中的数据清理方法&#xff08;一&a…

操作系统——内存管理(面试准备)

虚拟内存 单片机没有操作系统&#xff0c;每次写完代码&#xff0c;都需要借助工具把程序烧录进去&#xff0c;这样程序才能跑起来。 另外&#xff0c;单片机的CPU是直接操作内存的物理地址。 在这种情况下&#xff0c;想在内存中同时运行两个程序是不可能的&#xff0c;如果第…

JavaFx+MySql学生管理系统

前言: 上个月学习了javafx和mysql数据库,于是写了一个学生管理系统,因为上个月在复习并且有一些事情,比较忙,所以没有更新博客了,这个项目页面虽然看着有点简陋了,但是大致内容还是比较简单的,于是现在跟大家分享一下我的学生管理系统,希望对这方面有兴趣的同学提供一些帮助 &a…

浪潮服务器内存物理插槽位置

浪潮服务器内存物理插槽位置 如下图所示

在iPhone / iPad上轻松模拟GPS位置 AnyGo for Mac

在iPhone / iPad上轻松模拟GPS位置 AnyGo for Mac AnyGo for Mac是一款专为Mac电脑用户设计的虚拟定位工具。它可以模拟你的GPS位置&#xff0c;让你的设备显示你在任何世界上的任何地方。无论你是想在游戏中虚拟移动&#xff0c;还是在社交媒体上分享虚拟的旅行照片&#xff0…

基于SpringBoot+MySQL的租房项目+文档

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

05 以物品与用户为基础个性化推荐算法的四大策略

《易经》&#xff1a;“九二&#xff1a;见龙在田&#xff0c;利见大人”。九二是指阳爻在卦中处于第二位&#xff0c;见龙指龙出现在地面上&#xff0c;开始崭露头角&#xff0c;但是仍须努力&#xff0c;应处于安于偏下的位置。 本节是模块二第一节&#xff0c;模块二讲解传…

从业务架构到应用架构技术剖析

从业务架构到应用架构 4A架构理论&#xff0c;一个企业级架构框架&#xff0c;将企业架构&#xff08;EA&#xff09;划分为四大核心领域&#xff0c;每个领域都聚焦于组织的不同维度。该理论提供了一种结构化的设计和理解企业运作方式的方法&#xff0c;确保技术解决方案能…

前端面试题53(在vue中history与hash区别)

在Vue.js应用中&#xff0c;路由&#xff08;routing&#xff09;是管理应用程序中不同页面&#xff08;视图&#xff09;的重要部分。Vue Router提供了两种路由模式来管理URL&#xff1a;hash模式和history模式。下面详细介绍这两种模式的区别&#xff1a; 1. Hash 模式 原理…

如何在idea安装git,使用gitee?

一、什么是git&#xff0c;git与gitee、GitHub的关系&#xff1f; 1.什么是git&#xff1f; Git 是一个开源的分布式版本控制系统&#xff0c;用于企业项目中程序员协同开发。 2.git与gitee、GitHub的关系是什么&#xff1f; git &#xff1a;Git是一种版本控制系统&#x…

Linux:NFS共享存储

目录 一、NFS基本概述 二、NFS共享文件实验 2.1、安装nfs和rpcbind软件 2.2、修改配置文件设置共享 2.3、创建共享目录 ​编辑 2.4、开启服务 2.5、客户端验证共享目录可访问 三、tcpdump命令 3.1、概述 3.2、简单表达 3.3、过滤规则 ​编辑 3.4、tcpdump常见参数…

Redis分布式锁在高并发环境下的超卖问题

先看这样一段代码&#xff0c;购买商品&#xff0c;扣减库存的逻辑代码 当用户下单&#xff0c;并且调用扣减库存的接口时&#xff0c;先判断商品库存是否还有&#xff0c;因为是秒杀场景下&#xff0c;太多请求都打到数据库&#xff0c;可能会导致数据库崩溃&#xff0c;所以…

[leetcode] largest-divisible-subset 最大整除子集

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> largestDivisibleSubset(vector<int>& nums) {int len nums.size();sort(nums.begin(), nums.end());// 第 1 步&#xff1a;动态规划找出最大子集的个数、最大子集中的最大整…