[Python学习] 简单爬取CSDN下载资源信息

转自:[Python学习] 简单爬取CSDN下载资源信息


        这是一篇Python爬取CSDN下载资源信息的例子,主要是通过urllib2获取CSDN某个人所有资源的资源URL、资源名称、下载次数、分数等信息;写这篇文章的原因是我想获取自己的资源所有的评论信息,但是由于评论采用JS临时加载,所以这篇文章先简单介绍如何人工分析HTML页面爬取信息。

源代码


  1. # coding=utf-8    
  2. import urllib    
  3. import time    
  4. import re    
  5. import os  
  6.   
  7. #**************************************************   
  8. #第一步 遍历获取每页对应主题的URL   
  9. #http://download.csdn.net/user/eastmount/uploads/1  
  10. #http://download.csdn.net/user/eastmount/uploads/8  
  11. #**************************************************  
  12.   
  13. num=1 #记录资源总数 共46个资源  
  14. number=1 #记录列表总数1-8  
  15. fileurl=open('csdn_url.txt','w+')    
  16. fileurl.write('****************获取资源URL*************\n\n')  
  17.   
  18. while number<9:  
  19.     url='http://download.csdn.net/user/eastmount/uploads/' + str(number)  
  20.     fileurl.write('下载列表URL:'+url+'\n\n')  
  21.     print unicode('下载列表URL:'+url,'utf-8')  
  22.     content=urllib.urlopen(url).read()  
  23.     open('csdn.html','w+').write(content)  
  24.   
  25.     #获取包含URL块内容 匹配需要计算</div>个数  
  26.     start=content.find(r'<div class="list-container mb-bg">')    
  27.     end=content.find(r'<div class="page_nav">')  
  28.     cutcontent=content[start:end]  
  29.     #print cutcontent  
  30.   
  31.     #获取块内容中URL  
  32.     #形如<dt><div><img 图标></div><h3><a href>标题</a></h3></dt>  
  33.     res_dt = r'<dt>(.*?)</dt>'    
  34.     m_dt =  re.findall(res_dt,cutcontent,re.S|re.M)    
  35.     for obj in m_dt:  
  36.         #记录URL数量  
  37.         print '******************************************'  
  38.         print '第'+str(num)+'个资源'  
  39.         fileurl.write('******************************************\n')  
  40.         fileurl.write('第'+str(num)+'个资源\n')  
  41.         num = num +1  
  42.         #获取具体URL  
  43.         url_list = re.findall(r"(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')", obj)  
  44.         for url in url_list:  
  45.             url_load='http://download.csdn.net'+url  
  46.             print 'URL: '+url_load  
  47.             fileurl.write('URL: http://download.csdn.net'+url+'\n')  
  48.         #获取资源标题  
  49.         #<a href="/detail/eastmount/8757243">MFC显示BMP图片</a>  
  50.         res_title = r'<a href=.*?>(.*?)</a>'  
  51.         title = re.findall(res_title,obj,re.S|re.M)  
  52.         for t in title:  
  53.             print unicode('Title: ' + t,'utf-8')    
  54.             fileurl.write('Title: ' + t +'\n')  
  55.   
  56.   
  57.         #**************************************************   
  58.         #第二步 遍历具体资源的内容及评论   
  59.         #http://download.csdn.net/detail/eastmount/8785591  
  60.         #**************************************************  
  61.   
  62.         #定位指定结构化信息盒Infobox  
  63.         resources = urllib.urlopen(url_load).read()  
  64.         open('resource.html','w+').write(resources)  
  65.         start_res=resources.find(r'<div class="wraper-info">')    
  66.         end_res=resources.find(r'<div class="enter-link">')  
  67.         infobox=resources[start_res:end_res]  
  68.   
  69.         #获取资源积分、下载次数、资源类型、资源大小(前4个<span></span>)  
  70.         res_span = r'<span>(.*?)</span>'    
  71.         m_span = re.findall(res_span,infobox,re.S|re.M)  
  72.         print '资源积分: '+m_span[0]  
  73.         fileurl.write('资源积分: ' + m_span[0] +'\n')  
  74.         print '下载次数: '+m_span[1]  
  75.         fileurl.write('下载次数: ' + m_span[1] +'\n')  
  76.         print '资源类型: '+m_span[2]  
  77.         fileurl.write('资源类型: ' + m_span[2] +'\n')  
  78.         print '资源大小: '+m_span[3]  
  79.         fileurl.write('资源大小: ' + m_span[3] +'\n')  
  80.   
  81.   
  82.         #**************************************************  
  83.         #第三步 如何获取评论  
  84.         #http://jeanphix.me/Ghost.py/  
  85.         #http://segmentfault.com/q/1010000000143340  
  86.         #http://casperjs.org/  
  87.         #**************************************************  
  88.        
  89.   
  90.     else:  
  91.         fileurl.write('******************************************\n\n')  
  92.         print '******************************************\n'  
  93.         print 'Load Next List\n'  
  94.         number = number+1 #列表加1  
  95. #退出所有循环  
  96. else:  
  97.     fileurl.close()  

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


        比如现在爬取郭霖大神的资源信息,其中页面链接如下:(共7页)
              http://download.csdn.net/user/sinyu890807/uploads/1
              http://download.csdn.net/user/sinyu890807/uploads/7
        简单修改Python源代码URL后,下载页面如下图所示:



        运行结果如下图所示:



