使用Boost Asio获取网页 [英] Using boost asio to get web page

查看:39
本文介绍了使用Boost Asio获取网页的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试构建一个程序,该程序将使用股票行情自动收录器,对它进行谷歌搜索,然后输出数据(当前价格,最高价,最低价,涨跌幅等).我正在尝试使用boost asio,它没有从服务器返回任何数据.

I'm trying to build a program that would take in a stock ticker, run a google search for it, and output data (current price, high, low, percent change, etc.). I am trying to use boost asio and it is not returning any data from the server.

#include "stdafx.h"
#include <iostream>
#include <istream>
#include <ostream>
#include <string>
#include <boost/asio.hpp>

std::string getStockPage(std::string ticker) {
    boost::asio::ip::tcp::iostream stream;

    stream.connect("www.google.com", "http");
    std::cout << "connected\n";
    stream << "GET /search?q=" << ticker << " HTTP/1.1\r\n";
    stream << "Host: www.google.com\r\n";
    stream << "Cache-Control: no-cache\r\n";
    //stream << "Content-Type: application/x-www-form-urlencoded\r\n\r\n";
    stream << "Connection: close\r\n\r\n";
    std::cout << "sent\n";

    std::ostringstream os;
    //os << stream.rdbuf();
    char buffer[100];
    os << stream.readsome(buffer, 100);
    return std::string(buffer, 100);
}

int main() {
    std::cout << getStockPage("$tsla");
    std::cout << "done\n";
    std::string temp;
    std::getline(std::cin, temp);
    return 0;


}

我尝试仅读取前100个字符,以查看输出响应时是否遇到问题,但仅输出空字符.我希望它输出整个Google页面"www.google.com/search?q=$tsla"

I tried to read just the first 100 characters to see if it was having issues outputting the response, but it only outputs null characters. I want it to output the entirety of the google page "www.google.com/search?q=$tsla"

任何帮助将不胜感激!

推荐答案

std :: istream :: readsome 只允许始终返回0个字节.然后,好像您收到了NUL字节一样,因为您确实收到了

std::istream::readsome is allowed to just always return 0 bytes. Then, it appears as if you received NUL bytes, because you did

return std::string(buffer, 100);

代替

return std::string(buffer, stream.gcount());


真的,只需使用其他方法


Really, just use the other approach

std::ostringstream os;
os << stream.rdbuf();
return os.str();

这在测试时对我有用.请注意,您可以添加刷新:

This works for me when testing. Note you could add a flush:

stream << "Connection: close\r\n\r\n" << std::flush;

生成的程序

#include <boost/asio.hpp>
#include <iostream>
#include <string>

std::string getStockPage(std::string const& ticker) {
    boost::asio::ip::tcp::iostream stream;

    stream.connect("www.google.com", "http");
    stream    << "GET /search?q=" << ticker << " HTTP/1.1\r\n";
    stream    << "Host: www.google.com\r\n";
    stream    << "Cache-Control: no-cache\r\n";
    // stream << "Content-Type: application/x-www-form-urlencoded\r\n\r\n";
    stream    << "Connection: close\r\n\r\n" << std::flush;

    std::ostringstream os;
    os << stream.rdbuf();
    return os.str();
}

int main() {
    std::cout << getStockPage("$tsla");
}

正在打印

HTTP/1.1 302 Found
Location: http://www.google.nl/search?q=%24tsla&gws_rd=cr&dcr=0&ei=3EMqWrKxCILUwAKv9LqICg
Cache-Control: private
Content-Type: text/html; charset=UTF-8
P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
Date: Fri, 08 Dec 2017 07:48:44 GMT
Server: gws
Content-Length: 288
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Set-Cookie: NID=118=MsVZZpoZFEz4mQDqDuuWFRViB8v8yEQju7FPdOw8Rr7ViQ1cJtF6ZeN9u-dSRhGMT4x8F8yDilk9FqsoTkO8IsoQX-YvHXRcCoHcOLk0p4VOTn8AZoldKeh84Ryl0bM0; expires=Sat, 09-Jun-2018 07:48:44 GMT; path=/; domain=.google.com; HttpOnly
Connection: close

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.nl/search?q=%24tsla&amp;gws_rd=cr&amp;dcr=0&amp;ei=3EMqWrKxCILUwAKv9LqICg">here</A>.
</BODY></HTML>

这篇关于使用Boost Asio获取网页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