码迷,mamicode.com
首页 > 其他好文 > 详细

scrapy爬虫2--Selector篇

时间:2015-02-15 18:03:18      阅读:270      评论:0      收藏:0      [点我收藏+]

标签:

网页内容的解析可以说是爬虫最主要和最核心的工作,从一堆看似杂乱的代码中获取我们需要的信息,这就是爬虫的本质。

python对于网页解析提供了很多的方式,传统的即通过urllib2包获取网页代码,再通过re正则表达式模块自己写规则来获取信息。

第三方的包也有,类似pyquery、lxml、BeautifulSoup。

对于单个页面的抓取来说,上面的3个包都是很适合的,特别是BeautifulSoup,这个包非常的方便,使用期间也很简单。

但是scrapy并没有直接使用上面的3个包,而是选择自己封装了一层,提供了一个类Selectors,采用XPath的工作原理。

scrapy自己封装网页处理包的原因是因为第三方的包,类似BeautifulSoup,在处理大量的网页时效率不高,scrapy主要是基于大规模页面的爬虫处理方案,

用 scrapy,我们可以自己写一个类似百度、360蜘蛛的爬虫,只不过爬行的范围没有那么广而已。

而Selectors则是针对这个目的开发出来的,下面就其使用方法做一个简单的演示。

 

这里有一段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标签的内容,可以用如下的方式:

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

 

scrapy爬虫2--Selector篇

标签:

原文地址:http://www.cnblogs.com/oracleblog/p/4292955.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!