HTML分析
       
首先,获取每列中的所有资源的URL和标题,通过分析源代码。


  1. <dt>  
  2.    <div class="icon"><img src="/images/minetype/rar.gif" title="rar文件"></div>  
  3.    <div class="btns"></div>    
  4.    <h3><a href="/detail/eastmount/8772951">  
  5.           MFC 图像处理之几何运算 图像平移旋转缩放镜像(源码)</a>  
  6.        <span class="points">0</span>  
  7.    </h3>  
  8. </dt>             
  9. <dd class="meta">上传者:  
  10.     <a class="user_name" href="/user/eastmount">eastmount</a>  
  11.          | 上传时间:2015-06-04  
  12.          | 下载26次  
  13. </dd>  
  14. <dd class="intro">  
  15.         该资源主要参考我的博客【数字图像处理】六.MFC空间几何变换之图像平移、镜像、旋转  
  16.         缩放详解,主要讲述基于VC++6.0 MFC图像处理的应用知识,要通过MFC单文档视图实现显  
  17.         示BMP图片。  
  18. </dd>  
  19. <dd class="tag">  
  20.      <a href="/tag/MFC">MFC</a>  
  21.      <a href="/tag/%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86">图像处理</a><  
  22. </dd>  
        对应的HTML显示如下图所示:



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


        对应审查元素的信息如下所示,获取<span>0分</span>即可:


        最后我想做的事获取评论信息,但是它是通过JS实现的:


  1. <div class="section-list panel panel-default">  
  2.    <div class="panel-heading">  
  3.       <h3 class="panel-title">资源评论</h3>  
  4.    </div>  
  5.    <!-- recommand -->  
  6.    <script language='JavaScript' defer type='text/javascript'           
  7.   
  8. src='/js/comment.js'></script>  
  9.    <div class="recommand download_comment panel-body" sourceid="8772951"></div>  
  10. </div>  
        显示的JS页面部分如下:

  1. var base_url= (window.location.host.substring(0,5)=='local') ? 'http://local.downloadv3.csdn.net' : 'http://download.csdn.net';  
  2. base_url = "";  
  3. $(document).ready(function(){  
  4.       
  5.     CC_Comment.initConfig();  
  6.     CC_Comment.getContent(1);  
  7. });   
  8. var CC_Comment =   
  9. {  
  10.     sourceid:0,  
  11.     initConfig:function()  
  12.     {  
  13.         var sid = parseInt($(".download_comment").attr('sourceid'));  
  14.         if(isNaN(sid) || sid<=0)  
  15.         {  
  16.             this.sourceid = 0;  
  17.         }else  
  18.         {  
  19.             this.sourceid = sid;  
  20.         }  
  21.           
  22.     }  
  23. ....  
  24. }  

        最后希望文章对你有所帮助吧!下一篇准备分析下Python如何获取JS的评论信息,同时该篇文章可以给你提供一种简单的人工分析页面的例子;也可以获取某个人CSDN资源下载多、分数高的给你挑选。基础知识,仅供参考~
      (By:Eastmount 2015-7-21 下午5点   http://blog.csdn.net/eastmount/