zoukankan      html  css  js  c++  java
  • [Python学习] 简单爬取CSDN下载资源信息

            这是一篇Python爬取CSDN下载资源信息的样例,主要是通过urllib2获取CSDN某个人全部资源的资源URL、资源名称、下载次数、分数等信息。写这篇文章的原因是我想获取自己的资源全部的评论信息。可是因为评论採用JS暂时载入。所以这篇文章先简介怎样人工分析HTML页面爬取信息。



    源码

    # coding=utf-8  
    import urllib  
    import time  
    import re  
    import os
    
    #************************************************** 
    #第一步 遍历获取每页相应主题的URL 
    #http://download.csdn.net/user/eastmount/uploads/1
    #http://download.csdn.net/user/eastmount/uploads/8
    #**************************************************
    
    num=1 #记录资源总数 共46个资源
    number=1 #记录列表总数1-8
    fileurl=open('csdn_url.txt','w+')  
    fileurl.write('****************获取资源URL*************
    
    ')
    
    while number<9:
        url='http://download.csdn.net/user/eastmount/uploads/' + str(number)
        fileurl.write('下载列表URL:'+url+'
    
    ')
        print unicode('下载列表URL:'+url,'utf-8')
        content=urllib.urlopen(url).read()
        open('csdn.html','w+').write(content)
    
        #获取包括URL块内容 匹配须要计算</div>个数
        start=content.find(r'<div class="list-container mb-bg">')  
        end=content.find(r'<div class="page_nav">')
        cutcontent=content[start:end]
        #print cutcontent
    
        #获取块内容中URL
        #形如<dt><div><img 图标></div><h3><a href>标题</a></h3></dt>
        res_dt = r'<dt>(.*?)</dt>'  
        m_dt =  re.findall(res_dt,cutcontent,re.S|re.M)  
        for obj in m_dt:
            #记录URL数量
            print '******************************************'
            print '第'+str(num)+'个资源'
            fileurl.write('******************************************
    ')
            fileurl.write('第'+str(num)+'个资源
    ')
            num = num +1
            #获取详细URL
            url_list = re.findall(r"(?<=href=").+?(?=")|(?<=href=').+?

    (?=')", obj) for url in url_list: url_load='http://download.csdn.net'+url print 'URL: '+url_load fileurl.write('URL: http://download.csdn.net'+url+' ') #获取资源标题 #<a href="/detail/eastmount/8757243">MFC显示BMP图片</a> res_title = r'<a href=.*?>(.*?)</a>' title = re.findall(res_title,obj,re.S|re.M) for t in title: print unicode('Title: ' + t,'utf-8') fileurl.write('Title: ' + t +' ') #************************************************** #第二步 遍历详细资源的内容及评论 #http://download.csdn.net/detail/eastmount/8785591 #************************************************** #定位指定结构化信息盒Infobox resources = urllib.urlopen(url_load).read() open('resource.html','w+').write(resources) start_res=resources.find(r'<div class="wraper-info">') end_res=resources.find(r'<div class="enter-link">') infobox=resources[start_res:end_res] #获取资源积分、下载次数、资源类型、资源大小(前4个<span></span>) res_span = r'<span>(.*?)</span>' m_span = re.findall(res_span,infobox,re.S|re.M) print '资源积分: '+m_span[0] fileurl.write('资源积分: ' + m_span[0] +' ') print '下载次数: '+m_span[1] fileurl.write('下载次数: ' + m_span[1] +' ') print '资源类型: '+m_span[2] fileurl.write('资源类型: ' + m_span[2] +' ') print '资源大小: '+m_span[3] fileurl.write('资源大小: ' + m_span[3] +' ') #************************************************** #第三步 怎样获取评论 #http://jeanphix.me/Ghost.py/ #http://segmentfault.com/q/1010000000143340 #http://casperjs.org/ #************************************************** else: fileurl.write('****************************************** ') print '****************************************** ' print 'Load Next List ' number = number+1 #列表加1 #退出全部循环 else: fileurl.close()


    显示结果
            显示内容包含资源URL、资源标题、资源积分、下载次数、资源类型和资源大小:

            比方如今爬取郭霖大神的资源信息。当中页面链接例如以下:(共7页)
                  http://download.csdn.net/user/sinyu890807/uploads/1
                  http://download.csdn.net/user/sinyu890807/uploads/7
            简单改动Python源码URL后,下载页面例如以下图所看到的:


            执行结果例如以下图所看到的:




    HTML分析
           
    首先。获取每列中的全部资源的URL和标题,通过分析源码。
    <dt>
       <div class="icon"><img src="/images/minetype/rar.gif" title="rar文件"></div>
       <div class="btns"></div>  
       <h3><a href="/detail/eastmount/8772951">
              MFC 图像处理之几何运算 图像平移旋转缩放镜像(源代码)</a>
           <span class="points">0</span>
       </h3>
    </dt>           
    <dd class="meta">上传者:
        <a class="user_name" href="/user/eastmount">eastmount</a>
             | 上传时间:2015-06-04
             | 下载26次
    </dd>
    <dd class="intro">
            该资源主要參考我的博客【数字图像处理】六.MFC空间几何变换之图像平移、镜像、旋转
            缩放具体解释,主要讲述基于VC++6.0 MFC图像处理的应用知识,要通过MFC单文档视图实现显
            示BMP图片。
    </dd>
    <dd class="tag">
         <a href="/tag/MFC">MFC</a>
         <a href="/tag/%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86">图像处理</a><
    </dd>
            相应的HTML显演示样例如以下图所看到的:


            然后通过URL去到详细的资源获取我自己称为像消息盒的信息:


            相应审查元素的信息例如以下所看到的。获取<span>0分</span>就可以:


            最后我想做的事获取评论信息,可是它是通过JS实现的:
    <div class="section-list panel panel-default">
       <div class="panel-heading">
          <h3 class="panel-title">资源评论</h3>
       </div>
       <!-- recommand -->
       <script language='JavaScript' defer type='text/javascript'         
    
    src='/js/comment.js'></script>
       <div class="recommand download_comment panel-body" sourceid="8772951"></div>
    </div>
            显示的JS页面部分例如以下:
    var base_url= (window.location.host.substring(0,5)=='local') ? 'http://local.downloadv3.csdn.net' : 'http://download.csdn.net';
    base_url = "";
    $(document).ready(function(){
    	
    	CC_Comment.initConfig();
    	CC_Comment.getContent(1);
    });	
    var CC_Comment = 
    {
    	sourceid:0,
    	initConfig:function()
    	{
    		var sid = parseInt($(".download_comment").attr('sourceid'));
    		if(isNaN(sid) || sid<=0)
    		{
    			this.sourceid = 0;
    		}else
    		{
    			this.sourceid = sid;
    		}
    		
    	}
    ....
    }

            最后希望文章对你有所帮助吧!

    下一篇准备分析下Python怎样获取JS的评论信息,同一时候该篇文章能够给你提供一种简单的人工分析页面的样例;也能够获取某个人CSDN资源下载多、分数高的给你挑选。基础知识,仅供參考~
          (By:Eastmount 2015-7-21 下午5点   http://blog.csdn.net/eastmount/


  • 相关阅读:
    串口速率问题
    java中byte short int的理解
    matlab 设置坐标轴的有效数字
    Tomcat闪退
    解决linux下sudo更改文件权限报错xxxis not in the sudoers file. This incident will be reported.
    Git的常用命令
    [原创]创建指定RowState属性的DataRow实例
    [转]中文VS2008中安装ASP.NET MVC框架出现问题的解决方法
    [转]JavaScript为事件处理器传递参数
    [转]LINQ to SQL(LINQ2SQL) vs. ADO.NET Entity Framework
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7041109.html
Copyright © 2011-2022 走看看