網頁內容的解析能夠說是爬蟲最主要和最核心的工做,從一堆看似雜亂的代碼中獲取咱們須要的信息,這就是爬蟲的本質。html
python對於網頁解析提供了不少的方式,傳統的即經過urllib2包獲取網頁代碼,再經過re正則表達式模塊本身寫規則來獲取信息。python
第三方的包也有,相似pyquery、lxml、BeautifulSoup。正則表達式
對於單個頁面的抓取來講,上面的3個包都是很適合的,特別是BeautifulSoup,這個包很是的方便,使用期間也很簡單。數組
可是scrapy並無直接使用上面的3個包,而是選擇本身封裝了一層,提供了一個類Selectors,採用XPath的工做原理。scrapy
scrapy本身封裝網頁處理包的緣由是由於第三方的包,相似BeautifulSoup,在處理大量的網頁時效率不高,scrapy主要是基於大規模頁面的爬蟲處理方案,ide
用 scrapy,咱們能夠本身寫一個相似百度、360蜘蛛的爬蟲,只不過爬行的範圍沒有那麼廣而已。url
而Selectors則是針對這個目的開發出來的,下面就其使用方法作一個簡單的演示。spa
這裏有一段html代碼,算是比較標準的,以下:視頻
<div class="mainbox"> <div class="hdmenu"> <ul> <li class="s"><a href="http://finance.eastmoney.com/">財經</a></li> <li><a href="http://stock.eastmoney.com/">股票</a></li> <li><a href="http://stock.eastmoney.com/newstock.html">新股</a></li> <li><a href="http://stock.eastmoney.com/gzqh.html">期指</a></li> <li><a href="http://stock.eastmoney.com/chuangyeban.html">創業板</a></li> <li><a href="http://quote.eastmoney.com/" class="red">行情</a></li> <li><a href="http://data.eastmoney.com/">數據</a></li> <li><a href="http://stock.eastmoney.com/global.html">全球</a></li> <li><a href="http://hk.eastmoney.com/">港股</a></li> <li><a href="http://futures.eastmoney.com/">期貨</a></li> <li><a href="http://forex.eastmoney.com/">外匯</a></li> <li><a href="http://gold.eastmoney.com/">黃金</a></li> <li><a href="http://fund.eastmoney.com/">基金</a></li> <li><a href="http://money.eastmoney.com/">理財</a></li> <li><a href="http://bank.eastmoney.com/">銀行</a></li> <li><a href="http://insurance.eastmoney.com/">保險</a></li> <li><a href="http://bond.eastmoney.com/" target="_blank">債券</a></li> <li><a href="http://video.eastmoney.com/">視頻</a></li> <li><a href="http://guba.eastmoney.com/">股吧</a></li> <li><a href="http://fund2.eastmoney.com/">基金吧</a></li> <li><a href="http://blog.eastmoney.com/">博客</a></li> <li><a href="http://t.eastmoney.com/">財迷</a></li> <li><a href="http://so.eastmoney.com/" target="_blank">搜索</a></li> </ul> </div> </div>
這段代碼從內到外,有2個div標籤,1個ul標籤,正常狀況下,若是咱們要獲取ul標籤的內容,能夠用以下的方式:xml
sel = HtmlXPathSelector(response) #response即爲上面代碼的網頁相應 ul = sel.select('//ul')
可是,由於一個大的網頁裏面有不止一個ul,爲了特別取這個類別的ul,咱們須要把外面一層的div標記加上,這樣就成了:
sel = HtmlXPathSelector(response) #response即爲上面代碼的網頁相應 ul = sel.select('//div[@class="hdmenu"]/ul')
上面的代碼執行後,實際上ul即爲:
<ul> <li class="s"><a href="http://finance.eastmoney.com/">財經</a></li> <li><a href="http://stock.eastmoney.com/">股票</a></li> <li><a href="http://stock.eastmoney.com/newstock.html">新股</a></li> <li><a href="http://stock.eastmoney.com/gzqh.html">期指</a></li> <li><a href="http://stock.eastmoney.com/chuangyeban.html">創業板</a></li> <li><a href="http://quote.eastmoney.com/" class="red">行情</a></li> <li><a href="http://data.eastmoney.com/">數據</a></li> <li><a href="http://stock.eastmoney.com/global.html">全球</a></li> <li><a href="http://hk.eastmoney.com/">港股</a></li> <li><a href="http://futures.eastmoney.com/">期貨</a></li> <li><a href="http://forex.eastmoney.com/">外匯</a></li> <li><a href="http://gold.eastmoney.com/">黃金</a></li> <li><a href="http://fund.eastmoney.com/">基金</a></li> <li><a href="http://money.eastmoney.com/">理財</a></li> <li><a href="http://bank.eastmoney.com/">銀行</a></li> <li><a href="http://insurance.eastmoney.com/">保險</a></li> <li><a href="http://bond.eastmoney.com/" target="_blank">債券</a></li> <li><a href="http://video.eastmoney.com/">視頻</a></li> <li><a href="http://guba.eastmoney.com/">股吧</a></li> <li><a href="http://fund2.eastmoney.com/">基金吧</a></li> <li><a href="http://blog.eastmoney.com/">博客</a></li> <li><a href="http://t.eastmoney.com/">財迷</a></li> <li><a href="http://so.eastmoney.com/" target="_blank">搜索</a></li>
</ul>
若是咱們要獲取ul裏面的li列別,便可定義一個變量li,以下:
li = ul.select('//li')
若是咱們是要獲取這個特殊的li: <li class="s"><a href="http://finance.eastmoney.com/">財經</a></li>
咱們能夠這樣寫
li = ul.select('//li[@class="s"])
綜括號[]裏面的@xxx="xxx",即爲過濾條件。
咱們若是要獲取單個li的文本(即位於<>以外的部分),能夠這樣寫:
li = ul.select('//li') for lli in li: text = lli.select('a/text()').extract()[0]
這裏的'a/text()'表示取<a xxx>後面的文本,即text()。
extract方法用於抽取數據,後面跟一個[0]是由於extract方法返回一個數組的結果集,[0]爲取其中第一個元素。
若是咱們要獲取a href="xxxx"這個後面的連接怎麼辦呢?
能夠這樣寫:
li = ul.select('//li') for lli in li: text = lli.select('a/@href').extract()[0]
這裏a/的後面跟@href即表示在本層次內繼續向右查找href,而後獲取後面的值。
上面即爲Selectors的一些基本用法,其實主要就是從外到內,經過標記外部標籤的類名來定位咱們所須要的信息。