scrapy爬蟲2--Selector篇

網頁內容的解析能夠說是爬蟲最主要和最核心的工做,從一堆看似雜亂的代碼中獲取咱們須要的信息,這就是爬蟲的本質。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的一些基本用法,其實主要就是從外到內,經過標記外部標籤的類名來定位咱們所須要的信息。

相關文章