scrapy框架的學習,目前我的以爲比較詳盡的資料主要有兩個:css
1.官方教程文檔、scrapy的github wiki;html
2.一個很好的scrapy中文文檔:http://scrapy-chs.readthedocs.org/zh_CN/0.24/index.html;node
剩下的就是網上其餘的一些demo。python
仍是先上個圖吧,這個圖幾乎在網上一搜scrapy隨處可見,其實它很好地反應了這個框架的運做流程及各個組件之間交互的過程。mysql
scrapy之因此能做爲框架,是由於其抽取了普通爬蟲的共同特徵和基本原理並加以封裝,有沒有發現其實咱們以前寫的各類爬蟲,原理其實都大同小異?什麼抓頁面、存儲、解析頁面、提取特徵信息……爬蟲就這麼幾個步驟,固然工業界的爬蟲可能還要考慮更多好比爬蟲效率、穩定性、分佈式爬蟲協調、兼容、信息清洗判重、數據結構化存儲等等。通常程序員的習慣是在寫過程序以後總想着重構一下,抽出一些公共的方法將其模板化,下次再用時就方便了。是的,你固然能夠將本身寫過的代碼重構,可是這些工做早就有人幫作好了,直接拿來用甚至還比你本身寫的要方便:「scrapy是一套基於Twisted的異步處理框架,是純python實現的爬蟲框架,用戶只須要定製開發幾個模塊就能夠輕鬆的實現一個爬蟲」。而且其優秀的思想也是值得借鑑的——入門階段:學會怎麼使用scrapy,調用其接口能完成一個爬蟲的功能;提升階段:研究scrapy的源碼也頗有必要,看看一個優秀的爬蟲框架是怎麼寫的。linux
scrapy的幾個組件:git
(1) Scrapy Engine(引擎):總體驅動數據流和控制流,觸發事務處理。程序員
(2) Scheduler(調度):維護一個引擎與其交互的請求隊列,引擎發出請求後返還給它們。github
(3) Downloader(下載器):下載網頁,將網頁給蜘蛛Spider.正則表達式
(4) Spider(蜘蛛):這個是核心,一個蜘蛛能處理一個域名或一組域名,做用是定義特定網站的抓取和解析規則。定義對於不一樣網頁結構,處理的方式也不同,須要定義不一樣的蜘蛛。
蜘蛛抓取流程:
(5) Item Pipeline(項目管道):處理蜘蛛解析事後的數據結果,清洗、驗證、存儲數據,存放給item字段field。
(6) Downloader middlewares(下載器中間件):引擎與下載器之間的鉤子框架,處理引擎與下載器之間的請求/響應。能夠自定義代碼來擴展scrapy。
(7) Spider middlewares(蜘蛛中間件):引擎與蜘蛛之間的鉤子框架,處理蜘蛛的響應輸入/請求輸出。能夠自定義代碼來擴展scrapy。
(8) Scheduler middlewares(調度中間件):引擎與調度之間的中間件,處理引擎與調度的請求/響應。能夠自定義代碼來擴展scrapy。
搭建scrapy框架須要的幾個模塊:python2.7.6, pywin32, twisted(zope.interface + pyOpenSSL + twisted),lxml, scrapy(安裝以前要安裝easytool)
(1) 安裝python 2.7:官網下載安裝包,雙擊運行,最後須要將python安裝目錄添加到系統變量裏,而後才能在控制檯進入python shell。
(2) 安裝pywin32:注意對應python版本,下載地址:http://sourceforge.net/projects/pywin32/files/,或者點擊這裏下載。
(3) 安裝twisted
依賴幾個包:
(4) 安裝lxml:https://pypi.python.org/pypi/lxml/,或者點擊這裏下載,安裝後在cmd進入python shell,若是」import lxml」沒有問題說明安裝成功。
(5) 安裝scrapy:
能夠按照這裏的方法安裝:(轉載http://www.cnblogs.com/HelloPython/)
第一步:爲了安裝這個packages,在ubuntu下運行lsb_release -cs,顯示
第二步:如今須要作的就是用vi添加deb http://archive.scrapy.org/ubuntu precise main 到 /etc/apt/sources.list中去
第三步:而後運行 curl -s http://archive.scrapy.org/ubuntu/archive.key | sudo apt-key add-
第四步:再更新源sudo apt-get update
第五步:最後安裝 sudo apt-get install scrapy-0.1X,可選擇不一樣版本,我安裝的是0.16
設定項目名稱爲mytest,cd到須要建立項目的目錄:scrapy startproject mytest,會自動生成目錄結構,以下:
mytest/ scrapy.cfg #-------------------項目配置文件 mytest/ __init__.py items.py #-------項目數據字段文件 pipelines.py #-------項目管道文件 settings.py #---------項目配置文件 spiders/ #----------項目存放蜘蛛的目錄 __init__.py ...
(1) item.py:項目數據字段文件,定義須要的數據段,這些字段即爲爬取下來數據中提取的,能夠經過定義Item類實現。
from scrapy.item import Item, Field class MyItem(Item): userid = Field() username = Field() tweeted = Field() time = Field()
(2) spider.py:用戶自定義蜘蛛,其中:
from scrapy.spider import BaseSpider class MySpider(BaseSpider): name = "myspider" allowed_domains = ["sina.com"] start_urls = ["http://www.sina.com", "http://www.sina.com/news" ] def parse(self, response): #--------------------這就是callback回調函數 filename = response.url.split("/")[-2] open(filename, 'wb').write(response.body)
(3) pipeline.py:管道文件,接收item各字段對應數據,放到數據庫mongodb或mysqldb
(4) setting.py:配置信息
(1) 選擇器的四個基本方法
xpath():返回一個選擇器列表,每一個表明xpath選擇的,當於正則解析。
css():返回一選擇器列表,每一個表明css選擇的。
extract():返回一個unicode字符串。
re():返回一個unicode字符串從正則表達式中選出的。
(2) 幾個xpath例子
/html/head/title: 選擇全部<head>標籤內部的<title>標籤內容
/html/head/title/text(): 選擇全部的位於<title>標籤內部的<text>標籤(文本)內容
//td: 選擇全部的<td>元素
//div[@class="mine"]: 選擇全部包含class=」mine「屬性的div標籤元素
(3) xpath路徑表達式:
表達式 |
描述 |
nodename |
選取此節點的全部子節點 |
/ |
從根節點選取 |
// |
從匹配選擇的當前節點選擇文檔中的節點,不考慮它們的位置 |
. |
選取當前節點 |
.. |
選取當前節點的父節點 |
@ |
選取屬性 |
關於選擇器,這個再下一篇python系列五當中會提到具體實例應用,這裏暫且先寫到這裏。
原創文章,轉載請註明出處http://blog.csdn.net/dianacody/article/details/39743379