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;
    }

    最后结果如图

  • 相关阅读:
    Oracle 内存参数调优设置
    查询Oracle正在执行的sql语句及执行该语句的用户
    oracle审计详解
    Oracle数据库的性能调整
    性能监控工具的配置及使用
    windows端5款mysql客户端工具
    Oracle 11g密码过期问题及解决方案
    PLSQL安装、PLSQL汉化、激活
    Mercurial 安装及使用
    Servlet基础(二) Servlet的生命周期
  • 原文地址:https://www.cnblogs.com/itdef/p/5951477.html
Copyright © 2011-2022 走看看