註釋:上一篇《Python爬蟲實戰(3):安居客房產經紀人信息採集》,訪問的網頁是靜態網頁,有朋友模仿那個實戰來採集動態加載豆瓣小組的網頁,結果不成功。本篇是針對動態網頁的數據採集編程實戰。html
Python開源網絡爬蟲項目啓動之初,咱們就把網絡爬蟲分紅兩類:即時爬蟲和收割式網絡爬蟲。爲了適應各類應用場景,GooSeeker的整個網絡爬蟲產品線包含了四類產品,以下圖所示:
python
本實戰是上圖中的「獨立python爬蟲」的一個實例,以採集豆瓣小組討論話題(https://www.douban.com/group/haixiuzu/discussion?start=0 )信息爲例,記錄整個採集流程,包括python和依賴庫的安裝,即使是python初學者,也能夠跟着文章內容成功地完成運行。git
運行環境:Windows10github
官網下載連接: https://www.python.org/ftp/python/3.5.2/python-3.5.2.exeweb
下載完成後,雙擊安裝。編程
這個版本會自動安裝pip和setuptools,方便安裝其它的庫segmentfault
Lxml官網地址: http://lxml.de/windows
Windows版安裝包下載: http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxmlapi
對應windows下python3.5的安裝文件爲 lxml-3.6.0-cp35-cp35m-win32.whl網絡
下載完成後,在windows下打開一個命令窗口,,切換到剛下載的whl文件的存放目錄,運行pip install lxml-3.6.0-cp35-cp35m-win32.whl
網頁內容提取器程序是GooSeeker爲開源Python即時網絡爬蟲項目發佈的一個類,使用這個類,能夠大大減小數據採集規則的調試時間,具體參看《Python即時網絡爬蟲項目: 內容提取器的定義》
下載地址: https://github.com/FullerHua/gooseeker/blob/master/core/gooseeker.py
把gooseeker.py保存在項目目錄下
pip install selenium
把下載獲得的phantomjs-2.1.1-windows.zip解壓到本機的某個文件夾下
把解壓後的文件夾中的phantomjs.exe的完整路徑加文件名記錄下來,用來替換下面代碼的 browser = webdriver.PhantomJS(executable_path='C:\phantomjs-2.1.1-windows\bin\phantomjs.exe') 這一行中的兩個單引號之間的內容。
# _*_coding:utf8_*_ # douban.py # 爬取豆瓣小組討論話題 from urllib import request from lxml import etree from gooseeker import GsExtractor from selenium import webdriver class PhantomSpider: def getContent(self, url): browser = webdriver.PhantomJS(executable_path='C:\\phantomjs-2.1.1-windows\\bin\\phantomjs.exe') browser.get(url) time.sleep(3) html = browser.execute_script("return document.documentElement.outerHTML") output = etree.HTML(html) return output def saveContent(self, filepath, content): file_obj = open(filepath, 'w', encoding='UTF-8') file_obj.write(content) file_obj.close() doubanExtra = GsExtractor() # 下面這句調用gooseeker的api來設置xslt抓取規則 # 第一個參數是app key,請到GooSeeker會員中心申請 # 第二個參數是規則名,是經過GooSeeker的圖形化工具: 謀數臺MS 來生成的 doubanExtra.setXsltFromAPI("ffd5273e213036d812ea298922e2627b" , "豆瓣小組討論話題") url = "https://www.douban.com/group/haixiuzu/discussion?start=" totalpages = 5 doubanSpider = PhantomSpider() print("爬取開始") for pagenumber in range(1 , totalpages): currenturl = url + str((pagenumber-1)*25) print("正在爬取", currenturl) content = doubanSpider.getContent(currenturl) outputxml = doubanExtra.extract(content) outputfile = "result" + str(pagenumber) +".xml" doubanSpider.saveContent(outputfile , str(outputxml)) print("爬取結束")
運行過程以下:
將上面的代碼保存到douban.py中,和前面2.3步下載的提取器類gooseeker.py放在同一個文件夾中
打開Windows CMD窗口,切換當前目錄到存放douban.py的路徑(cd xxxxxxx)
運行 python douban.py
請注意:爲了讓源代碼更整潔,也爲了讓爬蟲程序更有通用性,抓取規則是經過api注入到內容提取器bbsExtra中的,這樣還有另一個好處:若是目標網頁結構變化了,只需經過MS謀數臺從新編輯抓取規則,而本例的網絡爬蟲代碼不用修改。爲內容提取器下載採集規則的方法參看《Python即時網絡爬蟲:API說明—下載內容提取器》。
在項目目錄下能夠看到多個result**.xml文件,文件內容以下圖所示:
由於信息採集規則是經過api下載下來的,因此,本案例的源代碼顯得十分簡潔。同時,整個程序框架變得很通用,由於最影響通用性的採集規則是從外部注入的。
2016-07-15:V1.0