[Python爬蟲] Selenium+Phantomjs動態獲取CSDN下載資源信息和評論

        前面幾篇文章介紹了Selenium、PhantomJS的基礎知識及安裝過程,這篇文章是一篇應用。經過Selenium調用Phantomjs獲取CSDN下載資源的信息,最重要的是動態獲取資源的評論,它是經過JavaScript動態加載的,故經過Phantomjs模擬瀏覽器加載獲取。
        但願該篇基礎性文章對你有所幫助,若是有錯誤或不足之處,請海涵~
        [Python爬蟲] 在Windows下安裝PhantomJS和CasperJS及入門介紹(上)
        [Python爬蟲] 在Windows下安裝PIP+Phantomjs+Selenium
        [Python爬蟲] Selenium自動訪問Firefox和Chrome並實現搜索截圖
        [Python爬蟲] Selenium實現自動登陸163郵箱和Locating Elements介紹

javascript

源代碼

 1 # coding=utf-8  
 2   
 3 from selenium import webdriver  
 4 from selenium.webdriver.common.keys import Keys  
 5 import selenium.webdriver.support.ui as ui  
 6 from selenium.webdriver.common.action_chains import ActionChains  
 7 import time      
 8 import re      
 9 import os  
10   
11 #打開Firefox瀏覽器 設定等待加載時間 訪問URL  
12 driver = webdriver.PhantomJS(executable_path="G:\phantomjs-1.9.1-windows\phantomjs.exe")  
13 driver_detail = webdriver.PhantomJS(executable_path="G:\phantomjs-1.9.1-windows\phantomjs.exe")  
14 wait = ui.WebDriverWait(driver,10)  
15 driver.get("http://download.csdn.net/user/eastmount/uploads")  
16 SUMRESOURCES = 0 #全局變量 記錄資源總數(儘可能避免)  
17   
18   
19 #獲取列表頁數 <div class="page_nav>共46個 共8頁..</div>  def getPage():      number = 0      wait.until(lambda driver: driver.find_element_by_xpath("//div[@class='page_nav']"))  
20     texts = driver.find_element_by_xpath("//div[@class='page_nav']").text  
21     print texts  
22     m = re.findall(r'(\w*[0-9]+)\w*',texts) #正則表達式尋找數字  
23     print '頁數:' + str(m[1])  
24     return int(m[1])  
25   
26   
27 #獲取URL和文章標題   
28 def getURL_Title(num):  
29     global SUMRESOURCES  
30     url = 'http://download.csdn.net/user/eastmount/uploads/' + str(num)  
31     print unicode('下載列表URL: ' + url,'utf-8')  
32     ''''' 
33     ' 等待最下面頁面加載成功 獲取URL和標題 
34     ' 源碼 
35     ' <div class='list-container mb-bg'> 
36     '     <dl> 
37     '        <dt> 
38     '           <div class="icon"><img src="xxx"></img></div> 
39     '           <h3><a href="/detail/eastmount/8757243">MFC顯示BMP圖片</a></h3> 
40     '        </dt> 
41     '     </dl> 
42     ' </div> 
43     ' get_attribute('href')獲取URL且自動補齊 
44     ' unicode防止報錯 - s.encode('utf8')unicode轉換成utf8編碼 decode表示utf8轉換成unicode 
45     '''  
46     driver.get(url)  
47     wait.until(lambda driver: driver.find_element_by_xpath("//div[@class='page_nav']"))  
48     list_container = driver.find_elements_by_xpath("//div[@class='list-container mb-bg']/dl/dt/h3/a") 
49     for title in list_container:  
50         print 'Num' + str(SUMRESOURCES +1)  
51         print u'標題: ' + title.text  
52         print u'連接: ' + title.get_attribute('href')  
53         SUMRESOURCES = SUMRESOURCES +1  
54         #  
55         #獲取具體內容和評論  
56         getDetails( str(title.get_attribute('href')) )  
57     else:  
58         print ' ' #換行  
59           
60   
61 #獲取詳細信息 因前定義的driver正在使用中 故調用driver_detail  
62 #不然報錯 Message: Error Message => 'Element does not exist in cache'  
63 def getDetails(url):  
64     #獲取infobox  
65     driver_detail.get(url)  
66     details = driver_detail.find_element_by_xpath("//div[@class='info']").text  
67     print details  
68     #加載評論 <dl><dt></dt><dd></dd></dl>  
69     comments = driver_detail.find_elements_by_xpath("//dl[@class='recom_list']/dd")  
70     for com in comments:  
71         print u'評論:' + com.text  
72     else:  
73         print ' ' #換行  
74        
75   
76 #主函數  
77 def main():  
78     start = time.clock()  
79     pageNum = getPage()  
80     i=1  
81     #循環獲取標題和URL  
82     while(i<=pageNum):  
83         getURL_Title(i)   
84         i = i + 1  
85     else:  
86         print 'SUmResouces: ' + str(SUMRESOURCES)  
87         print 'Load Over'  
88     end = time.clock()  
89     print "Time: %f s" % (end - start)  
90           
91 main()  

 

 

