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的一些基本用法,其实主要就是从外到内,经过标记外部标签的类名来定位咱们所须要的信息。

相关文章