【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

下载网页不难,提取数据其实也不难。前面,我们说到了如何在当当网页中提取title。当然了,不仅仅是当当网页可以提取title,几乎所有的网页都可以提取标题。因为当当是一家电商网站,所以基本上其标题信息和它卖的商品是分不开的。但是,现在我们已经不满足于此了,我们还想从网页中提取价格信息,那应该怎么做呢?

要从网页中提取价格信息,关键是要寻找规律,怎么样又好又快地将价格信息找出来。我们可以随便找一个当当的网页,查看一下它的源代码信息,就会发现这样的数据,大家可以看一下,

<p>当 当 价:<b id="d_price" class="d_price "><span class="yen">&yen;</span>171.00</b><span class="break"></span></p>

几乎所有当当网页商品中都会保留这样格式的信息,但是数字当然不一样了。我们可以想到一个比较简单的提取方法,就是分成下面两个步骤:(1)寻找“当 当 价”的起始位置;(2)寻找到起始位置后,查找第一个数字信息,就可以发现171.00这些数据了,也就是我们需要的定价数据信息。

#include <stdio.h>
#include <windows.h>
#include <wininet.h>
#include <assert.h>#ifdef ERROR
#undef ERROR
#endif#define U8 unsigned char
#define U32 unsigned int
#define STATUS unsigned int#define OK 0
#define ERROR (~0L)
#define MAX_BLOCK_SIZE 1024
#define HTTP_NAME_ADDRESS "http://product.dangdang.com/main/product.aspx?product_id=22560249&ref=book-11712-3032_1-63349-0"
#pragma comment(lib, "wininet.lib")/* show file content */
static void show_file_content(char* buffer, int size)
{while(size --){printf("%c", *buffer++);}
}/* find pattern content */
static STATUS find_pattern_content(char* buffer, char* start, char* end,  char** pp_buffer, int* size)
{char* prev;char* next;if(NULL == buffer){return ERROR;}if(NULL == start || NULL == end){return ERROR;}if(NULL == pp_buffer || 0 == size){return ERROR;}next = strstr(buffer, start);if(NULL == next){return ERROR;}prev = next;next += strlen(start);next = strstr(next, end);if(NULL == next){return ERROR;}*pp_buffer = prev + strlen(start);*size = next - (prev + strlen(start));return OK;
}/* get length of html file */
static int get_file_size(const char* path)
{HANDLE hFile;int size = 0;hFile = CreateFile(path, FILE_READ_EA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);if (hFile != INVALID_HANDLE_VALUE){size = GetFileSize(hFile, NULL);CloseHandle(hFile);}return size;
}/* get all data from html file */
static STATUS get_file_content(const char* path, void** pp_buffer, int* size)
{int length;char* buffer;HANDLE hFile;if(NULL == path){return ERROR;}if(NULL == pp_buffer){return ERROR;}if(NULL == size){return ERROR;}length = get_file_size(path);if(0 == length){return ERROR;}buffer = (char*) malloc(length +1);if(NULL == buffer){return ERROR;}buffer[length] = '\0';hFile = fopen(path, "r+b");if(NULL == hFile){free(buffer);return ERROR;}fread(buffer, 1, length, hFile);fclose(hFile);*pp_buffer = buffer;*size = length;return OK;
}/* implement page download */
static STATUS download_web_page(const char* url, const char* path)
{U8 buffer[MAX_BLOCK_SIZE];U32 iNumber;FILE* hFile;HINTERNET hSession;HINTERNET hUrl;STATUS result;hSession = InternetOpen("RookIE/1.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);if(NULL == hSession){return ERROR;}hUrl = InternetOpenUrl(hSession, url, NULL, 0, INTERNET_FLAG_DONT_CACHE, 0);if(NULL == hUrl){result = ERROR;goto error1;}hFile = fopen(path, "wb");if(NULL == hFile){result = ERROR;goto error2;}iNumber = 1;while(iNumber > 0){InternetReadFile(hUrl, buffer, MAX_BLOCK_SIZE -1, &iNumber);fwrite(buffer, sizeof(char), iNumber, hFile);}fclose(hFile);result = OK;error2:InternetCloseHandle(hUrl);error1:InternetCloseHandle(hSession);return result;
}static STATUS is_char_digital(char value)
{if(value >= '0' && value <= '9'){return OK;}return ERROR;
}/* get product price */
static STATUS find_product_price(char* buffer,  char* str, int len)
{char* prev;char* next;if(NULL == buffer){return ERROR;}if(NULL == str || 0 == len){return ERROR;}memset(str, 0, len);next = strstr(buffer, "当 当 价:");if(NULL == next){return ERROR;}next += strlen("当 当 价:");while(ERROR == is_char_digital(*next)){next ++;}prev = next;while('<' != *next){next ++;}memmove(str, prev, next - prev);return OK;
}/* entry of programme */
int main(int argc, char* argv[])
{   char* buffer;char* begin;int length;int size;char price[16];/* 0.html is just the start page */download_web_page(HTTP_NAME_ADDRESS, "E:/0.html");if(OK == get_file_content("E:/0.html", &buffer, &size)){memset(price, 0, 16);if(OK == find_pattern_content(buffer, "<title>", "</title>", &begin, &length))  {  printf("商品:");show_file_content(begin, length);printf("\n");} if(OK == find_product_price(buffer, price, 16)){printf("当当价:%s\n", price);}free(buffer);}return 1;
}

搜索引擎的那些事(摘取价格数据)相关推荐

  1. 搜索引擎的那些事(中文分词)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面,我们在介绍搜索引擎的时候也谈到过中文分词.和英文不一样,中文上所有的汉字都是连在一起的, ...

  2. 搜索引擎的那些事(web遍历)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 写搜索引擎对我来说是一件有趣的事情,做的多好谈不上,但是至少可以一步一步做出来.当然做的怎么样 ...

  3. 搜索引擎的那些事(网页下载)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面我们只是开了一个搜索引擎的头,下面我们就要对搜索引擎的各个内容进行分析和解剖了.当然,我们 ...

  4. 搜索引擎的那些事(开篇)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 说起搜索引擎,大家肯定都不陌生.至少对于我来说,每日百度的次数不下几十次.在信息的查询和搜索方 ...

  5. 搜索引擎的那些事(32位MD5算法)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 对于学过密码学的同学来说,md5算法肯定不会很陌生.但是,对于我来说,md5是一个新的命题.那 ...

  6. 搜索引擎的那些事(多线程web遍历)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 上面一篇博客当中,我们可以利用单一的线程完成网页的下载.今天,我们打算在此基础上完成多线程的访 ...

  7. 看似简单的搜索引擎,原来背后的数据结构和算法这么复杂?

    来源 | 码海 封图 | CSDN 付费下载于视觉中国 前言 我们每天都在用 Google, 百度这些搜索引擎,那大家有没想过搜索引擎是如何实现的呢,看似简单的搜索其实技术细节非常复杂,说搜索引擎是 ...

  8. 搜索引擎的目标是什么?

    搜索引擎的目标是什么?看似简单的问题,很多人不一定能答对.要深入理解SEO,需要深入理解搜索引擎本身的目标是什么. 1.搜索引擎的目标是满足用户搜索用户 用搜索引擎自己的话来说,百度的使命是" ...

  9. 搜索引擎是如何工作的?

    作者 | 码海 责编 | 屠敏 前言 我们每天都在用 Google, 百度这些搜索引擎,那大家有没想过搜索引擎是如何实现的呢,看似简单的搜索其实技术细节非常复杂,说搜索引擎是 IT 皇冠上的明珠也不为 ...

最新文章

  1. PyTorch的torch.cat
  2. 匹配月份_5月份轿车销量榜单出炉 雅阁热销18634辆
  3. hibernate教程--常用配置和核心API
  4. 称重管理系统如何修改重量_微嵌智能称重方案实现自动零件计数秤
  5. 《数据科学家访谈录》读书笔记
  6. 投资学习网课笔记(part5)--基金第五课
  7. 取值方法_「EV3进阶课」制作小游戏:数据取值体系要统一(三)
  8. 计算机科学与技术在广西录取分数线,中国计量大学2016年在广西录取分数线(分专业)...
  9. mysql 窗口函数_MySQL数分:窗口函数
  10. MVC判断用是否登录了平台
  11. opengl java_android graphic(20)—java层OpenGL相关类
  12. 冰冰讲数学鸿蒙团队4年级,冰冰也曾是水肿星人?3分钟急救方案教你甩掉晨间浮肿脸!...
  13. 双赛道20支战队解题思路大公开,线上Poster Session等你来
  14. java关闭通道_调用map方法后,Java 7文件通道未正确关闭
  15. 正则表达式匹配EXCEL地址字符串
  16. 原子结构示意图全部_原子结构示意图和元素及元素周期表
  17. 云打印SDK来袭,支持飞鹅云,芯烨云,易联云,优声云等云打印机
  18. linux scl,scl命令
  19. Python ---------列表 集合 字典 深浅拷贝
  20. unity2019安装完后打不开直接闪退_VS2017 VS2019 无法进入安装界面闪退问题(windows7SP1)...

热门文章

  1. Problem C: 默认参数:求圆面积
  2. 干货:解码OneData,阿里的数仓之路。
  3. 开启事务处理插入多条数据 速度也可以
  4. linux下使用wget下载jdk
  5. FileReader详解与实例---读取并显示图像文件 | JS Mix
  6. 用户名错误则一直登录
  7. 把Python项目打包成exe文件
  8. [BZOJ]1071 组队(SCOI2007)
  9. CSS3 box-shadow实现纸张的曲线投影效果
  10. C++基础算法学习——熄灯问题