代碼實現步驟

        1.首先獲取頁面總數,經過getPage()函數實現;
        2.每一個頁面有一列資源,經過driver的find_element_by_xpath()路徑獲取標題和get_attribute('href')函數獲取URL,它會自動補齊連接;
        3.根據步驟2獲取資源的URL,去到具體資源獲取消息框和評論信息;
        4.因爲採用Phantomjs無界面瀏覽器加載頁面,故獲取class=info和recom_list的div便可。

java

運行結果

        運行結果以下圖所示:web





程序分析

        首先獲取以下圖所示的頁面總數,此時爲「8」頁。它經過以下代碼實現:
        texts = driver.find_element_by_xpath("//div[@class='page_nav']").text
        而後再while(i<=8)依次遍歷每頁的資源,每頁資源的URL連接爲:
        http://download.csdn.net/user/eastmount/uploads/8



        再獲取每頁全部資源的標題及URL,經過代碼以下:正則表達式

1 list_container = driver.find_elements_by_xpath("//div[@class='list-container mb-bg']/dl/dt/h3/a")  
2 for title in list_container:  
3     print 'Num' + str(SUMRESOURCES +1)  
4     print u'標題: ' + title.text  
5     print u'連接: ' + title.get_attribute('href')  

        其中對應的源碼以下所示,經過獲取find_elements_by_xpath()獲取多個元素,其div的class='list-container mb-bg',同時路徑爲<div><dl><dt><h3><a>便可。同時自動補齊URL,如:
        <a href='/detail/eastmount/6917799'會添加「http://download.csdn.net/」。

windows



        最後在進入具體的資源獲取相應的消息盒InfoBox和評論信息,因爲經過模擬Phantomjs瀏覽器直接能夠顯示動態JS評論信息。

瀏覽器






        而若是經過BeautifulSoup只能獲取的HTML源碼以下,並無JS信息。由於它是動態加載的,這就體現了Phantomjs的優點。而經過Chrome或FireFox瀏覽器審查元素能查看具體的評論div,這也是模擬瀏覽器的用處所在吧!
        可對比前面寫過的文章:[Python學習] 簡單爬取CSDN下載資源信息

函數

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

 

總結

        這篇文章主要講述經過Selenium和Phantomjs獲取CSDN下載資源信息的過程,其中因爲driver調用Chrome或FireFox瀏覽器總會有額外空間增長,故調用Phantomjs無界面瀏覽器完成。同時有幾個問題:
            1.如何避免Phantomjs的黑框彈出;
            2.程序的運行時間比較低,響應時間較慢,如何提升?
        接下來若是有機會準備嘗試的內容包括:
            1.下載百度百科的旅遊地點InfoBox(畢設知識圖譜挖掘);
            2.如何爬取搜狐圖片的動態加載圖片,完成智能爬圖工具;
            3.當須要自動登陸時driver訪問Chrome或FireFox瀏覽器發送消息。
        最後但願文章對你有所幫助吧!若是有錯誤或不足之處,還請海涵~
      (By:Eastmount 2015-8-24 深夜2點半   http://blog.csdn.net/eastmount/
        工具

相關文章
相關標籤/搜索