300
gooseeker集搜客
API例子:用Python驅動Firefox采集網頁數據
1,引言
本文講解怎樣用Python驅動Firefox瀏覽器寫一個簡易的網頁數據采集器。開源Python即時網絡爬蟲項目將與Scrapy(基於twisted的異步網絡框架)集成,所以本例將使用Scrapy采集淘寶這種含有大量ajax代碼的網頁數據,但是要注意本例一個嚴重缺陷:用Selenium加載網頁的過程發生在Spider中,破壞了Scrapy的架構原則。所以,本例隻是為了測試Firefox驅動和ajax網頁數據采集這兩個技術點,用於正式運行環境中必須予以修改,後續的文章將專門講解修正後的實現。
請注意,本例用到的xslt文件是通過MS謀數台保存提取器後,通過API接口獲得,一方麵讓python代碼變得簡潔,另一方麵,節省調試采集規則的時間。詳細操作請查看Python即時網絡爬蟲:API說明。
2,具體實現
2.1,環境準備
需要執行以下步驟,準備Python開發和運行環境:
- 安裝Python--官網下載安裝並部署好環境變量 (本文使用Python版本為3.5.1)
- 安裝lxml-- 官網庫下載對應版本的.whl文件,然後命令行界麵執行 "pip install .whl文件路徑"
- 安裝Scrapy--命令行界麵執行 "pip install Scrapy",詳細請參考Scrapy:Python3下的第一次運行測試
- 安裝selenium--命令行界麵執行 "pip install selenium"
- 安裝Firefox--官網下載安裝
上述步驟展示了兩種安裝:1,安裝下載到本地的wheel包;2,用Python安裝管理器執行遠程下載和安裝。
2.2,開發和測試過程
以下代碼默認都是在命令行界麵執行
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 集搜客(https://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 = "https://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,相關文檔
- Python即時網絡爬蟲:API說明
- API例子:用Java/JavaScript下載內容提取器
5,集搜客GooSeeker開源代碼下載源
- GooSeeker開源Python網絡爬蟲GitHub源
6,文檔修改曆史
- 2016-06-23:V1.0
- 2016-06-23:V1.1,在第一段明顯位置注明本案例的缺陷
若有疑問可以或
最後更新:2017-01-09 14:08:09