前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >中国黑客六道:网络基础学习篇-获取天气信息

中国黑客六道:网络基础学习篇-获取天气信息

作者头像
企鹅号小编
发布2018-01-08 17:37:50
7600
发布2018-01-08 17:37:50
举报
文章被收录于专栏:网络网络

无论是获取网络上的天气信息或者其它的信息,首先要做的,就是访问对方的服务器,向服务器发送请求,然后接收数据。

这里也是一样的,也是向服务器发送一个GET请求,然后接收数据,接着请求数据。

处理之前,得先来看看我们需要 的数据是什么。如下图

中国黑客六道

用红色圆圈画的部分,就是网页上显示的东西,而下面用方框 的画的部分,就是相应的HTML代码

我们要做的,就是从服务器上接收到这些源码,然后进行处理。

其中,有一些函数,如:socket(),connect(),send(),recv()之类,这些都已经在 "一起愉快的开黑吧"小系列中讲过了,就不重复。

话说,手动处理这些东西是很麻烦的,如果有时间的小伙伴可以自己封装一个类就行,使用其它网络上有的库来处理也行。

这里是为了让小伙伴们了解整个过程 ,所以手动处理了。

其它,下面还有6个

...

,这里包含的就是后面六天的天气情况,并没有处理,只处理了当天的,但方法是一样的

有兴趣的小伙伴可以 自己去试试 ,毕竟大神之路是需要自己走的,哈哈。

希望小伙伴们能举一反三,让我的这块砖头引出古玉……

一个黑客创业者

代码如下:

环境:VS2013 + Win7

一个黑客创业者

一个黑客创业者

一个黑客创业者

完整代码获取:

一个黑客创业者

gongzhonghao

代码:

#define _WINSOCK_DEPRECATED_NO_WARNINGS

#define _CRT_SECURE_NO_WARNINGS

#include

#include

#include

#include

#pragma comment(lib, "ws2_32")

using namespace std;

/* 用于取得错误信息 */

DWORD g_dwErr;

/* 保存数组的大小 */

const int MAX_SIZE = 40960;

/*

此结构体用于保存天气信息

*/

typedef struct stWeatherInfo

{

string date; //日期

string wea; //天气

string tem; //温度

string win; //风力

}WeatherInfo, *pWeatherInfo;

/* 用于处理THML中的数据,把相应信息放入结构体中 */

void GetWeather(const string& s);

int main()

{

/* 初始化 */

WSADATA wsdata;

WSAStartup(MAKEWORD(2, 2), &wsdata);

const char* hostname = "www.weather.com.cn";

struct hostent* host = gethostbyname(hostname);

/* 初始化一个连接服务器的结构体 */

sockaddr_in serveraddr;

serveraddr.sin_family = AF_INET;

serveraddr.sin_port = htons(80);

/* 此处也可以不用这么做,不需要用gethostbyname,把网址ping一下,得出IP也是可以的 */

serveraddr.sin_addr.S_un.S_addr = *((int*)*host->h_addr_list);

int sock = socket(AF_INET, SOCK_STREAM, 0);

if (sock == -1) {

cout

return -1;

}

cout

if (connect(sock, (struct sockaddr*)&serveraddr, sizeof(sockaddr_in)) == -1) {

g_dwErr = GetLastError();

cout

closesocket(sock);

return -1;

}

cout

/* GET请求 */

const char* bufSned = "GET http://www.weather.com.cn/weather/101280601.shtml\r\n";

/* 发送GET请求 */

if (send(sock, bufSned, strlen(bufSned), 0) > 0) {

cout

} else {

g_dwErr = GetLastError();

cout

closesocket(sock);

return -1;

}

/* 文件,用于把HTML源码保存起来,没什么用处,只是为了自己看一下源码而已 */

FILE *fp;

fp = fopen("E:/get.txt","w");

char BufRecv[MAX_SIZE] = {};

int nLen = 0;

string HtmlData;

/* 开始接收数据 */

while ((nLen = recv(sock, BufRecv, MAX_SIZE, 0)) > 0) {

/* 写文件 */

fwrite(BufRecv, 1, nLen, fp);

/* 把数组拼接成string类型,方便下面的处理 */

HtmlData += BufRecv;

}

/* 开始分析HTML */

string Area0 = "

";

string Area1 = "

";

string Area2 = "

";

string::size_type PosBegin0;

string::size_type PosBegin;

string::size_type PosEnd;

string s;

PosBegin0 = HtmlData.find(Area0);

if (PosBegin0 > 0) {

PosBegin = HtmlData.find(Area1, PosBegin0);

PosEnd = HtmlData.find(Area2, PosBegin);

s = HtmlData.substr(PosBegin, PosEnd - PosBegin + 5);

//cout

}

/* 结束HTML分析 */

/* 处理存储有天气部分的HTML代码 */

GetWeather(s);

fclose(fp);

cin.get();

closesocket(sock);

return 0;

}

void GetWeather(const string& s)

{

WeatherInfo weatherinfo;

string::size_type DataPosBegin = s.find("");

string::size_type DataPosEnd = s.find("");

weatherinfo.date = s.substr(DataPosBegin + 4, DataPosEnd - DataPosBegin - 4);

string::size_type WeaPosEnd = s.find("

");

string::size_type WeaPosBegin = s.rfind(">", WeaPosEnd);

weatherinfo.wea = s.substr(WeaPosBegin + 1, WeaPosEnd - WeaPosBegin - 1);

string::size_type TemPosBegin1 = s.find("");

string::size_type TemPosEnd1 = s.find("");

string tem1 = s.substr(TemPosBegin1 + 6, TemPosEnd1 - TemPosBegin1 - 6);

string::size_type TemPosBegin2 = s.find("");

string::size_type TemPosEnd2 = s.find("", TemPosBegin2);

string tem2 = s.substr(TemPosBegin2 + 3, TemPosEnd2 - TemPosBegin2 - 3);

weatherinfo.tem = tem1 + "/" + tem2;

string::size_type WinPosBegin = s.find("");

WinPosBegin = s.find("", WinPosBegin);

string::size_type WinPosEnd = s.find("", WinPosBegin);

weatherinfo.win = s.substr(WinPosBegin + 3, WinPosEnd - WinPosBegin - 3);

/*

cout

cout

cout

cout

*/

/* 把获取的天气信息写入到文件中 */

FILE *fp;

fp = fopen("E:/weather.txt","w");

fwrite(weatherinfo.date.c_str(), 1, weatherinfo.date.length(), fp);

fwrite(weatherinfo.wea.c_str(), 1, weatherinfo.wea.length(), fp);

fwrite(weatherinfo.tem.c_str(), 1, weatherinfo.tem.length(), fp);

fwrite(weatherinfo.win.c_str(), 1, weatherinfo.win.length(), fp);

fclose(fp);

}

本文来自企鹅号 - 一个黑客创业者媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文来自企鹅号 - 一个黑客创业者媒体

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档