精华内容
下载资源
问答
  • 实现一个小功能:通过点击页面上不同的页数,去数据库查询不同的信息,更新到页面上。 版本二: 在查询的结果集合上继续查询;查询结果数据分页后的分页 就像图上这样点击不同的页数,去数据库查询出不同的信息处...

    本篇博客知识点~
    版本一:
    实现一个小功能:通过点击页面上不同的页数,去数据库查询不同的信息,更新到页面上。
    版本二:
    在查询的结果集合上继续查询;查询结果数据分页后的分页

    这里写图片描述
    就像图上这样点击不同的页数,去数据库查询出不同的信息处来~

    其实主要难点在于下面。

    如何通过当前页数,查到数据库中对应的信息。

     页数 = 总行数/每一页显示的记录数+ (总行数%每一页显示的记录数==0?0:1);
     本页显示的起始记录数 =  (页数 -1 )* 每一页显示的记录数
    
    在通过 select * from stud limit "+ 本页显示的起始记录数+","+ 每一页显示的记录数 查询出来。

    如何封装数据?

    表数据:每条记录通过Map 来封装。 一个表再通过一个 List<Map>封装。
    
    外面再用一个Map把List封装了,同时还可以封装其他数据。
    /*
     * 必须返回:总页数(int) + 查询的表数据(List<Map<String,String>>)
     * 因此可封装成: 
     * int pageCount = ...
     * List<Map<String,String>> datas = ...
     * Map<String,Object> map = new HashMap<String,Object>();
     * 
     * map.put("pageCount",pageCount); //1
     * map.put("datas",datas);//2
     */

    接下来就是代码了
    实现从数据看查询结果出来并且封装的DAO代码

    package cn.hncu.dao;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    /*
     * 必须返回:总页数(int) + 查询的表数据(List<Map<String,String>>)
     * 因此可封装成: 
     * int pageCount = ...
     * List<Map<String,String>> datas = ...
     * Map<String,Object> map = new HashMap<String,Object>();
     * 
     * map.put("pageCount",pageCount); //1
     * map.put("datas",datas);//2
     */
    
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.MapListHandler;
    import org.apache.commons.dbutils.handlers.ScalarHandler;
    
    import cn.hncu.utils.C3p0ConnUtils;
    
    public class StudDao implements IStudDAO{
    /*
     * 页数 = 总行数/pageSize  + (总行数%pageSize==0?0:1);
     * 第n页的 起始行数 = (n-1)* pageSize;
     * 
     * (non-Javadoc)
     * @see cn.hncu.dao.IStudDAO#query(int)
     */
        @Override
        public Map<String, Object> query(int pageNo) throws Exception {
            Map<String, Object>  map = new HashMap<String, Object>();
            QueryRunner run = new QueryRunner( C3p0ConnUtils.getDataSource());
            int pageCount = Integer.valueOf(""+run.query("select count(1) from stud", new ScalarHandler()));
    
            int pageSize = 15; //每一页显示15行数据~
            int startNo = (pageNo-1)*pageSize;
            List<Map<String, Object>>  datas= run.query("select * from stud limit "+startNo+","+pageSize, new MapListHandler());
            map.put("datas",datas); //封装好了当前页面的数据总共的行数
            pageCount = pageCount/pageSize + (pageCount%pageSize==0?0:1);
            map.put("pageCount", pageCount);// 封装好了一个总共页数目
            return map;
        }
    }
    

    实现和页面连接的PageServlet代码如下。 (与DAO之间会有几个没有实际作用的接口所以代码没贴了)

    package cn.hncu.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Map;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import cn.hncu.service.IPageServiceDAO;
    import cn.hncu.service.PageServiceDao;
    
    public class PageServlet extends HttpServlet {
    //      注入Service
        private IPageServiceDAO psDao = new PageServiceDao();
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
                doPost(request, response);
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            String spageNo = request.getParameter("pageNo");
            if(spageNo==null || spageNo.trim().length()<=0){
                spageNo = "1";
            }
            Integer pageNo =1;
            Map<String, Object> map  = null;
            try {
                pageNo = Integer.valueOf(spageNo);
                 map = psDao.query(pageNo);
            } catch (NumberFormatException e) {
                System.out.println("请传入正确格式的 数字参数");
                e.printStackTrace();
            } catch (Exception e) {
                System.out.println("导向错误页面");
                e.printStackTrace();
            }
            int pageCount = (Integer) map.get("pageCount");
    
            // 页面只显示最近10页面
            int starPagetNo = pageNo-5; int endPageNo =pageNo+4;
            if(pageNo<=6){
                starPagetNo = 1; endPageNo = starPagetNo + 9;
            }
            if(pageNo>=pageCount-4){
                endPageNo = pageCount;starPagetNo = endPageNo -9;
            }
            //把数据传给前端页面:起始页、结束页、当前页、当前页数据,总页面数
            request.setAttribute("startPageNo", starPagetNo);
            request.setAttribute("endPageNo", endPageNo);
            request.setAttribute("pageNo", pageNo);
            request.setAttribute("resList", map.get("datas"));
            request.setAttribute("pageCount", pageCount);
            request.getRequestDispatcher("/jsps/show.jsp").forward(request, response);
        }
    
    }
    

    最后是显示页面代码show.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <html>
      <head>
        <title>页面数据显示</title>
      </head>
    
      <body>
            <h3>网页数据分页显示技术</h3>
                <c:if test="${pageNo!=1}">
                    <a href=" <c:url value='/PageServlet?pageNo=${pageNo-1}'/>">上一页</a>
                </c:if>
            <c:forEach begin="${startPageNo}" end="${endPageNo}" var="i">
                <c:if test="${i!=pageNo}">
                    <a href=" <c:url value='/PageServlet?pageNo=${i}'/>" >${i}</a>
                </c:if>
                <c:if test="${i==pageNo}">
                    <a style="font-size: larger;color: red;">  ${i} </a>
                </c:if>
            </c:forEach>
            <c:if test="${pageNo!=pageCount}">
                    <a href=" <c:url value='/PageServlet?pageNo=${pageNo+1}'/>">下一页</a>
                </c:if>
            <hr>
            <c:forEach items="${resList}" var="map">
                ${map.id} ${map.name} <br/>
            </c:forEach>
      </body>
    </html>
    

    最后结果如下。 因为我只完成功能没有加css。 所以有点丑~
    这里写图片描述

    版本二:
    底层查询数据库代码

    
    public class StudDao implements IStudDAO{
    /*
     * 页数 = 总行数/pageSize  + (总行数%pageSize==0?0:1);
     * 第n页的 起始行数 = (n-1)* pageSize;
     * 
     * (non-Javadoc)
     * @see cn.hncu.dao.IStudDAO#query(int)
     */
        @Override
        public Map<String, Object> query(int pageNo,Stud s) throws Exception {
            Map<String, Object>  map = new HashMap<String, Object>();
            QueryRunner run = new QueryRunner( C3p0ConnUtils.getDataSource());
            String sql = "select count(1) from stud where 1=1";
    
            int pageSize = 15; //每一页显示15行数据~
            int startNo = (pageNo-1)*pageSize;
    
    
            String sql2 = "select * from stud where 1=1";
    
            if(s.getId()!=null && s.getId().trim().length()>0){
                sql2 = sql2 + " and id like '%"+s.getId()+"%'";
                sql = sql + " and id like '%"+s.getId()+"%'";
            }
            if(s.getName()!=null && s.getName().trim().length()>0){
                sql2 = sql2 + " and name like '%"+s.getName()+"%'";
                sql = sql + " and name like '%"+s.getName()+"%'";
            }
            sql2 = sql2 +" limit "+startNo+","+pageSize;
    
            int pageCount = Integer.valueOf(""+run.query(sql, new ScalarHandler()));
            List<Map<String, Object>>  datas= run.query(sql2, new MapListHandler());
            map.put("datas",datas); //封装好了当前页面的数据总共的行数
            pageCount = pageCount/pageSize + (pageCount%pageSize==0?0:1);
            map.put("pageCount", pageCount);// 封装好了一个总共页数目
            return map;
        }
    }
    

    Servlet 层代码

    package cn.hncu.servlet;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Map;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import cn.hncu.domain.Stud;
    import cn.hncu.service.IPageServiceDAO;
    import cn.hncu.service.PageServiceDao;
    
    public class PageServlet extends HttpServlet {
    //      注入Service
        private IPageServiceDAO psDao = new PageServiceDao();
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
                doPost(request, response);
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            HttpSession session = request.getSession();
            Stud s = (Stud) session.getAttribute("stud");
            if(s==null){// 第一次进来~
                s = new Stud();
            }
    
            if(request.getMethod().equalsIgnoreCase("POST")){
                String id = request.getParameter("id");
                String name = request.getParameter("name");
                //Post方式就需要重新封装 Stud 
                s.setId(id);
                s.setName(name);
                session.setAttribute("stud", s);
            }
            request.setAttribute("id", s.getId());
            request.setAttribute("name", s.getName());
    
            //下面不管前面,只负责拿到  要查的页 和 Stud
            String spageNo = request.getParameter("pageNo");
            if(spageNo==null || spageNo.trim().length()<=0){
                spageNo = "1";
            }
            Integer pageNo =1;
            Map<String, Object> map  = null;
            try {
                pageNo = Integer.valueOf(spageNo);
                 map = psDao.query(pageNo,s);
            } catch (NumberFormatException e) {
                System.out.println("请传入正确格式的 数字参数");
                e.printStackTrace();
            } catch (Exception e) {
                System.out.println("导向错误页面");
                e.printStackTrace();
            }
            int pageCount = (Integer) map.get("pageCount");
    
            // 页面只显示最近10页面
            int starPagetNo = pageNo-5; int endPageNo =pageNo+4;
            if(pageNo<=6){
                starPagetNo = 1; endPageNo = starPagetNo + 9;
            }
            if(pageNo>=pageCount-4){
                endPageNo = pageCount;starPagetNo = endPageNo -9;
            }
            if(pageCount<10){
                starPagetNo = 1; endPageNo =pageCount;
            }
            //把数据传给前端页面:起始页、结束页、当前页、当前页数据,总页面数
            request.setAttribute("startPageNo", starPagetNo);
            request.setAttribute("endPageNo", endPageNo);
            request.setAttribute("pageNo", pageNo);
            request.setAttribute("resList", map.get("datas"));
            request.setAttribute("pageCount", pageCount);
            request.getRequestDispatcher("/jsps/show.jsp").forward(request, response);
        }
    
    }
    

    显示页面代码 show.jsp

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <html>
      <head>
        <title>页面数据显示</title>
      </head>
    
      <body>
            <h3>网页数据分页显示技术</h3>
    
            <form action="<c:url value='/PageServlet'/>" method="post">
                id包含:<input type="text" name="id" value="${id }"/> &nbsp; &nbsp;
                Name包含:<input type="text" name="name" value="${name }"/> &nbsp; &nbsp;
                <input type="submit" value="查询一下">
            </form>
    
            <hr>
                <c:if test="${pageNo!=1}">
                    <a href=" <c:url value='/PageServlet?pageNo=${pageNo-1}'/>">上一页</a>
                </c:if>
            <c:forEach begin="${startPageNo}" end="${endPageNo}" var="i">
                <c:if test="${i!=pageNo}">
                    <a href=" <c:url value='/PageServlet?pageNo=${i}'/>" >${i}</a>
                </c:if>
                <c:if test="${i==pageNo}">
                    <a style="font-size: larger;color: red;">  ${i} </a>
                </c:if>
            </c:forEach>
            <c:if test="${pageNo!=pageCount}">
                    <a href=" <c:url value='/PageServlet?pageNo=${pageNo+1}'/>">下一页</a>
            </c:if>
        <select onchange="sub(this);">
            <c:forEach begin="1" end="${pageCount}" var="idx">
               <option <c:if test='${idx==pageNo}'>selected</c:if> value="${idx}"> 第${idx}页 </option>
            </c:forEach>
        </select>
        <script type="text/javascript">
           function sub(obj){
               window.location.href="<c:url value='/PageServlet?pageNo='/>" +obj.value;
           }
        </script>
            <hr>
            <c:forEach items="${resList}" var="map">
                ${map.id} ${map.name} <br/>
            </c:forEach>
      </body>
    </html>
    

    结果页面展示
    查询id包含2 名字包含Tom信息
    这里写图片描述

    展开全文
  • html网页常用功能:下拉框模糊搜索

    千次阅读 2019-10-31 12:25:01
    下拉框模糊搜索很好使,但是比较难实现,下面就直接贴代码吧。 <!doctype html> <html> <head> <meta charset="utf-8"> <title>下拉框模糊搜索-jq22.com</title> <script ...

    下拉框模糊搜索很好使,但是比较难实现,下面就直接贴代码吧。

    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>下拉框模糊搜索-jq22.com</title>
    <script src="https://libs.baidu.com/jquery/1.11.3/jquery.min.js"></script>
    <style>
    .second select {
    	width:169px;
    	height:106px;
    	margin:0px;
            margin-top:60px;
    	outline:none;
    	border:1px solid #999;
    	margin-top:31px;
    }
    .second input {
    	width:167px;
    	top:6px;
    	outline:none;
    	border:0pt;
    	position:absolute;
    	line-height:30px;
    	left:8px;
    	height:30px;
    	border:1px solid #999;
    }
    .second ul {
    	position:absolute;
    	top:27px;
    	border:1px solid #999;
    	left:8px;
    	width:125px;
    	line-height:16px;
    }
    .ul li {
    	list-style:none;
    	width:161px;
    	/* left:15px;
    	*/  
        margin-left:-40px;
    	font-family:微软雅黑;
    	padding-left:4px;
    }
    .blue {
    	background:#1e91ff;
    }
    </style>
    </head>
    <body>
     <span class="second">  
        <input type="text" name="makeupCo" id="makeupCo" class="makeinp" onfocus="setfocus(this)" oninput="setinput(this);" placeholder="请选择或输入">  
        <select name="makeupCoSe" id="typenum" onchange="changeF(this)" size="12" style="display:none;">  
    	    <option value="">不隶属于任何分类(详情页)</option>  
            <option value="">华军首页</option>  
            <option value="">华军M站</option>  
            <option value="">游戏下载-华军</option>  
            <option value="">热门资讯-华军</option>  
            <option value="">下载攻略-华军</option>  
            <option value="">下载攻略-pcsoft</option>  
            <option value="">热门资讯-pcsoft</option>  
            <option value="">办公软件-188soft</option>  
    		<option value="">pcsoft首页</option> 
        </select>  
    </span> 
    
    <script>
    var TempArr = []; //存储option  
    $(function() {
        /*先将数据存入数组*/
        $("#typenum option").each(function(index, el) {
            TempArr[index] = $(this).text();
        });
        $(document).bind('click',
        function(e) {
            var e = e || window.event; //浏览器兼容性     
            var elem = e.target || e.srcElement;
            while (elem) { //循环判断至跟节点,防止点击的是div子元素     
                if (elem.id && (elem.id == 'typenum' || elem.id == "makeupCo")) {
                    return;
                }
                elem = elem.parentNode;
            }
            $('#typenum').css('display', 'none'); //点击的不是div或其子元素     
        });
    })
    
    function changeF(this_) {
        $(this_).prev("input").val($(this_).find("option:selected").text());
        $("#typenum").css({
            "display": "none"
        });
    }
    function setfocus(this_) {
        $("#typenum").css({
            "display": ""
        });
        var select = $("#typenum");
        for (i = 0; i < TempArr.length; i++) {
            var option = $("<option></option>").text(TempArr[i]);
            select.append(option);
        }
    }
    
    function setinput(this_) {
        var select = $("#typenum");
        select.html("");
        for (i = 0; i < TempArr.length; i++) {
            //若找到以txt的内容开头的,添option  
            if (TempArr[i].substring(0, this_.value.length).indexOf(this_.value) == 0) {
                var option = $("<option></option>").text(TempArr[i]);
                select.append(option);
            }
        }
    }
    </script>
    
    </body>
    </html>
    

     

     

     

    展开全文
  • 上次忘记在哪找了一段代码,跪求添加一个搜索功能,我只写了一个输入搜索内容,但是不知道怎么往网页注入值。跪求补全
  • 想要制作一个类似百度的界面,搜索一个关键词,在搜索框下面就可以显示出我已经存放好的视频文件。这个过程需要哪些知识,也可以给代码参考。最好使用html5,JS,c#之内的知识,本人知识有限,谢谢。
  • 北京时间8月2日上午消息,Twitter正在Twitter.com上逐步推出“通用搜索”结果,使得该公司的网页搜索与现有的移动体验更加一致。  “通用搜索”的概念是2007由谷歌年提出的,可以在传统搜索结果中整合照片、...
    北京时间8月2日上午消息,Twitter正在Twitter.com上逐步推出“通用搜索”结果,使得该公司的网页搜索与现有的移动体验更加一致。


      “通用搜索”的概念是2007由谷歌年提出的,可以在传统搜索结果中整合照片、视频、新闻、本地企业信息等更多内容。


      Twitter.com的主搜索结果面板主要有三大变化:


      1、用户或“人”现在已经整合到搜索结果里。


      2、照片也可以作为搜索结果显示。


      3、除了“结果”和“人”两个标签外,左边还设计了新的照片标签。


      例如,在搜索Google Glass后,搜索结果页面的主界面会在顶部首先显示“人”的结果,其次是三条主要的Twitter消息,最下方则是相关的照片,之后还会显示更多Twitter消息。左边栏则分别列出了结果、人和照片三个标签。


      除此之外,当点击搜索框时,下拉菜单中还会包含“最近的搜索”和“保存的搜索”,前者是新功能,后者之前已有,但不太显眼。


      在用户输入搜索请求的过程中,Twitter还可以推荐相关账号,并在下面注明用户是否已经关注这些账号。


      这些新功能已经面向部分用户推出,很快还将扩大到所有用户。


    展开全文
  • 用户用百度的ueditor编辑正文,然后在手机上需要做一个检索正文关键字的功能 但是遇到了如下问题: 比如用户检索的关键字是“刑法第56条”,正文上确实该关键字,但实际上该文本经过ueditor的处理后变成了...
  • 1、切入点庆幸的是,新浪提供了高级搜索功能。找不到?这个功能需要用户登录才能使用……没关系,下面将详细讲述如何在无须登录的情况下,获取“关键字+时间+区域”的新浪微博。首先我们还是要登录一...

    作为国内社交媒体的领航者,很遗憾,新浪微博没有提供以“关键字+时间+区域”方式获取的官方API。当我们看到国外科研成果都是基于某关键字获得的社交媒体数据,心中不免凉了一大截,或者转战推特。再次建议微博能更开放些!


    1、切入点

    庆幸的是,新浪提供了高级搜索功能。找不到?这个功能需要用户登录才能使用……没关系,下面将详细讲述如何在无须登录的情况下,获取“关键字+时间+区域”的新浪微博。

    首先我们还是要登录一下,看看到底是个什么样的功能。


    然后我们看看地址栏:

    [html] view plain copy
    1. http://s.weibo.com/wb/%25E4%25B8%25AD%25E5%259B%25BD%25E5%25A5%25BD%25E5%25A3%25B0%25E9%259F%25B3&xsort=time&region=custom:11:1000&timescope=custom:2014-07-09-2:2014-07-19-4&Refer=g  


    这么长?其实蛮清晰、简单的。解析如下:


    固定地址部分:http://s.weibo.com/wb/

    关键字(2次URLEncode编码):%25E4%25B8%25AD%25E5%259B%25BD%25E5%25A5%25BD%25E5%25A3%25B0%25E9%259F%25B3

    返回微博的排序方式(此处为“实时”):xsort=time

    搜索地区:region=custom:11:1000

    搜索时间范围:timescope=custom:2013-07-02-2:2013-07-09-2

    可忽略项:Refer=g

    是否显示类似微博(未出现):nodup=1    注:加上这个选项可多收集微博,建议加上。默认为省略参数,即省略部分相似微博。

    某次请求的页数(未出现):page=1


    既然是这么回事,我们接下来就可以使用网页爬虫的方式获取“关键字+时间+区域”的微博了……

    2、采集思路

    大体思路如下:构造URL,爬取网页,然后解析网页中的微博信息,如下图所示。微博官方提供了根据微博ID进行查询的微博信息的API,故本文只负责讲述收集微博ID。

    另外,高级搜索最多返回50页微博,那么时间间隔设置最小为宜。所以时间范围(timescope)可设置为1小时,如2013-07-01-2:2013-07-01-2。

    目前没有模拟登陆,所以需要设置两个邻近URL请求之间的随机休眠时间,过于频繁会被认为是机器人,你懂的。



    3、具体实现

    作为爬虫小工具,用python非常适合。作为python初学者,不要怪我写得像java。首先实现一个爬取每个小时的类。

    [python] view plain copy
    1. class CollectData():  
    2.     """每小时数据收集类 
    3.         利用微博高级搜索功能,按关键字搜集一定时间范围内的微博。 
    4.  
    5.         大体思路:构造URL,爬取网页,然后解析网页中的微博ID。后续利用微博API进行数据入库。本程序只负责收集微博的ID。 
    6.  
    7.         登陆新浪微博,进入高级搜索,输入关键字”空气污染“,选择”实时“,时间为”2013-07-02-2:2013-07-09-2“,地区为”北京“,之后发送请求会发现地址栏变为如下: 
    8.         http://s.weibo.com/wb/%25E7%25A9%25BA%25E6%25B0%2594%25E6%25B1%25A1%25E6%259F%2593&xsort=time&region=custom:11:1000×cope=custom:2013-07-02-2:2013-07-09-2&Refer=g 
    9.  
    10.             固定地址部分:http://s.weibo.com/wb/ 
    11.             关键字二次UTF-8编码:%25E7%25A9%25BA%25E6%25B0%2594%25E6%25B1%25A1%25E6%259F%2593 
    12.             排序为“实时”:xsort=time 
    13.             搜索地区:region=custom:11:1000 
    14.             搜索时间范围:timescope=custom:2013-07-02-2:2013-07-09-2 
    15.             可忽略项:Refer=g 
    16.             显示类似微博:nodup=1    注:这个选项可多收集微博,建议加上。默认不加此参数,省略了部分相似微博。 
    17.             某次请求的页数:page=1 
    18.  
    19.         另外,高级搜索最多返回50页微博,那么时间间隔设置最小为宜。所以该类设置为搜集一定时间段内最多50页微博。 
    20.     """  
    21.     def __init__(self, keyword, startTime, region, savedir, interval='50', flag=True, begin_url_per = "http://s.weibo.com/weibo/"):  
    22.         self.begin_url_per = begin_url_per  #设置固定地址部分,默认为"http://s.weibo.com/weibo/",或者"http://s.weibo.com/wb/"  
    23.         self.setKeyword(keyword)    #设置关键字  
    24.         self.setStartTimescope(startTime)   #设置搜索的开始时间  
    25.         self.setRegion(region)  #设置搜索区域  
    26.         self.setSave_dir(savedir)   #设置结果的存储目录  
    27.         self.setInterval(interval)  #设置邻近网页请求之间的基础时间间隔(注意:过于频繁会被认为是机器人)  
    28.         self.setFlag(flag)  #设置  
    29.         self.logger = logging.getLogger('main.CollectData'#初始化日志  
    30.   
    31.     ##设置关键字  
    32.     ##关键字需解码  
    33.     def setKeyword(self, keyword):  
    34.         self.keyword = keyword.decode('GBK').encode("utf-8")  
    35.         print 'twice encode:',self.getKeyWord()  
    36.   
    37.     ##设置起始范围,间隔为1小时  
    38.     ##格式为:yyyy-mm-dd-HH  
    39.     def setStartTimescope(self, startTime):  
    40.         if not (startTime == '-'):  
    41.             self.timescope = startTime + ":" + startTime  
    42.         else:  
    43.             self.timescope = '-'  
    44.   
    45.     ##设置搜索地区  
    46.     def setRegion(self, region):  
    47.         self.region = region  
    48.   
    49.     ##设置结果的存储目录  
    50.     def setSave_dir(self, save_dir):  
    51.         self.save_dir = save_dir  
    52.         if not os.path.exists(self.save_dir):  
    53.             os.mkdir(self.save_dir)  
    54.   
    55.     ##设置邻近网页请求之间的基础时间间隔  
    56.     def setInterval(self, interval):  
    57.         self.interval = int(interval)  
    58.   
    59.     ##设置是否被认为机器人的标志。若为False,需要进入页面,手动输入验证码  
    60.     def setFlag(self, flag):  
    61.         self.flag = flag  
    62.   
    63.     ##构建URL  
    64.     def getURL(self):  
    65.         return self.begin_url_per+self.getKeyWord()+"&region=custom:"+self.region+"&xsort=time×cope=custom:"+self.timescope+"&nodup=1&page="  
    66.   
    67.     ##关键字需要进行两次urlencode  
    68.     def getKeyWord(self):  
    69.         once = urllib.urlencode({"kw":self.keyword})[3:]  
    70.         return urllib.urlencode({"kw":once})[3:]  
    71.   
    72.     ##爬取一次请求中的所有网页,最多返回50页  
    73.     def download(self, url, maxTryNum=4):  
    74.         content = open(self.save_dir + os.sep + "weibo_ids.txt""ab")  #向结果文件中写微博ID  
    75.   
    76.         hasMore = True  #某次请求可能少于50页,设置标记,判断是否还有下一页  
    77.         isCaught = False    #某次请求被认为是机器人,设置标记,判断是否被抓住。抓住后,需要复制log中的文件,进入页面,输入验证码  
    78.         mid_filter = set([])    #过滤重复的微博ID  
    79.           
    80.         i = 1   #记录本次请求所返回的页数  
    81.         while hasMore and i < 51 and (not isCaught):    #最多返回50页,对每页进行解析,并写入结果文件  
    82.             source_url = url + str(i)   #构建某页的URL  
    83.             data = ''   #存储该页的网页数据  
    84.             goon = True #网络中断标记  
    85.   
    86.             ##网络不好的情况,试着尝试请求三次  
    87.             for tryNum in range(maxTryNum):  
    88.                 try:  
    89.                     html = urllib2.urlopen(source_url, timeout=12)  
    90.                     data = html.read()  
    91.                     break  
    92.                 except:  
    93.                     if tryNum < (maxTryNum-1):  
    94.                         time.sleep(10)  
    95.                     else:  
    96.                         print 'Internet Connect Error!'  
    97.                         self.logger.error('Internet Connect Error!')  
    98.                         self.logger.info('filePath: ' + savedir)  
    99.                         self.logger.info('url: ' + source_url)  
    100.                         self.logger.info('fileNum: ' + str(fileNum))  
    101.                         self.logger.info('page: ' + str(i))  
    102.                         self.flag = False  
    103.                         goon = False  
    104.                         break  
    105.             if goon:  
    106.                 lines = data.splitlines()  
    107.                 isCaught = True  
    108.                 for line in lines:  
    109.                     ## 判断是否有微博内容,出现这一行,则说明没有被认为是机器人  
    110.                     if line.startswith('<script>STK && STK.pageletM && STK.pageletM.view({"pid":"pl_weibo_direct"'):  
    111.                         isCaught = False  
    112.                         n = line.find('html":"')  
    113.                         if n > 0:  
    114.                             j = line[n + 7: -12].encode("utf-8").decode('unicode_escape').encode("utf-8").replace("\\", "")  
    115.                             ## 没有更多结果页面  
    116.                             if (j.find('<div class="search_noresult">') > 0):  
    117.                                 hasMore = False  
    118.                             ## 有结果的页面  
    119.                             else:  
    120.                                 page = etree.HTML(j)  
    121.                                 dls = page.xpath(u"//dl")   #使用xpath解析  
    122.                                 for dl in dls:  
    123.                                     mid = str(dl.attrib.get('mid'))  
    124.                                     if(mid != 'None' and mid not in mid_filter):  
    125.                                         mid_filter.add(mid)  
    126.                                         content.write(mid)  
    127.                                         content.write('\n')  
    128.                         break  
    129.                 lines = None  
    130.                 ## 处理被认为是机器人的情况  
    131.                 if isCaught:  
    132.                     print 'Be Caught!'  
    133.                     self.logger.error('Be Caught Error!')  
    134.                     self.logger.info('filePath: ' + savedir)  
    135.                     self.logger.info('url: ' + source_url)  
    136.                     self.logger.info('fileNum: ' + str(fileNum))  
    137.                     self.logger.info('page:' + str(i))  
    138.                     data = None  
    139.                     self.flag = False  
    140.                     break  
    141.                 ## 没有更多结果,结束该次请求,跳到下一个请求  
    142.                 if not hasMore:  
    143.                     print 'No More Results!'  
    144.                     if i == 1:  
    145.                         time.sleep(random.randint(55,75))  
    146.                     else:  
    147.                         time.sleep(15)  
    148.                     data = None  
    149.                     break  
    150.                 i += 1  
    151.                 ## 设置两个邻近URL请求之间的随机休眠时间,你懂的。目前没有模拟登陆  
    152.                 sleeptime_one = random.randint(self.interval-30,self.interval-10)  
    153.                 sleeptime_two = random.randint(self.interval+10,self.interval+30)  
    154.                 if i%2 == 0:  
    155.                     sleeptime = sleeptime_two  
    156.                 else:  
    157.                     sleeptime = sleeptime_one  
    158.                 print 'sleeping ' + str(sleeptime) + ' seconds...'  
    159.                 time.sleep(sleeptime)  
    160.             else:  
    161.                 break  
    162.         content.close()  
    163.         content = None  
    164.   
    165.     ##改变搜索的时间范围,有利于获取最多的数据     
    166.     def getTimescope(self, perTimescope, hours):  
    167.         if not (perTimescope=='-'):  
    168.             times_list = perTimescope.split(':')  
    169.             start_datetime = datetime.datetime.fromtimestamp(time.mktime(time.strptime(times_list[-1],"%Y-%m-%d-%H")))  
    170.             start_new_datetime = start_datetime + datetime.timedelta(seconds = 3600)  
    171.             end_new_datetime = start_new_datetime + datetime.timedelta(seconds = 3600*(hours-1))  
    172.             start_str = start_new_datetime.strftime("%Y-%m-%d-%H")  
    173.             end_str = end_new_datetime.strftime("%Y-%m-%d-%H")  
    174.             return start_str + ":" + end_str  
    175.         else:  
    176.             return '-'  

    有了每个小时的类之后,那就可以设置开始收集的时间了。

    [python] view plain copy
    1. def main():  
    2.     logger = logging.getLogger('main')  
    3.     logFile = './collect.log'  
    4.     logger.setLevel(logging.DEBUG)  
    5.     filehandler = logging.FileHandler(logFile)  
    6.     formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s: %(message)s')  
    7.     filehandler.setFormatter(formatter)  
    8.     logger.addHandler(filehandler)  
    9.   
    10.     while True:  
    11.         ## 接受键盘输入  
    12.         keyword = raw_input('Enter the keyword(type \'quit\' to exit ):')  
    13.         if keyword == 'quit':  
    14.             sys.exit()  
    15.         startTime = raw_input('Enter the start time(Format:YYYY-mm-dd-HH):')  
    16.         region = raw_input('Enter the region([BJ]11:1000,[SH]31:1000,[GZ]44:1,[CD]51:1):')  
    17.         savedir = raw_input('Enter the save directory(Like C://data//):')  
    18.         interval = raw_input('Enter the time interval( >30 and deafult:50):')  
    19.   
    20.         ##实例化收集类,收集指定关键字和起始时间的微博  
    21.         cd = CollectData(keyword, startTime, region, savedir, interval)  
    22.         while cd.flag:  
    23.             print cd.timescope  
    24.             logger.info(cd.timescope)  
    25.             url = cd.getURL()  
    26.             cd.download(url)  
    27.             cd.timescope = cd.getTimescope(cd.timescope,1)  #改变搜索的时间,到下一个小时  
    28.         else:  
    29.             cd = None  
    30.             print '-----------------------------------------------------'  
    31.             print '-----------------------------------------------------'  
    32.     else:  
    33.         logger.removeHandler(filehandler)  
    34.         logger = None  
    万事俱备,跑起来吧!

    [python] view plain copy
    1. if __name__ == '__main__':  
    2.     main()  

    就这样了……

    如果想编译成windows窗口文件或者想改造成自己小爬虫,欢迎去 github pull一下!!

    展开全文
  • 原来的自己大多时候是通过视频和书本资料自学,很少动手实践,也就会眼高手低的毛病,每次做一个小功能来练手的时候都会遇到各式各样的问题,也正是在想方设法解决这些问题的过程中收获是最大的,不仅是解决问题...
  • 网页设计\网页制作常用软件大全

    千次阅读 多人点赞 2014-03-04 12:08:26
    网页设计\网页制作常用软件 一、专业的网页设计、网页制作软件: 1、CorelDraw:通过CorelDRAW9的全方面的设计及网页功能融合到现有的设计方案中,制作矢量的插图、设计及图像,出色地设计公司标志、简报、彩页、...
  • 用Editplus制作HTML网页

    千次阅读 2015-06-08 22:49:58
    最近在学习java web开发,作为预备知识,首先要学习HTML编程,这里记下我制作第一个网页的过程,我的学习分为以下几个步骤:①初识HTML ②Editplus简介 ③网页总体构思 ④涉及的知识点 一、初识HTML1、为什么要学...
  • html制作个人简历网页

    千次阅读 多人点赞 2020-06-17 10:33:33
    以下是我用html的相关知识制作的个人简历网页,话不多说先看看最终效果: 如上所示项目一共分为5个部分,分别对应导航栏的5个内容。其中项目技能用的是echarts里的柱状图,作品展示用的是bootstrap里的轮播图,...
  • 搜索功能实现

    万次阅读 2020-09-05 15:39:07
    搜索功能实现 在开发搜索框过程中需要实现两个小功能,技术栈是nuxt.js 功能描述如下 功能1:当鼠标聚焦的时候搜索框下方出现热门推荐,如下图所示 功能2:当输入搜索内容的时候,热门推荐消失,出现搜索结果,...
  • 搜索引擎网页排序算法

    万次阅读 2012-09-01 14:24:41
    2.1基于词频统计——词位置加权的搜索引擎  利用关键词在文档中出现的频率和位置排序是搜索引擎最早期排序的主要思想,其技术发展也最为成熟,是第一阶段搜索引擎的主要排序技术,应用非常广泛,至今仍是许多搜索...
  • 网页添加留言功能

    千次阅读 2018-05-29 09:50:36
    网页添加一个留言板功能主要分为以下几个流程: 引入LeanCloud 获取留言内容(网页中写入的留言内容) 保存留言内容到后台服务器 创建历史留言,获取到服务器保存的所有留言内容,读取并写入网页中 封装代码 MVC ...
  • 网页制作基础 – CSS

    千人学习 2017-01-24 17:07:30
    CSS是一套高雅的WEB设计语言,它让网页设计这件事充满的艺术范。就像做图里面突然加了配色一样,看起来酷炫高大上。 然而事实上CSS真是很美,它让同样的一篇网页内容千变万化,让单调的文字绚丽多姿。它就像佳丽手...
  • HTML+CSS制作的纯静态网页

    万次阅读 多人点赞 2020-01-13 15:41:10
    刚学完HTML+CSS,一定要按照自己的想法去制作网页,虽然没有交互,但是可以对前面的知识一个很大的重用,你的知识框架会更加完美。css基础html是勾勒,css是染色,基础的css学完你会种想写页面的冲动,这时候你...
  • html页面查找搜索功能代码

    千次阅读 2020-09-18 23:59:06
    html页面查找搜索功能代码 html查找功能 <input type=“button” οnclick="javascript:search()"value=“搜索” /> 这里插入网页内容
  • Django搜索功能的实现

    千次阅读 2018-10-13 11:39:00
    在用Django搭建网站的时候,要实现一个搜索功能,实现对数据库的检索功能,这里用到了网上的几个标准库: django-haystack, whoosh, jieba。 其中这里详细的haystack中文教程 1 首先是在相应的环境中安装,pip ...
  • html下拉框有搜索功能 使用select2

    千次阅读 2019-03-26 10:11:30
    js < link href = " https://cdn.bootcss.com/select2/4.0.6-rc.1/css/select2.css " rel = " stylesheet " > < script src = " ..." > script > html ...就可以有搜索框了
  • 首页静态页面中搜索功能,如何实现在输入关键字是,跳转到相匹配的静态页面,不经过数据库,纯前台的怎么做,求大神指教
  • 我想要在网页上实现一个搜索框,不管输入什么内容, 如果下面表中存在就将表中的那一行数据颜色变深, 如果不存在就提示没有此数据。 数据来源都是自己的数据库表中

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 216,572
精华内容 86,628
关键字:

如何制作有搜索功能的网页