####1,引言####html
本文講解怎樣用Python驅動Firefox瀏覽器寫一個簡易的網頁數據採集器。開源Python即時網絡爬蟲項目將與Scrapy(基於twisted的異步網絡框架)集成,因此本例將使用Scrapy採集淘寶這種含有大量ajax代碼的網頁數據,可是要注意本例一個嚴重缺陷:用Selenium加載網頁的過程發生在Spider中,破壞了Scrapy的架構原則。因此,本例只是爲了測試Firefox驅動和ajax網頁數據採集這兩個技術點,用於正式運行環境中必須予以修改,後續的文章將專門講解修正後的實現。python
請注意,本例用到的xslt文件是經過MS謀數臺保存提取器後,經過API接口得到,一方面讓python代碼變得簡潔,另外一方面,節省調試採集規則的時間。詳細操做請查看Python即時網絡爬蟲:API說明git
####2,具體實現####github
2.1,環境準備web
須要執行如下步驟,準備Python開發和運行環境:ajax
2.2,開發和測試過程api
如下代碼默認都是在命令行界面執行瀏覽器
1),建立scrapy爬蟲項目simpleSpider網絡
E:\python-3.5.1>scrapy startproject simpleSpider
2),修改settings.py配置架構
有些網站會在根目錄下放置一個名字爲robots.txt的文件,裏面聲明瞭此網站但願爬蟲遵照的規範,Scrapy默認遵照這個文件制定的規範,即ROBOTSTXT_OBEY默認值爲True。在這裏須要修改ROBOTSTXT_OBEY的值,找到E:\python-3.5.1\simpleSpider\simpleSpider下文件settings.py,更改ROBOTSTXT_OBEY的值爲False。
3),導入API模塊
在項目目錄E:\python-3.5.1\simpleSpider下建立文件gooseeker.py(也能夠在開源Python即時網絡爬蟲GitHub源 的core文件夾中直接下載),代碼以下:
#!/usr/bin/python # -*- coding: utf-8 -*- # 模塊名: gooseeker # 類名: GsExtractor # Version: 2.0 # 說明: html內容提取器 # 功能: 使用xslt做爲模板,快速提取HTML DOM中的內容。 # released by 集搜客(http://www.gooseeker.com) on May 18, 2016 # github: https://github.com/FullerHua/jisou/core/gooseeker.py from urllib import request from urllib.parse import quote from lxml import etree import time class GsExtractor(object): def _init_(self): self.xslt = "" # 從文件讀取xslt def setXsltFromFile(self , xsltFilePath): file = open(xsltFilePath , 'r' , encoding='UTF-8') try: self.xslt = file.read() finally: file.close() # 從字符串得到xslt def setXsltFromMem(self , xsltStr): self.xslt = xsltStr # 經過GooSeeker API接口得到xslt def setXsltFromAPI(self , APIKey , theme, middle=None, bname=None): apiurl = "http://www.gooseeker.com/api/getextractor?key="+ APIKey +"&theme="+quote(theme) if (middle): apiurl = apiurl + "&middle="+quote(middle) if (bname): apiurl = apiurl + "&bname="+quote(bname) apiconn = request.urlopen(apiurl) self.xslt = apiconn.read() # 返回當前xslt def getXslt(self): return self.xslt # 提取方法,入參是一個HTML DOM對象,返回是提取結果 def extract(self , html): xslt_root = etree.XML(self.xslt) transform = etree.XSLT(xslt_root) result_tree = transform(html) return result_tree
4),建立SimpleSpider爬蟲類
在項目目錄E:\python-3.5.1\simpleSpider\simpleSpider\spiders下建立文件simplespider.py,代碼以下:
# -*- coding: utf-8 -*- import time import scrapy from lxml import etree from selenium import webdriver from gooseeker import GsExtractor class SimpleSpider(scrapy.Spider): name = "simplespider" allowed_domains = ["taobao.com"] start_urls = [ "https://item.taobao.com/item.htm?spm=a230r.1.14.197.e2vSMY&id=44543058134&ns=1&abbucket=10" ] def __init__(self): # use any browser you wish self.browser = webdriver.Firefox() def getTime(self): # 得到當前時間戳 current_time = str(time.time()) m = current_time.find('.') current_time = current_time[0:m] return current_time def parse(self, response): print("start...") #start browser self.browser.get(response.url) #loading time interval time.sleep(3) #get xslt extra = GsExtractor() extra.setXsltFromAPI("API KEY" , "淘寶天貓_商品詳情30474") # get doc html = self.browser.execute_script("return document.documentElement.outerHTML"); doc = etree.HTML(html) result = extra.extract(doc) # out file file_name = 'F:/temp/淘寶天貓_商品詳情30474_' + self.getTime() + '.xml' open(file_name,"wb").write(result) self.browser.close() print("end")
5),啓動爬蟲
在E:\python-3.5.1\simpleSpider項目目錄下執行命令
E:\python-3.5.1\simpleSpider>scrapy crawl simplespider
6),輸出文件
採集到的網頁數據結果文件是:淘寶天貓_商品詳情30474_1466064544.xml
####3,展望####
調用Firefox,IE等全特性瀏覽器顯得有點過重量級,不少場合能夠考慮輕量級的瀏覽器內核,好比,casperjs和phantomjs等。同時運行在沒有界面的瀏覽器(headless browser,無頭瀏覽器)模式下,也許能夠對網頁數據採集性能有所提高。
而後,最重要的一點是要寫一個 Scrapy 的下載器,專門驅動這些瀏覽器採集網頁數據,也就是把這個功能從Spider中遷移出來,這樣才符合Scrapy的總體框架原則,實現事件驅動的工做模式。
####4,相關文檔####
####5,集搜客GooSeeker開源代碼下載源####
####6,文檔修改歷史####