zoukankan      html  css  js  c++  java
  • C++ 提取网页内容系列之五 整合爬取豆瓣读书

    工作太忙 没有时间细化了 就说说 主要内容吧

    下载和分析漫画是分开的 

    下载豆瓣漫画页面是使用之前的文章的代码

    见http://www.cnblogs.com/itdef/p/4171179.html

    http://www.cnblogs.com/itdef/p/4081963.html

    注意 豆瓣网是https 

    下载后进行页面分析

    fstream fs(szfileName);
    stringstream ss; // 创建字符串流对象
    ss << fs.rdbuf(); // 把文件流中的字符输入到字符串流中
    fs.close();
    string str = ss.str(); // 获取流中的字符串

    页面不大 载入到string中 如果是UTF8 还需要进行GBK到UTF8的转换

    然后使用正则 摘出每个漫画索引信息 存入vector<string>

    string strRegex = "<li class=\"subject-item\">.*?</li>";

    vector<string> vstr;
    regex regExpress(strRegex);
    smatch ms;
    try {
    while (regex_search(strText, ms, regExpress))
    {
    for (string::size_type i = 0; i < ms.size(); ++i)
    {
    vstr.push_back(ms.str(i));
    }
    strText = ms.suffix().str();
    }
    }
    catch (exception& e)
    {
    cerr << e.what() << endl;
    return vstr;
    }

    然后在对每本书的信息进行分析 解析出 书本名 简介 评分等

    由于这些信息都是有固定标签 用正则反而麻烦 所以使用的字符串查找

    basic_string <char>::size_type keyWordStart = s.find("title=\"");
    basic_string <char>::size_type keyWordEnd = s.find("\"", keyWordStart + sizeof("title=\"")-1);

    if ((keyWordStart != string::npos) && (keyWordEnd != string::npos) && (keyWordEnd > keyWordStart))
    {
    string strKeyWord = s.substr(keyWordStart+ sizeof("title=\"") - 1, keyWordEnd - keyWordStart- sizeof("title=\"")+1);
    cout << strKeyWord << endl;
    }

    最后结果如图

  • 相关阅读:
    经典背景音乐集(转)
    商业模式的思考
    PHP5.4的变化关注What has changed in PHP 5.4.x
    yii模版中的写法
    设计模式(一)工厂模式Factory(创建型)
    yii模版中的判断方法
    Yacc 与 Lex 快速入门(词法分析和语法分析)
    Windows PHP 中 VC6 X86 和 VC9 X86 的区别及 Non Thread Safe 的意思
    金融系列1《借贷记卡介绍》
    设计模式概论
  • 原文地址:https://www.cnblogs.com/itdef/p/5951477.html
Copyright © 2011-2022 走看看