前面幾篇文章介紹了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
再獲取每頁全部資源的標題及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/)
工具